2012-04-17 1 views
1

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

+0

Что вы подразумеваете под «проблемой»? – GETah

+0

@ GETah Я предполагаю, что он имеет в виду проблему «блокировки». – Diego

+0

У вас есть контроль над «другой программой» – NSGaga

ответ

3

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

try { 
    if(FileTimeStampHasChanged(FileName)) { 
    //Attempt to do something with the file 
    } 
} 
catch { 
    // Handle or ignore the exception if you can't open the file (maybe the other application hasn't finished writing). You can always retry later. 
} 

Однако, я настоятельно рекомендовал бы другой подход в целом. Вот варианты, которые я предлагаю.

  1. Если вы можете изменить программу письма, пусть записи во временный файл (например вывода. $$$), и пусть это переименовать его, как только это будет сделано писать. Переименование происходит мгновенно и не вызывает блокировки. Это, по моему опыту, одно из лучших простых решений для одновременного доступа.
  2. Если вы не можете изменить программу записи, а затем изменить чтение. Используя логику, описанную в пункте 1, попробуйте переименовать файл для чтения и работы с переименованной копией. Если переименование не удалось, значит, запись не выполнена, и попытка может быть выполнена позже.
  3. Если вы не можете изменить ни одну из программ, то вы можете сделать свое собственное приложение «Traffic Warden» для реализации точки 1. Это требует больше работы, но это все еще возможно. Вот как это делается:
    • Настройте запись Writer в папку, например. "Вывод".
    • Конфигурируйте считыватель для чтения из другой папки, например. «Ввод».
    • Напиши свой охранник, чтобы он контролировал выходную папку, и, когда файл изменяется, он перемещает его в папку ввода. Перемещение также мгновенно (это практически такая же операция, как переименование).
0

Вы ищете для открытия файла в обеих программах с использованием FileShare.Write or ReadWriteFileStream constructor.

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

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

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

+0

Это может решить проблему параллелизма, но мы не знаем, что содержит файл. Если это текстовый файл, возможность читать его, пока он написан, может быть хуже, чем проблема блокировки, которую он испытывает. – Diego

+0

Я попытался представить его как «нужно вручную выполнить некоторую синхронизацию», но не удалось ... Не стесняйтесь сливаться с вашим ответом, если хотите. –

+0

Я не думаю, что это необходимо, на самом деле хорошо, что вы предложили решение для доступа к тем же файлам одновременно. :) – Diego

 Смежные вопросы

  • Нет связанных вопросов^_^