![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Закончилась ли операция чтения\записи [XP]
petvv © (2011-04-21 09:12:00)В программе разархивирую файл
DecompressFile(FullPath,ExtractFilePath(paramstr(0))+'TRK\Temp1.db',False,True,Nil,0,100,'');
// sleep(2000);
MoveFile(PChar(FullPath),PChar(ExtractFilePath(paramstr(0))+'ARCHIV\'+ExtractFileName(FullPath)));
Разархивация происходит нормально, но если опустить sleep то следующая инструкося не выполняется или выполняется не всегда, похоже винда не успевает закончить работу с архивом.
Вот собственно вопрос, как это отследить, что файлик освободился, а то со слипом чёто как то криво.
oldman (2011-04-21 10:29:00) [1]
> if progress<>nil then needProgress:=true;
> if needprogress then
круто!!!
petvv (2011-04-21 10:25:00) [2]нет не одно и тоже, но это не означает, что такую конструкосю я не пробовал
oldman (2011-04-21 10:08:00) [3]
> petvv (21.04.11 10:01) [6]
По твоему
fun1();
fun2();
и
if fun1() then fun2();
одно и тоже?
brother (2011-04-21 10:03:00) [4]> if refreshWnd then
> Application.ProcessMessages;
попробуй закомментировать эту строчку и без слипа попробовать...
petvv (2011-04-21 10:01:00) [5]
> if DecompressFile(FullPath,ExtractFilePath(paramstr(0))+'TRK\Temp1.
> db',False,True,Nil,0,100,'') then MoveFile(PChar(FullPath),
> PChar(ExtractFilePath(paramstr(0))+'ARCHIV\'+ExtractFileName(FullPath)));
> ???
я про это и писал, что если опустить слип, то перемещение не происходит читай первый пост
oldman (2011-04-21 09:46:00) [6]и в функции твоей, имхо, result:=true; не там стоит...
oldman (2011-04-21 09:44:00) [7]if DecompressFile(FullPath,ExtractFilePath(paramstr(0))+'TRK\Temp1.db',False,True,Nil,0,100,'') then
MoveFile(PChar(FullPath),PChar(ExtractFilePath(paramstr(0))+'ARCHIV\'+ExtractFileName(FullPath)));
???
petvv (2011-04-21 09:27:00) [8]
function DecompressFile;
var
source,dest:TFileStream;
decompressStream:TDecompressionStream;
bytesread:integer;
bytesread_d:int64;
interval:integer;
zena_byta:real;
mainbuffer:array[0..buffer_size-1] of char;
needProgress:boolean;
begin
needprogress:=false;
source:=TFileStream.Create(sourcefile,fmOpenRead);
if needcreate then
dest:=TFileStream.Create(destinationfile,fmCreate)
else
dest:=TFileStream.Create(destinationfile,fmOpenWrite);
decompressStream:=TDecompressionStream.Create(source);
result:=true;
interval:=max_value-min_value;
zena_byta:=interval/source.Size;
bytesread_d:=0;
if progress<>nil then needProgress:=true;
if needprogress then
begin
SetPropValue(TObject(progress^),PositionPropName,min_value);
end;
try
repeat
bytesread:=decompressStream.Read(mainbuffer,buffer_size);
dest.Write(mainbuffer,bytesread);
bytesread_d:=bytesread_d+bytesread;
if refreshWnd then
Application.ProcessMessages;
if needprogress then
begin
if bytesread_d>source.Size then
begin
zena_byta:=interval/bytesread_d;
end;
SetPropValue(TObject(progress^),PositionPropName,min_value+round(bytesread_d*zena_byta));
end;
until bytesread<buffer_size;
except
result:=false;
decompressStream.Free;
source.Free;
dest.Free;
exit;
end;
decompressStream.Free;
source.Free;
dest.Free;
end;
petvv (2011-04-21 09:21:00) [9]это функция возвращаемое значение Boolean
brother (2011-04-21 09:16:00) [10]DecompressFile это процедура или функция? И лучше покажи ее код...