2010-06-02 2 views
2

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

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

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

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

ответ

3

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

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

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

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

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

2

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

Вы можете закрыть такие ручки с помощью утилиты ручки из 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. 

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