Надлежащие методы, чтобы несколько процессов читали один и тот же файл? - PullRequest
3 голосов
/ 26 февраля 2010

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

using (StreamReader fileStreamReader = new StreamReader(File.Open(path, FileMode.Open, FileAccess.Read, FileShare.Read)))
{
   content = fileStreamReader.ReadToEnd();
}

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

Это странная часть, исключение, которое я получаю, вовсе не из файлового ввода-вывода, а из библиотеки CommStudio. Короче говоря, я выгружаю файл в строку, слегка изменяю его, выкидываю в поток памяти и отправляю его через ymodem на rs232. Исключение говорит мне, что удаленная система отменена. Устройство, получающее данные, сообщает, что произошла ошибка передачи, что обычно означает, что был получен неполный / пустой файл.

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

Ответы [ 2 ]

2 голосов
/ 26 февраля 2010
У

была похожая проблема, но не было времени, чтобы найти идеальное решение. Я создал веб-сервис и прикрепил файл локально к приложению веб-сервиса. Затем создал простой однострочный GET API, который вызывался через офисную интрасеть. Таким образом, только вызывающее приложение отредактировало файл журнала ... грязный, но функциональный.

0 голосов
/ 26 февраля 2010

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

//Use FileInfo to get around OS locking of the file
FileInfo fileInfo = new FileInfo(path); 
//I actually wanted unblocked read write access so change your access and share appropriately
using (FileStream fs = fileInfo.Open(FileMode.Open, FileAccess.Write, FileShare.ReadWrite))
{
    //I'm using CopyTo but use whatever method matches your need
    fileInfo.CopyTo(Path.Combine(destination, fileName), false);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...