2016-06-19 9 views
1

Как видно из названия, я пытаюсь одновременно читать и писать в файл. Я исследовал эту тему, но ответы, которые я нашел, не работают для меня из-за обстоятельств в моей программе. Я использую несколько FileSystemWatchers для отслеживания большого количества файлов, которые постоянно проходят через поток в моей сети. Когда файлы проходят через каждую часть моего потока, текстовый файл обновляется (один текстовый файл на одно место в потоке), который отмечает имя файла и время его создания в папке. Это непредсказуемо, когда файлы могут проходить, и когда они могут писать текстовые файлы трекера. Моя цель состоит в том, чтобы иметь возможность одновременно читать и писать в файл, если пользователь пытается прочитать из текстового файла, который записывается в одно и то же время. Как бы я это сделал?Использование TextWriter с StreamWriter и чтение/запись одновременно

//Write to File 
    private void WriteToFile(string info,string path,string tr) 
    { 
     if (!File.Exists([email protected]"\"[email protected])) 
     { 
      var myFile = 
      File.Create(path + @"\" + @tr); 
      myFile.Close(); 
      TextWriter tw = new StreamWriter(path + @"\" + @tr, true); 
      tw.WriteLine(info,true); 
      tw.Close(); 
     } 
     else if (File.Exists(path + @"\" + @tr)) 
     { 
      TextWriter tw = new StreamWriter(path + @"\" + @tr, true); 
      tw.WriteLine(info); 
      tw.Close(); 
     } 
    } 
+0

Можете ли вы добавить код, который отвечает за чтение файла, на ваш вопрос? Благодаря! – Snoopy

+0

, если вы используете FileStream, вы можете заблокировать часть файла https://msdn.microsoft.com/en-us/library/system.io.filestream.lock или использовать опцию FileShare.None – Slai

ответ

1

The обстоятельствах вы намекая на, кажется, говорят, что в то время как многочисленные попытки могут быть сделаны для чтения/записи файла в данный момент времени, вы все еще хотите, чтобы убедиться, что операции выполняются один за другим правильный порядок, который вызвали чтение или запись.

Один простой способ обеспечения того, чтобы чтения и написать операции синхронизированные бы просто поставить lock или Monitor вокруг методов. Попробуйте следующий код для записи метода:

private readonly object _locker = new object(); 

// write the file 
private void WriteToFile(string info, string path, string tr) 
{ 
    Monitor.Enter(this._locker); 

    try 
    { 
     if (!File.Exists(path + @"\" + @tr)) 
     { 
      var myFile = 
      File.Create(path + @"\" + @tr); 
      myFile.Close(); 
      TextWriter tw = new StreamWriter(path + @"\" + @tr, true); 
      tw.WriteLine(info, true); 
      tw.Close(); 
     } 
     else if (File.Exists(path + @"\" + @tr)) 
     { 
      TextWriter tw = new StreamWriter(path + @"\" + @tr, true); 
      tw.WriteLine(info); 
      tw.Close(); 
     } 
    } 
    finally 
    { 
     Monitor.Exit(this._locker); 
    } 
} 

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

// read the file 
private string ReadFile(string path) 
{ 
    Monitor.Enter(this._locker); 

    try 
    { 
     // read the file here... 
    } 
    finally 
    { 
     Monitor.Exit(this._locker); 
    } 
} 

Что Monitor будет делать это убедиться, что файл не будет read до продолжающийся write, что операция завершена (и наоборот). Это гарантирует, что вы не получите старые данные при его чтении, и вы также не будете переписывать новые данные (которые еще не были прочитаны). Этот метод всегда проверяет целостность ваших файлов.

+0

Как именно это работает? Если я понимаю, что он «блокирует» файл до его возможности читать/писать? И в читателе, могу ли я по-прежнему просто использовать простейший читатель? –

+0

@MarshalAlessi На самом деле это будет просто заблокировать объект. Таким образом, метод 'ReadFile' не может быть выполнен, пока выполняется' WriteFile'. Вы на самом деле * блокируете * на объекте '_locker'. Иными словами, только один поток может перемещаться мимо «Монитора» в заданное время, пока поток, который занят, не достигнет «Monitor.Exit()» и готов отказаться от блокировки. Имеет ли это смысл? – Snoopy

+0

Благодарим вас за разъяснения и ответ! У меня есть еще один вопрос, хотя, я просто протестировал этот метод и, как ни странно, теперь он производит четыре строки данных для нового файла. IE, когда он записывает в текстовый файл, он дублирует ту же строку 4 раза. Что может быть причиной этого? –