Registriert seit: 27. Mai 2005
Ort: Baden
315 Beiträge
Delphi 2007 Enterprise
|
Re: teil einer datei entfernen
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;
|
|
Zitat
|