2009-09-16 51 views
16

请告诉我如何锁定的文件在C#中如何锁定文件

感谢

+0

这可能会导致几十个不同的答案,这都将是有效的。请添加更多细节。 (顺便说一下,只是认为该文件可能已经阻止了其他访问它的其他人)。 – 2009-09-16 09:57:32

+7

插入密钥,将其转到左侧。 – 2009-09-16 10:23:25

+0

这工作对我来说http://stackoverflow.com/questions/4692981/c-sharp-blocking-a-folder-from-being-changed-while-processing/4693064#4693064 – Vbp 2014-07-13 15:59:43

回答

40

只要以独占方式打开它:

using (FileStream fs = 
     File.Open("MyFile.txt", FileMode.Open, FileAccess.Read, FileShare.None)) 
{ 
    // use fs 
} 

Ref

更新:作为对来自海报的评论的回应:根据在线MSDN doco,在.Net Compact Framework 1.0和2.0中支持File.Open。

+4

而当你在它,使确保你不会失去参考和延迟解锁,直到GC非确定性地释放它 - 使用IDisposable接口,例如通过将上述语句包装在'using'块中。 – 2009-09-16 10:07:32

+1

不知道这回答了这个问题。 OP正在寻找紧凑框架中不存在的FileStream.Lock方法。锁可以防止其他进程修改文件,但仍然让他们读取它。我认为你的方法会完全阻止其他进程。 – MusiGenesis 2009-09-16 10:32:28

+0

@MusiGenesis:海报似乎在问如何锁定文件... – 2009-09-16 10:34:17

0

这相当于米奇的答案,只是它似乎在更多版本的.Net中可用。唯一重要的论点是FileShare.None;其他人可以使构造函数的重载,但他们的价值取决于你将如何使用流。

using(var fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None) 
{ 
    // ... 
} 
0

如果另一个线程试图访问文件,FileShare.None会抛出“System.IO.IOException”错误。

你可以使用一些使用try/catch的函数来等待文件被释放。示例here

或者你可以访问写函数之前使用lock语句与一些“虚拟”变量:

// The Dummy Lock 
    public static List<int> DummyLock = new List<int>(); 

    static void Main(string[] args) 
    { 
     MultipleFileWriting(); 
     Console.ReadLine(); 
    } 

    // Create two threads 
    private static void MultipleFileWriting() 
    { 
     BackgroundWorker thread1 = new BackgroundWorker(); 
     BackgroundWorker thread2 = new BackgroundWorker(); 
     thread1.DoWork += Thread1_DoWork; 
     thread2.DoWork += Thread2_DoWork; 
     thread1.RunWorkerAsync(); 
     thread2.RunWorkerAsync(); 
    } 

    // Thread 1 writes to file (and also to console) 
    private static void Thread1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 20; i++) 
     { 
      lock (DummyLock) 
      { 
       Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss") + " - 3"); 
       AddLog(1); 
      } 
     } 
    } 

    // Thread 2 writes to file (and also to console) 
    private static void Thread2_DoWork(object sender, DoWorkEventArgs e) 
    { 
     for (int i = 0; i < 20; i++) 
     { 
      lock (DummyLock) 
      { 
       Console.WriteLine(DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss") + " - 4"); 
       AddLog(2); 
      } 
     } 
    } 

    private static void AddLog(int num) 
    { 
     string logFile = Path.Combine(Environment.CurrentDirectory, "Log.txt"); 
     string timestamp = DateTime.Now.ToString("dd/MM/yyyy hh:mm:ss"); 

     using (FileStream fs = new FileStream(logFile, FileMode.Append, 
      FileAccess.Write, FileShare.None)) 
     { 
      using (StreamWriter sr = new StreamWriter(fs)) 
      { 
       sr.WriteLine(timestamp + ": " + num); 
      } 
     } 

    } 

您还可以使用在实际写作功能本身的“锁定”语句(即内AddLog)而不是在后台工作人员的职能中。