Блокировка файла XML - PullRequest
       4

Блокировка файла XML

0 голосов
/ 18 ноября 2009

У нас есть следующее требование для обработки файлов XML в коде C #. Пожалуйста, предоставьте логику / решение таким образом, чтобы достичь этого.

Проблема: У нас есть файл XML, предположим, что он test.xml. Когда пользователь 'A' работает с test.xml, мы хотим, чтобы требовалось заблокировать этот XML и обрабатывать его как чтение / запись и т. Д. В то же время пользователь «B» также пытался получить доступ к test.xml, мы хотим, чтобы требование «B» не могло открываться, а «B» должно ждать, пока не будет снята блокировка пользователя «A». или разблокировать.

Также мы не должны получать никаких ошибок / исключений, пока пользователь «B» не находится в режиме ожидания, и мы не хотим показывать какие-либо сообщения пользователю. Поскольку мы не заинтересованы использовать FileStreams в этом сценарии из-за проблем с производительностью.

Может ли кто-нибудь помочь в этом вопросе, как преодолеть этот тип проблемы.

Обратите внимание : Мы не хотим использовать файловые потоки. Пожалуйста, предложите альтернативное решение в этом отношении.

Ответы [ 3 ]

4 голосов
/ 18 ноября 2009

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

0 голосов
/ 18 ноября 2009

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

0 голосов
/ 18 ноября 2009

Полагаю, вам придется открыть файл в режиме READ / WRITE и выполнить какой-то цикл, чтобы проверить, не открыт ли файл.

 try {
    FileStream fileStream = new FileStream(@"c:\file.txt", FileMode.Open, FileAccess.Write);
   } catch(Exception e){
     // TODO check if access denied 
   } 

Если вы предпочитаете делать такие тесты, прежде чем я посоветую вам посмотреть семафоры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...