Thema: Delphi ReadFile

Einzelnen Beitrag anzeigen

Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#5

Re: ReadFile

  Alt 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
  Mit Zitat antworten Zitat