Текущий архив: 2007.05.27;
Скачать: CL | DM;
ВнизTargetSource.CopyFrom(SourceSize, CopySize); Найти похожие ветки
← →
Garacio © (2007-05-09 11:57) [0]Помогите, пожалуйста, модернизировать код:
const
BlockSize = 65536;
. . .
var
ElapsedSize: Integer;
CopySize: Integer;
. . .
ElapsedSize := SourceStream.Size - SourceStream.Position;
while ElapsedSize > 0 do
begin
if ElapsedSize < BlockSize then
CopySize := ElapsedSize
else
CopySize := BlockSize;
TargetSource.CopyFrom(SourceSize, CopySize);
ElapsedSize := SourceStream.Size - SourceStream.Position;
end;
. . .
1. Как переделать этот код для копирования каталога (с подкаталогами)?
2. Я знаю, что сюда как-то можно приделать ProgressBar! Как это можно сделать?
3. Вопрос для знатоков: кроме XP и NT это будет работать в других ОС? А то я уже столкнулся с подобными ошибками!
← →
Johnmen © (2007-05-09 14:02) [1]У кого ты взял этот код с ошибками, у того и спрашивай.
Но тем не менее:
1. Никак, ибо он никаким образом не связан ни с каталогами, ни с файлами.
2. Только разобравшись в коде.
3. Нет, не будет работать. Например, в ОС7 ЕС.
← →
Rial © (2007-05-09 15:16) [2]1. Явно недостаточно скопировано кода.
Вообще очень подозрительно выбраны нужные строки.
2. Код содержит очевидные ошибки, даже без
раскрытия методов этих непонятных классов. Поищи.
3. Существует и не единственна операционка, на которых
это не будет работать. Пока что это вообще не работает. :)
4. Даже если все это заработает, то работать будет медленно,
т.к. методы .Position и .Size наверняка берут значения
не из переменных классов. %)
← →
Belorus © (2007-05-09 16:42) [3]> 4. Даже если все это заработает, то работать будет медленно,
>
> т.к. методы .Position и .Size наверняка берут значения
> не из переменных классов. %)
На основании чего такие выводы ?
Скорее всего обычное property Size read FSize; И всё.
← →
Rial © (2007-05-09 17:27) [4]
> [3] Belorus © (09.05.07 16:42)
> На основании чего такие выводы ?
> Скорее всего обычное property Size read FSize; И всё.
Честно говоря, не знаю, с какими классами работает автор...
Но посмотри для интереса реализацию этих методов
у TFileStream. Они правильные, но в данных случае это
не самое лучшее решение.
← →
Garacio © (2007-05-09 21:01) [5]Вот ещё код достал! Как всегда, блин, для файлов!
Как для каталога с подкаталогами и вложениями переделать?procedure FastFileCopy(const InfileName, OutFileName: string; SizeDone, SizeFile: LongInt);
const
BufSize = 3*4*4096;
type
PBuffer = ^TBuffer;
TBuffer = array [1..BufSize] of Byte;
var
Size : integer;
Buffer : PBuffer;
infile, outfile : file;
// SizeDone, SizeFile: Longint;
begin
if (InFileName <> OutFileName) then
begin
buffer := nil;
AssignFile(infile, InFileName);
System.Reset(infile, 1);
try
SizeFile := FileSize(infile);
AssignFile(outfile, OutFileName);
System.Rewrite(outfile, 1);
try
SizeDone := 0; New(Buffer);
repeat
BlockRead(infile, Buffer^, BufSize, Size);
Inc(SizeDone, Size);
FCopy.OneCopy.Progress := SizeDone;
FCopy.OneCopy.MaxValue := SizeFile;
BlockWrite(outfile,Buffer^, Size)
until Size < BufSize;
FileSetDate(TFileRec(outfile).Handle,
FileGetDate(TFileRec(infile).Handle));
finally
if Buffer <> nil then
Dispose(Buffer);
System.close(outfile)
end;
finally
System.close(infile);
end;
end
else
raise EInOutError.Create("File cannot be copied into itself");
end;
← →
Rial © (2007-05-09 21:12) [6]procedure CreateDirect(Const Name : String);
begin
If (DirectoryExists(Name))or(Length(Name) <= 0)then
Exit;
CreateDirect(ExtractFileDir(Name));
CreateDir(Name);
end;
procedure DirCopy(Const InName, OutName : String);
Var
SS : TSearchRec;
Result : Integer;
begin
CreateDirect(OutName);
Result :=FindFirst(InName + "\*.*", faAnyFile, SS);
While (Result=0) do begin
If (SS.Name <> ".")and(SS.Name <> "..") then
If (SS.Attr and faDirectory = 0) then FileCopy(InName + "\" + SS.Name, OutName + "\" + SS.Name)
else DirCopy(InName + "\" + SS.Name, OutName + "\" + SS.Name);
Result :=FindNext(SS);
end;
FindClose(SS);
end;
← →
Johnmen © (2007-05-09 21:31) [7]
> Вот ещё код достал!
Молодец! Такой стиль программирования сейчас самый модный!
← →
Garacio © (2007-05-10 10:45) [8]Спасибо, Rial © (09.05.07 21:12) [6] !!!
Вот только остаётся индикатор подладить:SizeDone := 0; // тут понятно - min=0
...
FCopy.OneCopy.Progress := SizeDone; //а как тут установить % от каталога, а не от файла?
FCopy.OneCopy.MaxValue := SizeFile; // тут я вычислю и установлю объём всего каталога
Страницы: 1 вся ветка
Текущий архив: 2007.05.27;
Скачать: CL | DM;
Память: 0.46 MB
Время: 0.041 c