我的程序将数据记录到文件中,同时用户界面实时显示传入的数据。如果计算机/程序/操作系统/任何关闭,我希望记录的数据在一秒或两秒内在磁盘上。数据至少达到100次/秒。
我希望用户能够在日志记录处于活动状态时为日志文件指定新名称。问题是我无法在文件打开时更改文件的名称,即使它是通过相同的过程。
测试用例:
string fileName1 = "test.txt";
string fileName2 = "test2.txt";
using (StreamWriter sw = new StreamWriter(new FileStream(fileName1, FileMode.Create)))
{
sw.WriteLine("before");
File.Move(fileName1, fileName2); //<<-- IOException - The process cannot access the file because it is being used by another process.
w.WriteLine("after");
}
那么,如果同一进程的文件流已打开,如何从进程重命名文件?
答案 0 :(得分:3)
您应该关闭第一个流,重命名该文件,然后重新打开流:
using (StreamWriter sw = new StreamWriter(new FileStream(fileName1, FileMode.Create)))
{
sw.WriteLine("before");
sw.Close();
}
File.Move(fileName1, fileName2);
using (StreamWriter sw = new StreamWriter(new FileStream(fileName2, FileMode.Append)))
{
sw.WriteLine("after");
}
答案 1 :(得分:0)
您不能在某个进程打开文件时重命名该文件,但是如果您想从该程序的其他实例写入该文件,请执行此操作。
试试FileShare.Write。您可以在File.Open中使用它。
using (StreamWriter sw = new StreamWriter (File.Open(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
{
...
}
答案 2 :(得分:0)
每秒关闭文件100次会对您的性能产生影响,您可以登录临时文件并每隔10秒钟附加一次临时文件。那会给你你想要的。
答案 3 :(得分:0)
我知道这个答案有点晚了,可以帮助你进行移植项目,但也许会帮助别人!
如果您使用FileShare.Delete
标志打开文件,即使它仍处于打开状态,您也可以重命名该文件:)