Что делать, если файл остается открытым, если удаленное приложение аварийно завершает работу или забывает закрыть файл - PullRequest
2 голосов
/ 02 июня 2010

Я не так много работал с файлами: меня интересуют возможные проблемы с доступом к удаленным файлам на другом компьютере. Что делать, если удаленное приложение вылетает и не закрывает файл?

Моя цель - использовать эту функцию win32: HFILE WINAPI OpenFile (LPCSTR lpFileName, LPOFSTRUCT lpReOpenBuff, UINT uStyle);

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

Но что, если файл оставить открытым? (например, сбой приложения?) Как вернуть файл в нормальное состояние?

Ответы [ 2 ]

3 голосов
/ 02 июня 2010

Что делать, если удаленное приложение аварийно завершает работу и не закрывает файл?

Тогда O / S должен закрыть файл после его очистки после «сбойного» приложения.

Это не поможет с «зависшим» приложением (приложением, которое остается открытым, но ничего не делает вечно).

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

Может быть, лучше использовать ядро ​​базы данных вместо файла: потому что ядра базы данных явно созданы для обработки одновременного доступа, блокировки, тайм-аутов и т. Д.

2 голосов
/ 07 сентября 2010

Я столкнулся с той же проблемой, используя VMware, который иногда не выпускает дескрипторы файлов на хосте, когда файлы закрываются на гостевой.

Вы можете закрыть такие дескрипторы, используя утилиту handle на www.sysinternals.com

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

D:\sysinternals\>handle myfile
deadhist.exe       pid: 744     3C8: D:\myfile.txt

Затем закройте hanlde, используя параметры -c и -p

D:\sysinternals\>handle -c 3c8 -p 744
  3C8: File  (---)   D:\myfile.txt
Close handle 3C8 in LOCKFILE.exe (PID 744)? (y/n) y

Handle closed.
Дескриптор

не заботится о приложении, содержащем дескриптор файла. Теперь вы можете повторно открыть, удалить, переименовать и т. Д. Файл

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