读取和写入文件C#时共享违规IOException
这是我的代码:
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” to file_no.txt。新程序启动后,新的日志文件名必须是log_2.txt.But我收到此错误,我无法理解我做错了什么。谢谢你的帮助。
好吧,您正在尝试打开文件file_no.txt
以便使用单独的流进行读取和写入。 这可能不起作用,因为文件将被读取流锁定,因此无法创建写入流并且您获得exception。
一种解决方案是首先读取文件,关闭流然后在增加fileNo
之后写入文件。 这样,文件一次只能打开一次。
另一种方法是为读和写访问创建一个文件流,如下所示:
FileStream fileStream = new FileStream(@"file_no.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
即使我假设你不想允许共享读取, 这个问题的接受答案似乎也有一个很好的解决方案。
可能的替代方案
我知道您希望在程序启动时创建唯一的日志文件。 另一种方法是:
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
。
要解决这个问题,您可以使用mask log_*.txt
枚举目录中的所有文件,并通过执行一些字符串操作找到最大的数字。
可能性是无穷无尽的:-D
那么这可能已经过时了,但接受的答案对我不起作用。 当您尝试从单独的流中读取或写入刚刚创建的文件时,会导致此问题。 解决这个问题非常简单,只需处理创建它时使用的文件流,然后就可以自由访问该文件。
if (!File.Exists(myfile)) { var fs = new FileStream(fav, FileMode.Create); fs.Dispose(); string text = File.ReadAllText(myfile); }
在此处输入图像描述
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,问题得到解决。