2

我有一个使用简单日志记录过程的程序。这个想法是每天都会创建一个与日期相对应的新文件,除非该文件已经存在,在这种情况下它只是附加到。问题是,File.Create 每次运行时都会引发错误。我找到了解决问题的方法,即 File.Create 正在打开 FileStream,您只需要使用 .close(); 调用它即可。但是该解决方案对我不起作用,我仍然收到 IO 异常,说该文件正在被另一个进程使用,这是不可能的,因为它在 File.Create 创建它之前不存在,并且没有其他使用这些文件。
这是代码:

public static void logResults(System.Reflection.MethodBase method, Results result, string message)
    {
        string date = DateTime.Now.ToString();
        int index = date.IndexOf(" ");
        string subString = date.Substring(0, index);
        string nwDate = Regex.Replace(subString, "/", "");
        logFileName = "WebsiteRegressionProduction_TestCycle." + nwDate;
        string currentLogFile = logFileLocation + @"\" + logFileName;
        StringBuilder sb = new StringBuilder();
        if (!File.Exists(currentLogFile))
        {

            File.Create(currentLogFile).Close();
            sb.Append("DATE-TIME\tACTION\tTEST CLASS\tTEST NAME\tTEST STATUS\tERROR MESSAGES");
            sb.Append("\n");
        }
        else
        {
            string previousLogs = File.ReadAllText(currentLogFile);
            sb.Append(previousLogs);
        }
        sb.Append(DateTime.Now.ToString());
        sb.Append(" : ");
        sb.Append("Text Executed: ");
        sb.Append(method.ReflectedType.Name + " : ");
        sb.Append(method + " : ");
        sb.Append(result.ToString());
        sb.Append(" : ");
        sb.Append(message);
        sb.Append("\n");
        sb.Append("\n");

        File.WriteAllText(currentLogFile, sb.ToString());    
4

4 回答 4

1

使用答案中的建议,我更改了我的代码。首次创建文件时它不再抛出异常,但是当有人可以解释为什么 File.Create 抛出 IOException 说文件已在使用中且无法访问时,我会将答案标记为已接受。

        public static void logResults(System.Reflection.MethodBase method, Results result, string message)
    {
        string date = DateTime.Now.ToString();
        int index = date.IndexOf(" ");
        string subString = date.Substring(0, index);
        string nwDate = Regex.Replace(subString, "/", "");
        logFileName = "WebsiteRegressionProduction_TestCycle." + nwDate;
        string currentLogFile = logFileLocation + @"\" + logFileName;
        if (!File.Exists(currentLogFile))
        {
            File.WriteAllText(currentLogFile,
                "DATE-TIME\tACTION\tTEST CLASS\tTEST NAME\tTEST STATUS\tERROR MESSAGES\n\n", Encoding.ASCII);
        }
        var sb = new StringBuilder();
        sb.Append(String.Format("{0} : Test Executed: {1} : {2} : {3}\n\n", DateTime.Now.ToString(),
            method.ReflectedType.Name, method, message));
        using (var stream = File.AppendText(currentLogFile))
        {
            stream.Write(sb.ToString());
        }
    }
于 2013-08-20T16:09:59.817 回答
1

File.AppendText对于您要完成的工作可能是一个更好的选择。如果文件丢失,它将创建文件并将文本添加到末尾。如果要将标题添加到文件的开头,则只需先进行快速手动检查以查看文件是否存在。

于 2013-08-20T15:26:53.543 回答
0

1)你为什么要阅读所有以前的内容来追加?2)您可以简单地使用 log4net 来“免费”完成所有工作

但是,我建议您使用流来更好地控制操作

FileStream fs = new FileStream(filePath, FileMode.Append);
            byte[] data = Encoding.ASCII.GetBytes("The string you wanna append");
            fs.Write(data, 0, data.Length);
            fs.Flush();
            fs.Close();

FileMode.Append 如果存在则在 Append 中打开指定的(filePath),如果不存在则创建它。

于 2013-08-20T15:27:34.107 回答
0

File.Create 返回 FileStream,因此您应该像这样使用 FileStream 对象:

FileStream fs = File.Create(currentLogFile);

然后使用 fs 对象进行所有读/写操作。

于 2013-08-20T15:52:31.113 回答