Cuando leo la pregunta que está pidiendo que elimine el contenido de un archivo comenzando desde el principio del archivo. En otras palabras, desea eliminar contenido al comienzo del archivo y cambiar el contenido restante.
Esto no es posible. Solo puede truncar un archivo desde el final, no desde el principio. Deberá copiar el contenido restante en un archivo nuevo o copiarlo usted mismo dentro del mismo archivo.
Sin embargo, no hay atajos de manera eficiente para hacer esto. Tienes que copiar los datos, por ejemplo, como describe @kobik.
Raymond Chen escribió un buen artículo sobre este tema: How do I delete bytes from the beginning of a file?
Sólo por diversión, aquí es una implementación simple de un método basado en la corriente para eliminar el contenido de cualquier parte del archivo. Puede usar esto con una secuencia de archivos de lectura/escritura. No he probado el código, ¡te lo dejo!
procedure DeleteFromStream(Stream: TStream; Start, Length: Int64);
var
Buffer: Pointer;
BufferSize: Integer;
BytesToRead: Int64;
BytesRemaining: Int64;
SourcePos, DestPos: Int64;
begin
SourcePos := Start+Length;
DestPos := Start;
BytesRemaining := Stream.Size-SourcePos;
BufferSize := Min(BytesRemaining, 1024*1024*16);//no bigger than 16MB
GetMem(Buffer, BufferSize);
try
while BytesRemaining>0 do begin
BytesToRead := Min(BufferSize, BytesRemaining);
Stream.Position := SourcePos;
Stream.ReadBuffer(Buffer^, BytesToRead);
Stream.Position := DestPos;
Stream.WriteBuffer(Buffer^, BytesToRead);
inc(SourcePos, BytesToRead);
inc(DestPos, BytesToRead);
dec(BytesRemaining, BytesToRead);
end;
Stream.Size := DestPos;
finally
FreeMem(Buffer);
end;
end;
En realidad, la referencia al archivo disperso es bastante engañosa. No se trata de ** borrar ** N bytes en el desplazamiento 0, sino ** ajustar ** región de 0..N-1 bytes en ceros (o cualquier valor de byte de relleno preestablecido) – OnTheFly
@user Disculpe, qué es ¿engañoso? –
¡Eres increíble! Gracias David, ¡eso fue todo! – TheDude