锁定文件较长时间有些麻烦

时间:2012-08-29 09:35:15

标签: c# .net file locking

我有一个函数正在读取文件并在列表中添加一些字符串并返回此列表。因为我希望没有人可以改变,删除或者我正在阅读的当前文件,我锁定它。一切都很好,我这样做是这样的:

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...
}

所以另一个函数/用户可以更改文件,重命名,删除它或其他=&gt;我无法移动此文件。或者我会移动更改的文件,但我不这样做。如果我使用线程,另一个具有相同功能的线程可能会再次锁定文件,我无法移动它。

这就是为什么我需要以某种方式锁定此文件更长时间。有一个简单的方法吗?或者我必须替换我的using (FileStream fs = File.Open(myfile, FileMode.Open, FileAccess.Read, FileShare.None)代码吗?有什么建议?谢谢

4 个答案:

答案 0 :(得分:0)

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

也许您需要在使用声明中使用//do stuff,然后在调用Move之后直接

答案 1 :(得分:0)

没有任何锁定会阻止这种情况发生。锁只保护文件中的数据。用户(或任何其他程序)仍然可以移动或重命名文件。文件的属性(包括名称,时间戳和文件属性)分开存储,可以随意更改。

这只是您在任何Windows程序中必须处理的事情。仅仅捕获异常就足以让你知道文件发生了什么事,这是非常罕见的。用户很少会感到惊讶。如果确实需要事先知道,那么您可以使用FileSystemWatcher在发生时收到通知。

答案 2 :(得分:0)

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

如果要保持锁定并仅在决定时将其释放,请将方法设为OpenFile(字符串文件名)和CloseFile(字符串文件名)。然后从Read方法中删除using语句。

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

答案 3 :(得分:0)

如果您希望将文件锁定更长时间,则需要重构代码以使Stream对象保持更长时间 - 我会更改Read方法以接受{{ 1}},有点像这样

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,则可以打开指定FileOptions.DeleteOnClose的文件,并在所需的目的地中写入一个具有相同内容的新文件),但这与移动文件并不完全相同,所以这一切都取决于你想要的确切内容做。

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