Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
Lazarus
|
Re: ReadFile
28. Feb 2010, 22:38
Zitat von sx2008:
Delphi-Quellcode:
function FileToString(const AFileName: string): AnsiString;
var
f: TFileStream;
l: Integer;
begin
Result := '';
f := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite);
try
l := f.Size;
if L > 0 then
begin
SetLength(Result, l);
F.ReadBuffer(Result[1], l);
end;
finally
F.Free;
end;
end;
Hier wird aber Speicher in der einfachen Grösse der Datei verwendet.
Man sollte die Funktion schnell entsorgen bevor sie im Internet immer weiter kopiert wird.
Hier der Ersatz:
Delphi-Quellcode:
function FileToMap(const AFileName: AnsiString; out cbSize, dwError: DWORD): pointer;
var
hFile, hMap: DWORD;
begin
result := nil;
dwError := NO_ERROR;
hFile := CreateFile(PAnsiChar(AFileName), GENERIC_READ, 0, nil, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if hFile <> INVALID_HANDLE_VALUE then begin
cbSize := GetFileSize(hFile, nil);
if cbSize <> INVALID_FILE_SIZE then begin
hMap := CreateFileMapping(hFile, nil, PAGE_READONLY or SEC_COMMIT, 0,
cbSize, nil);
if (hMap <> 0) then begin
result := MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
CloseHandle(hMap);
end else
dwError := GetLastError;
end else
dwError := GetLastError;
CloseHandle(hFile);
end else
dwError := GetLastError;
end;
// EDIT: nach gebrauch mit
Delphi-Quellcode:
UnmapViewOfFile(Pointer);
aufräumen.
Lanthan Astat 06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
|
|
Zitat
|