【问题标题】:Rename File open by self重命名文件自行打开
【发布时间】:2011-07-02 14:24:01
【问题描述】:

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

那么,如何在同一个进程打开文件的流时重命名进程中的文件?

【问题讨论】:

  • 如果你要记录这么多数据,你真的应该尝试像 log4net (logging.apache.org/log4net) 这样的日志库。
  • 不幸的是,当你使用它的流时,你不能移动文件或改变它的名字,甚至不能删除它,就像它被另一个程序使用一样......

标签: c# .net windows file-io


【解决方案1】:

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

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

【讨论】:

  • 这是行不通的,因为sw 在 using 块中时不能设置它。错误:Cannot assign to 'sw' because it is a 'using variable'
  • 听起来很合理。但是您必须第二次表示filename2,并且无法创建filemode对吗?只要我在没有任何流的间隙期间锁定任何日志记录,我想这会起作用。
  • 好的,我希望有一个更优雅的解决方案,但我想这可以。标记为答案
【解决方案2】:

我知道这个答案对您的移植项目有帮助有点晚,但也许它会帮助其他人!

如果您使用FileShare.Delete 标志打开文件,即使它仍处于打开状态,它也会让您重命名它:)

【讨论】:

    【解决方案3】:

    当文件被进程打开时,您无法重命名文件,但如果您想从程序的其他实例写入文件,请执行此操作。

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

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 在程序运行的整个过程中文件都是打开的。重命名可能只发生一次或两次由用户发起。
      • 如果你想重命名文件,它不应该被打开。因此,只需每 10 秒打开一次以附加日志条目,用户就可以在程序运行时重命名文件。
      猜你喜欢
      • 2017-06-11
      • 2012-07-08
      • 2010-09-27
      • 2019-06-27
      • 1970-01-01
      • 2015-12-11
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多