如何锁定文件

Posted

技术标签:

【中文标题】如何锁定文件【英文标题】:How to lock file 【发布时间】:2010-11-28 18:11:03 【问题描述】:

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

谢谢

【问题讨论】:

这可能会导致几十个不同的答案,这些都是有效的。请添加更多细节。 (顺便说一句,仅仅打开文件可能已经阻止了很多其他人访问它。) 这对我有用***.com/questions/4692981/… 【参考方案1】:

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

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

或者您可以在访问写入函数之前使用带有一些“虚拟”变量的锁定语句:

    // 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 内部)中使用“lock”语句,而不是在后台工作程序的函数中。

【讨论】:

【参考方案2】:

只需独占打开它:

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。

【讨论】:

不确定这是否能回答问题。 OP 正在寻找紧凑框架中不存在的 FileStream.Lock 方法。 Lock 阻止其他进程修改文件,但仍然允许他们读取它。我认为您的方法会完全阻止其他进程。 @Mitch:你的答案可能正是他所需要的,但如果他试图找到一种 WinMo 方法来做 FileStream.Lock 所做的事情(阻止写访问但不读访问,并锁定一个字节文件中的范围)然后它不是。 @MitchWheat 如果我打开很多这样的文件流,这会导致内存丢失或降低系统性能吗?

以上是关于如何锁定文件的主要内容,如果未能解决你的问题,请参考以下文章

如何打开锁定的 mdb 文件?

如何锁定文件

如何使用 htaccess 文件锁定文件夹?

使用 C#,如何确定是哪个进程锁定了文件?

如何锁定windows不让别人上网?

如何使用tortoiseSVN客户端锁定SVN中的文件夹