C # несколько экземпляров чтения программы из одного файла - PullRequest
4 голосов
/ 20 октября 2011

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

Я читаю из файла с циклом while и file.ReadLine().

Ответы [ 5 ]

5 голосов
/ 20 октября 2011

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

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

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

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

ОБНОВЛЕНИЕ

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

using (Stream stream = new FileStream(filePath, FileMode.Open, 
                                      FileAccess.Read, FileShare.Read))
0 голосов
/ 20 октября 2011

Если вы используете File.Open и передаете что-то, кроме FileShare.None, в 4-й общий параметр, тогда другие потоки или процессы могут получить доступ к файлу. 1007 *

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

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

0 голосов
/ 20 октября 2011

Если они все читают, проблема будет только в том случае, если вы заблокируете файл. Использование FileAccess.Read и FileShare.Read позволит им одновременно открыть его.

0 голосов
/ 20 октября 2011

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

Что вам нужно сделать, это получить соответствующие разрешения / доступ;например, если вы используете File.Open, чтобы открыть файл, укажите FileAccess и FileShare, применимые к текущему режиму.выполнения.

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

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

0 голосов
/ 20 октября 2011

Не должно быть никаких проблем, если вы только читаете из файла.

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

Например:

Boolean isMyFileFree;
using (Mutex mutex = new Mutex(true, "Mutex4MyFile", out isMyFileFree)) {
    // Process your file
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...