我有一个采用简单日志记录过程的程序。这个想法是每天创建一个与日期相对应的新文件,除非文件已经存在,在这种情况下它只是附加到。问题是,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());
答案 0 :(得分:1)
File.AppendText可能是一个更好的选择。如果文件丢失,它将创建文件并将文本添加到结尾。如果要将标题添加到文件的开头,则只需要进行快速手动检查以查看文件是否存在。
答案 1 :(得分: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());
}
}
答案 2 :(得分: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)(如果存在),否则创建它。
答案 3 :(得分:0)
File.Create返回FileStream,因此你应该像这样使用FileStream对象:
FileStream fs = File.Create(currentLogFile);
然后使用fs对象进行所有读/写操作。