读取和写入文件 C# 时发生共享冲突 IOException

2024-01-18

这是我的代码:

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

它抛出这个错误:

IOException:路径 C:\Users\Water Simulation\file_no.txt 上的共享冲突

我想做的只是打开一个名为 log_x.txt 的文件,然后从 file_no.txt 文件中取出“x”。如果 file_no.txt 文件为空,则将日志文件的名称设为 log_1.txt 并写入“fileNo + 1”到 file_no.txt。新程序启动后,新的日志文件名必须是 log_2.txt。但是我收到此错误,我不明白我做错了什么。感谢您的帮助。


嗯,您正在尝试打开该文件file_no.txt用于阅读and用于使用单独的流进行写入。这可能不起作用,因为文件将被读取流锁定,因此无法创建写入流并且您会收到异常。

一种解决方案是先读取文件,关闭流,然后在增加后写入文件fileNo。这样文件一次只打开一次。

另一种方法是创建一个用于读写访问的文件流,如下所示:

FileStream fileStream = new FileStream(@"file_no.txt", 
                                       FileMode.OpenOrCreate, 
                                       FileAccess.ReadWrite, 
                                       FileShare.None);

接受的答案这个问题 https://stackoverflow.com/questions/3817477/simultaneous-read-write-a-file-in-c-sharp似乎也有一个很好的解决方案,尽管我假设您不想允许共享读取。

可能的替代解决方案
我了解您希望在程序启动时创建唯一的日志文件。另一种方法是这样的:

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 and log_5.txt,下一个文件不会是log_6.txt but log_2.txt.

为了克服这个问题,您可以使用 mask 枚举目录中的所有文件log_*.txt并通过执行一些字符串操作找到最大的数字。

可能性是无限的:-D

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

读取和写入文件 C# 时发生共享冲突 IOException 的相关文章

随机推荐