重命名文件由self打开

时间:2011-07-02 14:24:02

标签: c# .net windows file-io

我的程序将数据记录到文件中,同时用户界面实时显示传入的数据。如果计算机/程序/操作系统/任何关闭,我希望记录的数据在一秒或两秒内在磁盘上。数据至少达到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");
 }

那么,如果同一进程的文件流已打开,如何从进程重命名文件?

4 个答案:

答案 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标志打开文件,即使它仍处于打开状态,您也可以重命名该文件:)