Этот код возвращает желаемые результаты.
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; }
Можно открыть файл для записи и только заблокировать доступ для записи, таким образом, позволив другим все еще считать файл.
, Например,
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.
}
, Если Вы хотите удостовериться, что читатели будут всегда читать актуальный файл, необходимо будет или использовать файл блокировки, который указывает, что кто-то пишет в файл (хотя можно получить состояние состязания, если не тщательно реализованный), или удостоверяются Вы совместное использование записи блока при открытии, чтобы считать и обработать исключение, таким образом, можно попробовать еще раз, пока Вы не получаете эксклюзивный доступ.
При создании именованного Взаимного исключения, можно определить взаимное исключение в приложении записи и иметь приложение чтения, ожидают, пока взаимное исключение не выпущено.
Так в процесс уведомления, который в настоящее время работает с FileSystemWatcher, просто проверьте, чтобы видеть, необходимо ли ожидать взаимного исключения, если Вы делаете, это будет ожидать, затем обрабатывать.
Вот пример VB Взаимного исключения как это, что я нашел, должно быть достаточно легко преобразовать в C#.
Есть ли какая-то конкретная причина открытия файла с FileShare. Ни один? Это будет препятствовать тому, чтобы файл был открыт любым другим процессом.
FileShare. Запись или FileShare. ReadWrite должен позволить другому процессу (подвергающийся полномочиям) открываться и писать в файл при чтении его однако необходимо будет наблюдать за изменением файла под Вами при чтении его - просто буферизация содержания после открытия может помочь здесь.
Все эти ответы, однако, одинаково действительны - лучшее решение зависит от точно, что Вы пытаетесь сделать с файлом: если важно считать его при гарантии, что это не изменяет, то блокирует его и обрабатывает последующее исключение в коде записи; если важно читать и записать в него одновременно, затем изменить постоянный FileShare.
Заставьте свой процесс проверять состояние файла, если это пишется в. Можно сделать это присутствием файла блокировки (т.е. присутствие этого другого файла, который может быть пустым, предотвращает запись в основной файл).
Даже это не отказоустойчиво однако, поскольку два процесса могут создать файл блокировки одновременно - но можно проверить на это перед фиксацией записи.
, Если Ваш процесс встречается с файлом блокировки тогда, заставляют его просто спать/ожидать и попробовать еще раз в предопределенном интервале в будущем.
Средство чтения и устройство записи оба механизма повторной попытки потребности. Также 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();
}
Запишите во временный файл, когда закончено запись переименовывает/перемещает файл к местоположению и/или имени, которое ищет читатель.