Чтение онлайн

ЖАНРЫ

Советы по Delphi. Версия 1.4.3 от 1.1.2001

Озеров Валентин

Шрифт:

BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); { read chunk }

if BytesCopied > 0 then { if we read anything... }

FileWrite(Dest, CopyBuffer^, BytesCopied); { ...write chunk }

until BytesCopied < ChunkSize; { until we run out of chunks }

finally

FileClose(Dest); { close the destination file }

{ SetFileTimeStamp(Destination, TimeStamp);} { clone source's time stamp }{!!!}

end;

finally

FileClose(Source); { close the source file }

end;

 finally

FreeMem(CopyBuffer, ChunkSize); { free the buffer }

 end;

 FileSetDate(Dest,FileGetDate(Source));

end;

Хм. IMHO

крутовато будет такие функции писать, когда в большинстве случаев достаточно что-нубудь типа нижеприводимого, причем оно даже гибче, так как позволяет скопировать как весь файл пpи From и Count = 0, так и произвольный его кусок.

function CopyFile(InFile, OutFile: String; From, Count: Longint): Longint;

var InFS, OutFS: TFileStream;

begin

 InFS := TFileStream.Create(InFile, fmOpenRead);

 OutFS := TFileStream.Create(OutFile, fmCreate);

 InFS.Seek(From, soFromBeginning);

 Result := OutFS.CopyFrom(InFS, Count);

 InFS.Free;

 OutFS.Free;

end;

try..except расставляются по вкусу, а навороты вроде установки атрибутов, даты и времени файла и т.п. для ясности удалены, да и не нужны они в основном никогда.

Конечно, под Win32 имеет смысл использовать функции CopyFile, SHFileOperation.

Как получить имя папки pабочего стола (не чеpез registry)?

Nomadic советует:

Просто очень хочется поработать с shell functions.

В этом примере делается и это -

procedure TForm1.Button1Click(Sender: TObject);

 procedure madd(s:string);

 begin

memo1.lines.add(s);

 end;

VAR

 ppmalloc:imalloc;

 id:ishellfolder;

 pi:pitemidlist;

 lpname:tstrret;

begin

 if succeeded(shgetspecialfolderlocation(0, CSIDL_PROGRAMS, pi)) then begin

madd('Succeeded programs location');

if succeeded(shgetdesktopfolder(id)) then begin

madd('Succeeded get desktop folder');

if succeeded(id.getdisplaynameof(pi, 0, lpname)) then begin

madd('Succeeded get display name');

if lpname.uType=2 then begin

madd(lpname.cstr);

end;

end else madd('UnSucceeded get display name');

end else madd('UnSucceeded get desktop folder');

 end else madd('UNSucceeded programs location');

end;
 

Количество

строк в текстовом файле

Если файлы не слишком велики, вы можете сделать так:

List := TStringList.Create;

try

 List.LoadFromFile('C:\FILE.TXT');

 Gauge.MaxValue := List.Count;

finally

 List.Free;

end;

Мы читаем в память весь текст, и кроме подсчета строк этот код ничего не делает. Другая идея заключается в использовании не счетчика строк, а счетчика байт. В самом начале вы запрашиваете размер файла (используя функцию Delphi FileSize), и в цикле проходите все байты, как вы делали это со строками. Цикл может выглядеть примерно так (предположим, вы используете стандартный паскалевский тип TEXT):

Gauge.MaxValue := FileSize(TextFile);

Reset(TextFile);

while not eof(TextFile) do begin

 Readln(TextFile, Line);

 { Обработка строки }

 with Gauge do begin

Progress := Progress + Length(Line) + 2; { 2 для CR/LF }

Refresh;

 end;

end;
 

Копирование файлов IV

Igor Nikolaev aKa The Sprite советует:

Copyfile('C:\1.txt', 'C:\files\2.txt', 0);

где первый параметр – путь и имя нужного файла, а второй путь и имя нового(скопированого) файла

Если же необходимо задавать имена файлов через Edit, то:

Copyfile(PChar(edit1.text), PChar(edit2.text), 0);

Сеть

Как узнать доступные сетевые pесуpсы?

Поделиться с друзьями: