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

У нас есть две версии программного обеспечения для печати карт: CardFive и Zebra Card Studio, которая приобрела CardFive и поддерживает свое старое программное обеспечение.

Оба открывают файл CSV для печати инструкций. Старая версия позволяет последующим экземплярам программного обеспечения изменять эти инструкции. Новой версии нет - она отказывается разрешать любые модификации.

Я подозреваю, что проблема связана с привилегиями блокировки файлов, то есть старое программное обеспечение открывается с OF_SHARE_DENY_NONE (ReadWrite в перечислении FileShare .NET), и что новое программное обеспечение открывается с большими ограничениями общего ресурса.

Как я могу точно сказать, как сетевой файл заблокирован? Я попытался просмотреть несколько экземпляров обеих версий приложений в Process Explorer, но он показывает только, какой процесс имеет открытый файл, а не то, как он открыт:

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

1 ответ1

0

Блокировка файлов в Windows происходит на двух уровнях. Программа может заблокировать весь файл (API CreateFile ) или его область (API LockFileEx ). Windows API (Win32) не предоставляет стандартного способа выяснить, как файл был открыт. API NtQueryObject может предоставить некоторую информацию о том, как файл был открыт, но он не включает требования к совместному использованию и является внутренним API, который может измениться в любое время.

Однако приложение может приблизить семантику совместного использования открытого файла, пытаясь открыть его и проверяя, не открывается ли из-за отказа в доступе. Такая программа будет пытаться открыть файл для (1) отсутствия доступа, затем (2) доступа для чтения, затем (3) доступа для записи. Затем приложение может проверить, есть ли какие-либо области файла, которые заблокированы, пытаясь заблокировать его области.

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .