读取和写入文件C#时共享违规IOException

时间:2012-07-18 12:22:02

标签: 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();

它抛出了这个错误:

  

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.But我收到此错误,我无法理解我做错了什么。谢谢你的帮助。

4 个答案:

答案 0 :(得分:21)

好吧,您正在尝试打开文件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.txtlog_5.txt,则下一个文件将不是log_6.txt而是log_2.txt

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

可能性无穷无尽:-D

答案 1 :(得分:1)

嗯,这可能已经过时但接受的答案对我不起作用。当您尝试从单独的流中读取或写入刚刚创建的文件时,会导致此问题。解决这个问题非常简单,只需处理创建它时使用的文件流,然后就可以自由访问该文件。

if (!File.Exists(myfile))
{
    var fs = new FileStream(fav, FileMode.Create);
    fs.Dispose();
    string text = File.ReadAllText(myfile);
}

答案 2 :(得分:0)

enter image description here

         var stream = new System.IO.FileStream(filePath, System.IO.FileMode.Create);

        resizedBitmap.Compress(Bitmap.CompressFormat.Png, 200, stream); //problem here
        stream.Close();
        return resizedBitmap;

在Compress方法中,我将quality参数的值传递为200,遗憾的是它不允许0-100范围之外的值。

我将质量值改回100,问题得到解决。

答案 3 :(得分:0)

所有提议的选项都没有帮助我。但我找到了一个解决方案: 就我而言,问题出在 Anti-Virus,当大量写入文件时,Anti-Virus 开始扫描文件,此时写入文件时出现问题。