Ozg*_*Ozg 21 c# file-io textreader textwriter
这是我的代码:
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();
Run Code Online (Sandbox Code Playgroud)
它抛出此错误:
IOException:路径C:\ Users\Water Simulation\file_no.txt上的共享冲突
我要做的只是打开一个带有log_x.txt名称的文件,并从file_no.txt文件中取出"x".如果file_no.txt文件为空,请将日志文件的名称设为log_1.txt并写入"fileNo + 1" to file_no.txt.新程序启动后,新的日志文件名必须是log_2.txt.But我收到此错误,我无法理解我做错了什么.谢谢你的帮助.
Tho*_*mar 22
好吧,您正在尝试打开文件file_no.txt以便使用单独的流进行读取和写入.这可能不起作用,因为文件将被读取流锁定,因此无法创建写入流并且您获得异常.
一种解决方案是首先读取文件,关闭流,然后在增加文件后写入文件fileNo.这样,文件一次只能打开一次.
另一种方法是为读和写访问创建一个文件流,如下所示:
FileStream fileStream = new FileStream(@"file_no.txt",
FileMode.OpenOrCreate,
FileAccess.ReadWrite,
FileShare.None);
Run Code Online (Sandbox Code Playgroud)
即使我假设你不想允许共享读取,这个问题的接受答案似乎也有一个很好的解决方案.
可能的替代解决方案
我了解您希望在程序启动时创建唯一的日志文件.另一种方法是:
int logFileNo = 1;
string fileName = String.Format("log_{0}.txt", logFileNo);
while (File.Exists(fileName))
{
logFileNo++;
fileName = String.Format("log_{0}.txt", logFileNo);
}
Run Code Online (Sandbox Code Playgroud)
这会增加数量,直到找到不存在日志文件的文件号.缺点:如果你有log_1.txt和log_5.txt,下一个文件也不会log_6.txt,但log_2.txt.
要解决这个问题,您可以使用掩码枚举目录中的所有文件,log_*.txt并通过执行一些字符串操作找到最大的数字.
可能性是无穷无尽的:-D
好吧,这可能很旧,但接受的答案对我不起作用。这是在您尝试从单独的流中读取或写入刚刚创建的文件时引起的。解决这个问题很简单,只要把你创建的文件流处理掉,就可以自由访问文件了。
if (!File.Exists(myfile))
{
var fs = new FileStream(fav, FileMode.Create);
fs.Dispose();
string text = File.ReadAllText(myfile);
}
Run Code Online (Sandbox Code Playgroud)