Как несколько процессов на разных компьютерах с Windows одновременно используют файл, хранящийся в общем каталоге? - PullRequest
2 голосов
/ 22 января 2012

Задача

У меня есть несколько экземпляров одного и того же приложения C #, работающего на разных компьютерах (ОС: Windows XP, Windows 7) в одной локальной сети. Я должен поделиться некоторыми данными конфигурации среди них. Каждый процесс должен иметь доступ для чтения и записи к данным. Мой работодатель настаивает на хранении этих общих данных в файле, который находится в общем каталоге на одном из этих компьютеров.

Возможные решения:

  1. Эксклюзивное открытие файла : данные хранятся в файле TXT (также возможна сериализация в двоичный файл и из него). Каждый процесс использует File.Open с FileShare.None при попытке открыть файл. Получение IOException означает, что файл уже используется, поэтому процесс должен подождать и повторить попытку позже .
  2. Встроенная БД SQL Server CE : данные хранятся в файле SDF. Движок может обрабатывать максимум 256 одновременных соединений (v3.5 SP2), что более чем достаточно.
  3. Встроенная БД SQLite : Данные хранятся в файле БД SQLite. документация говорит, что SQLite работает, но может быть ненадежным при использовании на общем сетевом ресурсе.
  4. Другое

Какой предпочтительный способ сделать это?

Ответы [ 3 ]

1 голос
/ 22 января 2012

Не знаю, является ли это лучшим способом, но я делал это несколько веков назад, у меня это хорошо работало.

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

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

Каждый процесс перезагружает файл (содержащий информацию, поступающую от всех других процессов).

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

1 голос
/ 22 января 2012

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

1 голос
/ 22 января 2012

Вы на самом деле не описываете тип данных, с которыми вы работаете, поэтому я бы сказал, что ответ варьируется.

Использование правильной СУБД для этого было бы лучше, если быданные, с которыми вы работаете, обычно можно рассматривать как ориентированные на записи / поля (и в редких случаях, даже если это не так).В этом случае я бы порекомендовал MSSQL CE, так как его среда выполнения уменьшит для вас многопользовательские проблемы.

Обычно SQLite считали базой данных для одного пользователя / приложения (по крайней мере, когда я использовал ее в C), хотя все моглоизменились за последние 5 лет.Если вы используете .NET 4, то из того, что я нашел, мало доступных адаптеров для использования, если вы не знакомы со смешанным фреймворком.

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

...