TimeStamp := FileAge(FileName); { get source's time stamp }
GetMem(CopyBuffer, ChunkSize); { allocate the buffer }
try
Source := FileOpen(FileName, fmShareDenyWrite); { open source file }
ifSource < 0 then raiseEFOpenError.Create(FmtLoadStr(SFOpenError, [FileName]));
try
Dest := FileCreate(Destination); { create output file; overwrite existing }
ifDest < 0 then raiseEFCreateError.Create(FmtLoadStr(SFCreateError, [Destination]));
try
repeat
BytesCopied := FileRead(Source, CopyBuffer^, ChunkSize); { read chunk }
ifBytesCopied > 0 then{ if we read anything... }
FileWrite(Dest, CopyBuffer^, BytesCopied); { ...write chunk }
untilBytesCopied < 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, так и произвольный его кусок.
functionCopyFile(InFile, OutFile: String; From, Count: Longint): Longint;
varInFS, 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.
В этом примере делается и это -
procedureTForm1.Button1Click(Sender: TObject);
proceduremadd(s: string);
begin
memo1.lines.add(s);
end;
VAR
ppmalloc:imalloc;
id:ishellfolder;
pi:pitemidlist;
lpname:tstrret;
begin
ifsucceeded(shgetspecialfolderlocation(0, CSIDL_PROGRAMS, pi)) thenbegin
madd('Succeeded programs location');
ifsucceeded(shgetdesktopfolder(id)) then begin
madd('Succeeded get desktop folder');
ifsucceeded(id.getdisplaynameof(pi, 0, lpname)) then begin
madd('Succeeded get display name');
iflpname.uType=2 then begin
madd(lpname.cstr);
end;
end elsemadd('UnSucceeded get display name');
end elsemadd('UnSucceeded get desktop folder');
end elsemadd('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 noteof(TextFile) do begin
Readln(TextFile, Line);
{ Обработка строки }
withGauge do begin
Progress := Progress + Length(Line) + 2; { 2 для CR/LF }
Refresh;
end;
end;
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сы?
Nomadicсоветует:
Вот пример:
type
PNetResourceArray = ^TNetResourceArray;
TNetResourceArray = array[0..MaxInt divSizeOf(TNetResource) - 1] ofTNetResource;
ProcedureEnumResources(LpNR:PNetResource);
Var
NetHandle: THandle;
BufSize: Integer;
Size: Integer;
NetResources: PNetResourceArray;
Читать дальше