FileStream блокировка файла для чтения и записи c#

У меня есть следующий блок кода, который дает мне головную боль.

логически это должно работать, поскольку я использую filestream, предоставляющий блокировку в операторе using. Когда он попадает в строку, которая создает StreamWriter, он не говорит: "файл не доступен для записи".

теперь моя программа является многопоточным приложением. Любой поток может пытаться записать в этот файл. Мне нужна программа, чтобы заблокировать файл, прочитать содержимое, проверить содержимое, а затем написать назад любые изменения. Во время этого процесса ни один другой поток не должен иметь доступа к этому файлу.

using (var fs = File.Open(fileLoc, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
    var sr = new StreamReader(fs);
    var str = sr.ReadToEnd();
    var strArray = str.Split(',');
    if (strArray.Any(st => st == text))
    {
        return;
    }
    sr.Close();

    var sw = new StreamWriter(fs);
    sw.Write(str + text);
    sw.Flush();
    sw.Close();
}

2 ответов


В Обменник.Ни один флаг не вызывает очереди потоков, он просто блокирует файл, следовательно, исключение, которое вы получаете. Чтобы обеспечить взаимоисключающий доступ, вы можете заблокировать общий объект перед записью.

но вы говорите: "теперь моя программа является многопоточным приложением. Любой поток может пытаться записать в этот файл."Теперь, все эти потоки используют один и тот же метод для записи в файл? Предположим, что да, тогда это должно сработать ...

создать статический переменная класса. ..

private static object lockObject = new object();

использовать его здесь ...

lock (lockObject) 
{
    var sw = new StreamWriter(fs);
    sw.Write(str + text);
    sw.Flush();
    sw.Close();
}

Я сделал некоторые предположения о потоках, поэтому вам, возможно, придется искать информацию о синхронизации, если это не сработает или предоставить нам дополнительную информацию.

кроме того, закройте StreamReader раньше (в случае, если метод возвращается раньше). Закройте его сразу после использования.


Попробуйте Синхронизацию Потоков.Вы можете найти более подробную информацию по ссылке ниже.

http://msdn.microsoft.com/en-us/library/ms173179 (v=против 80).aspx