В C#, если 2 процесса читают и пишут в тот же файл, что лучший способ состоит в том, чтобы избежать исключений блокировки процесса?

Этот код возвращает желаемые результаты.

function ary_diff( $ary_1, $ary_2 ) {   // compare the value of 2 array   // get differences that in ary_1 but not in ary_2   // get difference that in ary_2 but not in ary_1   // return the unique difference between value of 2 array   $diff = array();

  // get differences that in ary_1 but not in ary_2   foreach ( $ary_1 as $v1 ) {
    $flag = 0;
    foreach ( $ary_2 as $v2 ) {
      $flag |= ( $v1 == $v2 );
      if ( $flag ) break;
    }
    if ( !$flag ) array_push( $diff, $v1 );   }

  // get difference that in ary_2 but not in ary_1   foreach ( $ary_2 as $v2 ) {
    $flag = 0;
    foreach ( $ary_1 as $v1 ) {
      $flag |= ( $v1 == $v2 );
      if ( $flag ) break;
    }
    if ( !$flag && !in_array( $v2, $diff ) ) array_push( $diff, $v2 );   }

  return $diff; }
25
задан Jeff Yates 21 October 2008 в 14:43
поделиться

7 ответов

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

, Например,

using (FileStream stream = new FileStream(@"C:\Myfile.txt", FileMode.Open, FileAccess.ReadWrite, FileShare.Read))
{
   // Do your writing here.
}

Другой доступ к файлу просто открывает файл для чтения и не записи, и позволяет совместное использование чтения-записи.

using (FileStream stream = new FileStream(@"C:\Myfile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
   // Does reading  here.
}

, Если Вы хотите удостовериться, что читатели будут всегда читать актуальный файл, необходимо будет или использовать файл блокировки, который указывает, что кто-то пишет в файл (хотя можно получить состояние состязания, если не тщательно реализованный), или удостоверяются Вы совместное использование записи блока при открытии, чтобы считать и обработать исключение, таким образом, можно попробовать еще раз, пока Вы не получаете эксклюзивный доступ.

37
ответ дан 28 November 2019 в 20:41
поделиться

При создании именованного Взаимного исключения, можно определить взаимное исключение в приложении записи и иметь приложение чтения, ожидают, пока взаимное исключение не выпущено.

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

Вот пример VB Взаимного исключения как это, что я нашел, должно быть достаточно легко преобразовать в C#.

6
ответ дан 28 November 2019 в 20:41
поделиться

Есть ли какая-то конкретная причина открытия файла с FileShare. Ни один? Это будет препятствовать тому, чтобы файл был открыт любым другим процессом.

FileShare. Запись или FileShare. ReadWrite должен позволить другому процессу (подвергающийся полномочиям) открываться и писать в файл при чтении его однако необходимо будет наблюдать за изменением файла под Вами при чтении его - просто буферизация содержания после открытия может помочь здесь.

Все эти ответы, однако, одинаково действительны - лучшее решение зависит от точно, что Вы пытаетесь сделать с файлом: если важно считать его при гарантии, что это не изменяет, то блокирует его и обрабатывает последующее исключение в коде записи; если важно читать и записать в него одновременно, затем изменить постоянный FileShare.

3
ответ дан 28 November 2019 в 20:41
поделиться

Можно использовать Mutex объект для этого.

2
ответ дан 28 November 2019 в 20:41
поделиться

Заставьте свой процесс проверять состояние файла, если это пишется в. Можно сделать это присутствием файла блокировки (т.е. присутствие этого другого файла, который может быть пустым, предотвращает запись в основной файл).

Даже это не отказоустойчиво однако, поскольку два процесса могут создать файл блокировки одновременно - но можно проверить на это перед фиксацией записи.

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

2
ответ дан 28 November 2019 в 20:41
поделиться

Средство чтения и устройство записи оба механизма повторной попытки потребности. Также FileShare должен быть установлен на FileShare.read для читателей и FileShare.none для писателя. Это должно гарантировать, чтобы читатели не читали файл, в то время как запись происходит.

читатель (исключая повторную попытку) становится

using (FileStream fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    using (TextReader tr = new StreamReader(fileStream))
    {
        string fileContents = tr.ReadToEnd();
    }
}

, писатель (исключая повторную попытку) становится:

FileStream fileStream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None);
using (TextWriter tw = new StreamWriter(fileStream))
{
    tw.Write(fileContents);
    tw.Close();
}
2
ответ дан 28 November 2019 в 20:41
поделиться

Запишите во временный файл, когда закончено запись переименовывает/перемещает файл к местоположению и/или имени, которое ищет читатель.

1
ответ дан 28 November 2019 в 20:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: