重命名自己打开的文件

我的程序正在将数据logging到文件中,同时用户界面实时显示传入的数据。 我想logging的数据在一秒钟或两秒钟内如果计算机/程序/操作系统/任何closures在磁盘上。 数据至less每秒100次。

我希望用户能够给logging文件一个新的名字,而logging是活跃的。 问题是我无法改变文件的名称,即使它是由相同的进程。

testing用例:

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"); } 

那么, 我如何从一个进程重命名一个文件,而同一进程正在打开一个文件stream呢?

您应该关闭第一个流,重命名文件,然后重新打开流:

 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"); } 

当进程打开文件时,不能重命名文件,但是如果要从程序的其他实例写入文件,请执行此操作。

尝试FileShare.Write 。 您可以在File.Open中使用它。

 using (StreamWriter sw = new StreamWriter (File.Open(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write)) { ... } 

打开每秒关闭文件100次会影响你的性能,你可以登录临时文件并每隔10秒附加临时文件。 这会给你你想要的。

我知道这个答案有点晚了,以帮助你在移植项目,但也许会帮助别人!

如果使用FileShare.Delete标志打开该文件,即使该文件仍处于打开状态,也可以对其进行重命名