2015-02-19 1 views
0

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

Я попытался следующие:

-check, если файл находится в использовании => не работает, потому что файл не заблокирован exclusively.I может переименовать его, пока он записывается на ленточном накопителе.

-get the last access filestamp compare => не работает. Я должен получить сообщение об ошибке, потому что изменяются атрибуты файла, но я не уверен.

-get размер файла => не работает. он уже показывает мне окончательный размер файла.

Есть ли способ обнаружить рост файла, чтобы я мог подождать, пока он не закончится? Все тесты, перечисленные выше, работают нормально в локальных файлах, но не на этом подключенном диске, где файлы написаны сторонним инструментом. Если используется проводник и нажмите F5, я вижу, что размер файла растет.

+1

Вы должны устранить корень проблемы. –

+0

@ David - значит, это единственный способ, или что он нуждается в исправлении? –

+0

Должны ли мы это взять, у вас нет контроля над писателем-приложением? –

ответ

0

Благодаря всем полученным предложениям мне удалось найти решение. Поиск через Интернет Мне удалось получить функцию, которая получает размер файла в байтах, как он отображается в обозревателе. Проблема заключалась в том, что для работы я должен был ждать 5 секунд, прежде чем принимать второе значение из свойств файла. Это работает, но для того, чтобы быть пригодным для использования в системе автоматизации, я должен заставить ее работать в отдельном потоке, потому что мне нужно использовать это в цикле (for i:=listbox1.items.count-1 downto 0 do begin), чтобы проверить все файлы из списка, чтобы узнать, какие из них можно обработать ,

function GetFileSize_mmg(const FileName: string): Int64; 
var 
    fad: TWin32FileAttributeData; 
begin 
    if not GetFileAttributesEx(PChar(FileName), GetFileExInfoStandard, @fad) then 
    RaiseLastOSError; 
    Int64Rec(Result).Lo := fad.nFileSizeLow; 
    Int64Rec(Result).Hi := fad.nFileSizeHigh; 
end; 


function does_size_changes(filename:string; delay:integer;memo_loguri:Tmemo): boolean; 
var size1,size2:int64; 
begin 
result:=false; 
size1:=GetFileSize_mmg(filename); 
sleep(delay); 
size2:= GetFileSize_mmg(filename); 

if size1 <> size2 then 
begin 
result:=true; 
memo_loguri.Lines.Add(datetimetostr(now)+' - file "'+filename+'" is growing: ' +inttostr(size1)+' < '+inttostr(size2)); 
end 

else 
begin 
result:=false; 
memo_loguri.Lines.Add(datetimetostr(now)+' - file "'+filename+'" can be used: '+ inttostr(size1)+' = '+inttostr(size2)); 
end; 
end; 

Благодаря