代码之家  ›  专栏  ›  技术社区  ›  Naruto

如何锁定文件

  •  16
  • Naruto  · 技术社区  · 16 年前

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

    谢谢

    2 回复  |  直到 8 年前
        1
  •  41
  •   Mitch Wheat    13 年前

    只需打开它:

    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支持.open文件。

        2
  •  0
  •   Maverick Meerkat    8 年前

    如果另一个线程试图访问该文件,则fileshare.none将引发“system.io.ioexception”错误。

    您可以使用try/catch来等待释放文件。例子 here .

    或者,在访问write函数之前,可以将lock语句与一些“dummy”变量一起使用:

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