Могут ли несколько компьютеров одновременно добавлять файлы в общую папку Windows?

Я пытаюсь записать определенную информацию из моей сети машин Windows; Я настроил их периодически собирать эту информацию, а затем хочу, чтобы она была в одном файле CSV на сетевом диске. Я использую VBS для сбора этих данных, используя OpenTextFile в режиме добавления для записи. Позволит ли это нескольким компьютерам одновременно добавлять строку в этот файл? Или есть другой способ сделать это (кроме хранения отдельного файла для каждого устройства).

Я не забочусь о заказе (я собираю временную метку с каждого устройства).

3 ответа

Решение

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

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

SMB использует операционные блокировки (условные блокировки) и аренду для управления одновременным доступом к файлам. Типы оплоков и аренды следующие:

оппортунистическая блокировка

  • Уровень 1, монопольный доступ. Эта блокировка позволяет клиенту открывать файл для монопольного доступа. Клиент может выполнять буферизацию с опережением чтения и кэширование чтения или записи.
  • Уровень 2, общий доступ. Эта блокировка допускает одновременное чтение нескольких файлов и отсутствие записи. Клиент может выполнять буферизацию с опережением чтения и кэширование чтения данных и атрибутов файла. Запись в файл приведет к тому, что владельцы блокировки будут уведомлены о том, что блокировка была сломана.
  • Пакетный, эксклюзивный доступ. Эта блокировка берет свое название от блокировки, используемой при обработке пакетных (.bat) файлов, которые открываются и закрываются для обработки каждой строки в файле. Клиент может оставить файл открытым на сервере, даже если приложение (возможно, временно) закрыло файл. Эта блокировка поддерживает чтение, запись и обработку кэширования.
  • Фильтр монопольного доступа. Эта блокировка предоставляет приложениям и фильтрам файловой системы механизм для снятия блокировки, когда другие клиенты пытаются получить доступ к тому же файлу, но в отличие от блокировки уровня 2, файл не может быть открыт для доступа для удаления, а другой клиент не получит нарушение обмена. Эта блокировка поддерживает кэширование чтения и записи.

Договоры аренды

  • Чтение (R), общий доступ. Позволяет множественное одновременное чтение файла, без записи. Эта аренда позволяет клиенту выполнять буферизацию с опережением чтения и кэширование чтения.
  • Чтение-дескриптор (RH), общий доступ Это похоже на оплок 2-го уровня, с дополнительным преимуществом, позволяющим клиенту сохранять файл открытым на сервере, даже если средство доступа на клиенте закрыло файл. (Менеджер кэша будет лениво сбрасывать неписанные данные и очищать неизмененные страницы кэша в зависимости от доступности памяти.) Это превосходит оплок 2-го уровня, потому что аренду не нужно разбивать между открытиями и закрытиями дескриптора файла. (В этом отношении он обеспечивает семантику, аналогичную пакетной операции блокировки.) Этот тип аренды особенно полезен для файлов, которые многократно открываются и закрываются, потому что кэш не становится недействительным, когда файл закрывается, и повторно заполняется при повторном открытии файла, обеспечивает значительное улучшение производительности для сложных приложений с интенсивным вводом / выводом.
  • Чтение-запись (RW), эксклюзивный доступ. Эта аренда позволяет клиенту открыть файл для монопольного доступа. Эта блокировка позволяет клиенту выполнять буферизацию с опережением чтения и кэширование чтения или записи.
  • Чтение-запись-дескриптор (RWH), эксклюзивный доступ. Эта блокировка позволяет клиенту открывать файл для монопольного доступа. Эта аренда поддерживает кэширование чтения, записи и обработки (аналогично аренде чтения-обработки).

Windows Internals 6-е изд., Марк Руссинович и др.

Ни один из этих режимов не даст вам общий доступ для записи, который вы ищете.

Измени свою стратегию. Как сказал MDMarra, журнал событий Windows - лучший выбор. Другая идея заключается в том, чтобы все клиенты записывали свои файлы в общий файловый ресурс, а затем серверный процесс собирал все файлы и объединял их. В своем вопросе вы упоминаете, что пишете код, поэтому вы можете изменить работу этого приложения. Я бы предложил пойти в StackOverflow и спросить их о наилучшем способе доступа к общей записи для одного файла по сети.

Нет. Как только файл открыт для записи, он блокируется. Другие попытки записи в заблокированном виде приведут к "Доступ запрещен".

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

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

Другие вопросы по тегам