File.Create Throwing IOException

本文关键字:IOException Throwing Create File | 更新日期: 2023-09-27 18:28:25

我有一个程序,它采用了一个简单的日志记录过程。这个想法是,每天都会创建一个与日期对应的新文件,除非该文件已经存在,在这种情况下,它只是附加到文件中。问题是,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());    

File.Create Throwing IOException

File.AppendText可能是一个更好的选择,可以帮助您实现目标。如果文件丢失,它将创建该文件,并将文本添加到末尾。如果你想把标题添加到文件的开头,你只需要先做一个快速的手动检查,看看文件是否存在。

使用答案中的建议,我更改了代码。当第一次创建文件时,它不再抛出异常,但当有人解释为什么file.Create抛出IOException时,我会将答案标记为Accepted。

        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());
        }
    }

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)(如果存在),或者创建它(如果不存在)。

File.Create返回FileStream,所以您应该使用这样的FileStream对象:

FileStream fs = File.Create(currentLogFile);

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