Einzelnen Beitrag anzeigen

Benutzerbild von ErazerZ
ErazerZ

Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
 
Delphi 2007 Enterprise
 
#4

Re: teil einer datei entfernen

  Alt 4. Feb 2007, 14:08
Ich habe einmal eine funktion für mich zusammengeschrieben die einen Teil einer Datei einfach rauslöscht und den rest anhängt.
Delphi-Quellcode:
function CutFile(Filename: string; FromOffset, Count: Cardinal): Cardinal;
var
  hFile: THandle;
  dwSize, dwCopyFrom, dwCopyLength,
  lpNumberOfBytesRead: Cardinal;
  lpBuffer: Pointer;
begin
  Result := Cardinal(-1);
  hFile := CreateFile(PChar(Filename), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0);
  if (hFile <> INVALID_HANDLE_VALUE) then
  begin
    dwSize := GetFileSize(hFile, nil);
    if (dwSize >= (FromOffset + Count)) then
    begin
      dwCopyFrom := FromOffset + Count;
      dwCopyLength := dwSize - (FromOffset + Count);
      if dwCopyLength = 0 then
      begin
        SetFilePointer(hFile, FromOffset, nil, FILE_BEGIN);
        SetEndOfFile(hFile);
        Result := dwSize - Count;
      end else
      begin
        lpBuffer := VirtualAlloc(nil, dwCopyLength, MEM_COMMIT, PAGE_READWRITE);
        if (lpBuffer <> nil) then
        begin
          SetFilePointer(hFile, dwCopyFrom, nil, FILE_BEGIN);
          ReadFile(hFile, lpBuffer^, dwCopyLength, lpNumberOfBytesRead, nil);
          if (lpNumberOfBytesRead = dwCopyLength) then
          begin
            SetFilePointer(hFile, FromOffset, nil, FILE_BEGIN);
            SetEndOfFile(hFile);
            WriteFile(hFile, lpBuffer^, dwCopyLength, lpNumberOfBytesRead, nil);
            if (lpNumberOfBytesRead = dwCopyLength) then
            begin
              VirtualFree(lpBuffer, 0, MEM_RELEASE);
              Result := dwSize - Count;
            end;
          end;
        end;
      end;
    end else
    begin
      if (FromOffset < dwSize) then
      begin
        SetFilePointer(hFile, FromOffset, nil, FILE_BEGIN);
        SetEndOfFile(hFile);
        Result := FromOffset;
      end;
    end;
  end;
  CloseHandle(hFile);
end;
  Mit Zitat antworten Zitat