скажите, как заблокировать файл в С#
Спасибо
скажите, как заблокировать файл в С#
Спасибо
Просто откройте его:
using (FileStream fs = 
         File.Open("MyFile.txt", FileMode.Open, FileAccess.Read, FileShare.None))
{
   // use fs
}
Обновить. В ответ на комментарий от плаката. Согласно онлайн-протоколу
Это эквивалентно ответу Mitch, за исключением того, что он доступен в других версиях .Net. Единственным существенным аргументом является FileShare.None; другие позволяют перегрузить конструктор, но их значения определяются тем, как вы будете использовать поток.
using(var fs = new FileStream(filename, FileMode.Create, FileAccess.Write, FileShare.None)
{
    // ...
}
FileShare.None будет вызывать ошибку "System.IO.IOException", если другой поток пытается получить доступ к файлу.
Вы можете использовать некоторую функцию, используя try/catch, чтобы дождаться выхода файла. Пример здесь.
Или вы можете использовать оператор блокировки с некоторой переменной "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);
            }
        }
    } 
Вы также можете использовать оператор "lock" в самой фактической функции записи (т.е. внутри AddLog), а не в фоновых рабочих функциях.
Вы пытались сделать это, https://docs.microsoft.com/en-us/dotnet/api/system.io.filestream.lock?view=netframework-4.8 объясняет, как заблокировать файл с помощью файлового потока в С#