0

我有一个函数正在读取文件并在列表中添加一些字符串并返回此列表。因为我希望没有人也没有任何东西可以改变、删除或任何我正在阅读的当前文件,所以我锁定了它。一切都很好,我以某种方式做到了:

public static List<string> Read(string myfile)
{
  using (FileStream fs = File.Open(myfile, FileMode.Open, FileAccess.Read, FileShare.None))
  {
    //read lines, add string to a list
    //return list
  }
}

没关系。现在我在另一个类中有另一个函数,它正在处理列表并调用其他函数等等。现在有时我想移动我正在阅读的文件。这就是问题所在:因为我现在在一个新函数中并且该函数Read(string myfile)已经被处理,所以文件中没有更多的锁。

//in another class
public static void DoStuff(/*somefile*/)
{
  List<string> = Read(/*somefile*/);
  //the file (somefile) is not more locked!
  //do stuff

  if (something)
    Move(/*somefile*/) //could get an error, file maybe not more there or changed...
}

所以另一个函数/用户可以更改文件,重命名它,删除它或其他任何东西=>我无法移动这个文件。或者我将移动更改的文件,但我不知道那是什么。如果我使用线程,另一个具有相同功能的线程可以再次锁定文件,我无法移动它。

这就是为什么我需要将这个文件锁定更长的时间。有没有简单的方法?还是我必须更换我的using (FileStream fs = File.Open(myfile, FileMode.Open, FileAccess.Read, FileShare.None)代码?有什么建议么?谢谢你

4

4 回答 4

0

保持它锁定的唯一方法是保持它完全打开,就像你在代码中所做的那样。

也许你需要//do stuff在你的 using 语句中,然后在调用之后直接Move

于 2012-08-29T09:46:00.063 回答
0

再多的锁定也无法阻止这一点。锁只保护文件中的数据。用户(或任何其他程序)仍然可以移动或重命名文件。文件的属性,包括名称、时间戳和文件属性是分开存储的,可以随意更改。

这只是您在任何 Windows 程序中必须处理的事情。仅捕获异常就足以让您知道文件发生了某些事情,这种情况很少见。用户很少会感到惊讶。如果您真的需要预先知道,那么您可以使用 FileSystemWatcher 在它发生时获取通知。

于 2012-08-29T10:59:32.980 回答
0

只有在调用 Read 方法时才锁定文件。

如果您想保持锁定并仅在您决定时释放它,请使用您的方法 OpenFile(string filename) 和 CloseFile(string filename)。然后从 Read 方法中删除 using 语句。

开始工作时打开它(锁定)。需要时阅读。当您必须移动它时,只需创建一个具有相同名称的新文件并复制内容即可。关闭原始文件(解锁)并删除它。

于 2012-08-29T11:34:03.977 回答
0

如果你想保持文件锁定更长时间,那么你需要重构你的代码,以便Stream对象保留更长时间 - 我会更改Read方法以接受 a FileStream,有点像这样

using (FileStream fs = File.Open(myfile, FileMode.Open, FileAccess., FileShare.None))
{
    List<string> = Read(fs);
    if (something)
    {
        File.Move(/* somefile */)
    }
}

您将遇到的问题是该File.Move方法将失败,因为该文件已被锁定(由您锁定,但File.Move不知道)。

根据您想要执行的具体操作,可能会找到一种在“移动”文件的同时保持文件锁定的方法,(例如,如果您something事先知道您可以打开文件指定FileOptions.DeleteOnClose并编写一个新的在所需目标中具有相同内容的文件),但这与移动文件并不完全相同,因此这完全取决于您要执行的操作。

一般来说,这样的事情几乎总是比它们的价值更麻烦 - 你最好在移动文件之前解锁文件并捕获/处理由于移动而引发的任何异常。

于 2012-08-29T12:59:53.197 回答