2015-02-06 3 views
1

У меня есть функция, которая работает нормально, чтобы проверить, используется ли локальный файл. Однако, если я сопоставляю сетевой диск и пытаюсь проверить, используется ли файл с подключенного диска, результат функции всегда будет ложным. Мне нужно подождать, пока большой файл будет скопирован на сопоставленный диск, и после завершения я переименую файл. Если файл не используется, я начинаю выполнять различные действия еще, я жду еще минуту и ​​снова проверю. Как изменить приведенную ниже функцию для работы с сопоставленными файлами дисков, которые постоянно копируются?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; 
+1

Я не вижу явной причины, почему это должно вести себя по-разному на удаленном томе. Я также не вижу необходимости в функции вообще? Зачем блокировать файл, а затем сразу его разблокировать? Попробуйте скопировать, и если вы получите нарушение обмена, кто-то другой заблокировал его. –

+0

Сервер (x) начинает копировать файлы данных на другой сервер (y). Мне нужно обработать файлы из (y), чтобы я сопоставлял диск, указывающий на папку из этого места. Затем я перечисляю все файлы. Если файл используется (он все еще копируется с сервера x на сервер y), я исключаю этот файл из операций. Все остальные файлы, которые были успешно завершены, загружаются на ftp-сервер. Вот почему мне нужно посмотреть, используется ли файл иначе, как я могу знать, тогда процесс копирования завершился. У меня нет контроля над серверами x или y. – user2858981

+0

Как сказал Дэвид, вы просто пытаетесь скопировать файл. Если вы получаете исключение, вы не смогли его скопировать, и процесс копирования не закончился. Если вы собираетесь использовать код, который у вас есть сейчас, по крайней мере, измените его, чтобы сохранить файл открытым и вернуть дескриптор файла. Повторное открытие/закрытие/попытка открытия снова хрупка; доступность файла может измениться между вызовом IsFileInUse и операцией копирования. –

ответ

0

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

  1. Вы ошиблись с именем файла, и файл, который вы открываете, не тот, который используется.
  2. Другая сторона записывает файл без блокировки. Другими словами, он открыл файл в режиме общего доступа, который позволял другим сторонам читать и писать. Это было бы довольно необычно. Если это так, вам нужно исправить другой процесс.
  3. Удаленный файловый сервер поврежден и не соблюдает блокировки. Я считаю это весьма маловероятным.

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

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

+0

Спасибо за информацию. Я проанализировал серверы, и настоящая проблема заключается в том, что сервер, который начинает копировать файл на сопоставленный диск, не блокирует файл. Я смог переименовать его во время копирования. В этом случае реальная возможность решить проблему - это, вероятно, сравнить размер файла, чтобы узнать, растет ли он в течение нескольких секунд. – user2858981

+0

Это опция 2, затем –

+0

@ user2858981 Не только полагайтесь на проверку размера файла. Что делать, если другой процесс переписывает часть данных файла? Что делать, если другой процесс резервирует дисковое пространство, создав файл с конечным размером перед выполнением какой-либо операции копирования?Таким образом, максимальный размер файла botj и сопоставление временной метки последнего файла. – SilverWarior