У меня есть функция, которая работает нормально, чтобы проверить, используется ли локальный файл. Однако, если я сопоставляю сетевой диск и пытаюсь проверить, используется ли файл с подключенного диска, результат функции всегда будет ложным. Мне нужно подождать, пока большой файл будет скопирован на сопоставленный диск, и после завершения я переименую файл. Если файл не используется, я начинаю выполнять различные действия еще, я жду еще минуту и снова проверю. Как изменить приведенную ниже функцию для работы с сопоставленными файлами дисков, которые постоянно копируются?Delphi 2010 - Используется ли файл?
Спасибо
function IsFileInUse(FileName: TFileName): Boolean;
var
HFileRes: HFILE;
begin
Result := False;
if not FileExists(FileName) then
begin
showmessage('Fisierul "'+Filename+'" nu exista!');
Exit;
end
else
begin
HFileRes := CreateFile(PChar(FileName),
GENERIC_READ or GENERIC_WRITE,
0,
nil,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
Result := (HFileRes = INVALID_HANDLE_VALUE);
if not Result then
CloseHandle(HFileRes);
end;
end;
Я не вижу явной причины, почему это должно вести себя по-разному на удаленном томе. Я также не вижу необходимости в функции вообще? Зачем блокировать файл, а затем сразу его разблокировать? Попробуйте скопировать, и если вы получите нарушение обмена, кто-то другой заблокировал его. –
Сервер (x) начинает копировать файлы данных на другой сервер (y). Мне нужно обработать файлы из (y), чтобы я сопоставлял диск, указывающий на папку из этого места. Затем я перечисляю все файлы. Если файл используется (он все еще копируется с сервера x на сервер y), я исключаю этот файл из операций. Все остальные файлы, которые были успешно завершены, загружаются на ftp-сервер. Вот почему мне нужно посмотреть, используется ли файл иначе, как я могу знать, тогда процесс копирования завершился. У меня нет контроля над серверами x или y. – user2858981
Как сказал Дэвид, вы просто пытаетесь скопировать файл. Если вы получаете исключение, вы не смогли его скопировать, и процесс копирования не закончился. Если вы собираетесь использовать код, который у вас есть сейчас, по крайней мере, измените его, чтобы сохранить файл открытым и вернуть дескриптор файла. Повторное открытие/закрытие/попытка открытия снова хрупка; доступность файла может измениться между вызовом IsFileInUse и операцией копирования. –