Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.49 MB
Время: 0.05 c
15-1177613059
Некроман_тус
2007-04-26 22:44
2007.05.27
Архив...


2-1178476227
Dr.M@$
2007-05-06 22:30
2007.05.27
read write pixel (hight fps)


15-1177855274
Cj
2007-04-29 18:01
2007.05.27
Статья на сайт


2-1178534180
=Teddy=
2007-05-07 14:36
2007.05.27
Как установить фокус в Stringgride для конкретной ячейке?


3-1165474104
George
2006-12-07 09:48
2007.05.27
Права записи в InterBase