这是我的代码:
public static TextWriter twLog = null; private int fileNo = 1; private string line = null; TextReader tr = new StreamReader("file_no.txt"); TextWriter tw = new StreamWriter("file_no.txt"); line = tr.ReadLine(); if(line != null){ fileNo = int.Parse(line); twLog = new StreamWriter("log_" + line + ".txt"); }else{ twLog = new StreamWriter("log_" + fileNo.toString() + ".txt"); } System.IO.File.WriteAllText("file_no.txt",string.Empty); tw.WriteLine((fileNo++).ToString()); tr.Close(); tw.Close(); twLog.Close();
我想要做的只是打开一个带有log_x.txt名称的文件,并从file_no.txt文件中取出“x”.如果file_no.txt文件为空,则使日志文件的名称为log_1.txt,并将“fileNo 1”写入file_no.txt.A新程序启动后,新的日志文件名必须是log_2.txt.但是我收到这个错误,我不明白我做错了什么.谢谢帮忙.
解决方法
那么你试图打开文件file_no.txt来读取和写入使用单独的流.这可能无法正常工作,因为文件将被读取流锁定,因此无法创建写入流,您将获得异常.
一个解决方案是首先读取文件,关闭流,然后在增加fileNo之后写入文件.这样一来,文件只能打开一次.
FileStream fileStream = new FileStream(@"file_no.txt",FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);
即使假设您不想允许共享读取,对于this question的接受答案似乎也有很好的解决方案.
可能的替代方案
我明白你想在程序启动时创建唯一的日志文件.这样做的另一种方法是:
int logFileNo = 1; string fileName = String.Format("log_{0}.txt",logFileNo); while (File.Exists(fileName)) { logFileNo++; fileName = String.Format("log_{0}.txt",logFileNo); }
这会增加号码,直到找到日志文件不存在的文件号.缺点:如果你有log_1.txt和log_5.txt,下一个文件不会是log_6.txt,而不是log_2.txt.
为了克服这个问题,您可以使用掩码日志_ *.txt枚举目录中的所有文件,并通过执行一些字符串操作来找到最大的数字.
可能性是无止境的:–D