Bonjour, comme certains le savent, je travaille en ce momment sur des très gros fichiers.

Au fait pardon Shai le troll pour mon manque de répondant alors que tu voulais me donner un coup de main, mais je n'ai plus une seconde à moi. J'apprecie ton aide quand meme!

Ca fait un moment que je tourne en rond pour savoir comment creer par exemple un fichier disons d'un Terra octet (LoL pas encore essayé) vide (enfin plein de 00).

Et pouvoir ecrire instantannément à la fin du fichier.

Le but étant de cloner des HDD en backward... (du coup je travaille aussi sur les commandes ATA mais c'est une autre histoire)

Alors voilà une astuce...
Encore au stade experimentale.
Donc si vous ne savez pas ce que vous faites, gafffffee.

Mais ca peut servir a d'autres. (he he he y'en a ici qui sont sur le meme projet que moi hein thunderlord?)

Et heuuu... C'est un peut "dirty", vu que j'ai calculé certains IOCTL code à la main...

Bref... Proof of concept.

Passons en avant premiere à la creation d'un fichier de 50 Go, remplit de 0x00 avec un petit message à la fin. A aller lire avec winhex ou autre pour s'en persuader.

Et tout ca en pif paf pouf ... No time!

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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;

Bon je ne sais pas si c'est la seule methode...
En tout cas c'est la seule que j'ai trouvé qui ne prenne pas des plombes.

Vos avis sont les bienvenus.