[Back to FILES SWAG index]  [Back to Main SWAG index]  [Original]

{
Erik Appeldoorn

I've made a programm which erases a file absolutely and completely. Even when
it is undeleted it containes nothing.. So far so good.. But when I make a
sector-dump of the disk, it appears that there is still some text on the disk.
I don't get it. Nowhere in my programm I allocated text to memory, but the same
three sentences apear four times in the sector-dump. In the original file the
sentences begin at sentence number 1103. In the sector-dump the four blocks
appear at numbers 72 & 130 & 188 & 248. The totall dump is 251 sentences.
The floppy was newly formatted. What could be happening? Here's part of the
code.
}

var ZapFile:File;
    ZapFileName:String;
    ZapFilePos:Longint;
    Buffer:array [1..406] of byte;
    NumWritten, BufferSize, NumRead: word;

Procedure deleting(ZapFileName:string);
begin
    Buffersize:=SizeOf(Buffer);
    Assign(ZapFile,ZapFileName);
    {$I-}
    Reset(ZapFile,1);
    {$I+}
    repeat
        ZapFilePos:=FilePos(ZapFile);
        BlockRead(ZapFile,Buffer,BufferSize,NumRead);
        FillChar(Buffer,BufferSize,#255);
        Seek(ZapFile,ZapFilePos);
        BlockWrite(ZapFile,Buffer,NumRead,NumWritten);
    until (NumRead=0) or (NumWritten<>NumRead);
    close(ZapFile);
    Erase(ZapFile);
end;


{
Jan Doggen

I only had time to take a quick look; here are my suggestions:
- forget the reads
- make a CONST buffer, fill it with garbage or zeroes
  (*in* the proc, so that it takes only stack space)
- FS := FileSize(ZapFile)
  NrBlocks := FS DIV BufferSize
  LastBlockSize := FS MOD BufferSize
  For i:=1 to nrblocks blockwrite
  If lastblocksize<>0 write that amount (never mind that the buffer is
  larger)
  close the file
- forget the $I. You don't query IOResult after $I, so all subsequent
  I/O (on *all* files) goes wrong until you do. RTM.
- Instaed of this, use a FileExist function before you call your
  proc.
}

[Back to FILES SWAG index]  [Back to Main SWAG index]  [Original]