1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| procedure TForm1.Button1Click(Sender: TObject);
const
NTFS_IOCTLCODE_SET_SPARSE=$900C4;//Le controle code du SET_SPARSE
var
h : Thandle; //handle sur le fichier
Filesize : LARGE_INTEGER; // structure INT64
Filename : string;
Buffer :array[0..4] of byte;
BytesReturned: DWORD;
begin
Filename := 'C:\BIGFILE.TMP';//notre fichier sur le disque
//ouai je sais on aurait pu faire une boucle mais bon...
//la demo n'est pas là...
//Donc le buffer qu'on veut ecrire à la fin du gros fichier...
Buffer[0]:=115; //s
Buffer[1]:=97; //a
buffer[2]:=108; //l
buffer[3]:=117; //u
buffer[4]:=116; //t
// Un bon vieux create FILE
// pour la création du fichier ou un overwrite si'l existe
h := CreateFile(pchar(Filename),GENERIC_WRITE,FILE_SHARE_WRITE, nil,CREATE_ALWAYS,0,0);
//Premiere astuce on demande au filesystem
//de na pas inscrire les bytes à 00 dans le fichier lui meme mais de définir
//dans la mft l'endroit ou ils sont.
//on va donc travailler avec ce qu'on nomme un sparse file
DeviceIoControl(h, NTFS_IOCTLCODE_SET_SPARSE, nil, 0, nil, 0, BytesReturned, nil);//compression des 00
Filesize.QuadPart := 50000000000; //he he he on va reserver 50 Go!
setfilepointer(h,Filesize.LowPart,@Filesize.HighPart,FILE_BEGIN); // se place a l'octet Filesize.QuadPart
SetEndOfFile (h); // Deuxieme astuce alloue l'espace disque on est donc à la fin de notre
//gros fichier!
fileseek (h,-6,1);//mets le pointeur ou on veut (c'est a dire 6 Bytes avant la position actuelle)
FileWrite(h,buffer,sizeof(buffer));//on ecrit notre buffer à la fin
setfilepointer(h,0,nil,FILE_BEGIN); //et on revient au début
CloseHandle(h); //c'est fini
beep;//juste pour nous prevenir parce que ca va vite
//y'a plus qu'a ouvrir avec winhex le fichier et taaaddddaaa un fichier de 50 Go
//remplit de 0 juste avec salut à la fin
//tadaaa
end; |
Partager