Как я могу определить, был ли файл для открытого дескриптора файла удален в Windows с помощью Perl? - PullRequest
3 голосов
/ 25 марта 2009

У меня есть процесс с открытым дескриптором файла к файлу. Мне нужно определить, был ли этот файл удален другим процессом (на его месте может быть файл с таким же именем). В UNIX я сравнивал inode моего дескриптора файла и пути к файлу через stat, но это не работает на Win32. Как я могу сделать это в Perl?

Спасибо
-Питер

Ответы [ 4 ]

7 голосов
/ 25 марта 2009

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

2 голосов
/ 25 марта 2009

Это сложная проблема, особенно в Windows и Unix.

Давайте вернемся. Почему вы пытаетесь определить, был ли файл заменен? Я предполагаю, что у вас какое-то состояние гонки, две программы пытаются записать в один и тот же файл. Возможно, здесь поможет блокировка файлов? Или использовать реальную базу данных? На ум приходят SQLite и DB Berkley.

1 голос
/ 25 марта 2009

Посмотрите на пакет Win32 :: ChangeNotify, чтобы зарегистрироваться для уведомления об изменениях в файле или каталоге. Также возможно открыть файл с помощью пакета Win32API :: File, чтобы его нельзя было удалить, пока он у вас открыт (см., В частности, createFile () и OsFHandleOpen (), а также документы CreateFile () на MSDN).

1 голос
/ 25 марта 2009

Я бы попробовал сравнить размер, mtime и atime; должно быть очень трудно, чтобы те были одинаковыми (за исключением бессмыслицы, такой как, скажем, stat на дескрипторе файла на win32, предоставляющем вам информацию для текущего файла в файловой системе независимо от того, находится ли ваш дескриптор файла на удаленном экземпляре). Если возможно, что ваш файл будет удален и заменен идентичным файлом несколько раз в течение данной секунды, и вам придется это обнаружить, то вам, возможно, придется обратиться к архитектурному решению, например, использовать нумерованные версии вашего файла или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...