Salut,
j'utilise un memory streams dans lequel j'écris un string (memorystream.write), quand j'essaie disons d'écrire un string de plus de 300 mb (en fais, j'utilise une fonction qui lit un fichier et l'écris dans un string), j'obtiens l'erreur "Out of memory while expanding memory stream"
pourtant la machine a encore beaucoup de ram disponible.
j'ai donc premièrement essayé mon code dans un nouveau projet, ça marchait très bien, finalement, j'ai fini par identifier ce qui cause le message d'erreur, si j'ajoute un savedialog sur la form, et que avant de faire l'opération, je fais savedialog.execute, ca me fais ce truc out of memory quand j'écris dans le streams,
j'utilise delphi 7, je ne sais pas si les autres versions de delphi causeront ce problème, mais c'est très embêtant, je ne sais pas trop comment régler ça.
pour utiliser le code, placez un gros fichier (plus de 300 mb) dans le C:\, appelez le "film.avi", ensuite créez 1 nouveau projet, ajouter un bouton et un savedialog.
si j'enlève "SaveDialog1.Execute;", ça marche, aucun problème.
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
49
50
51 function ReadFileString(FileName: String): Ansistring; var F: file; Buffer: Ansistring; Size: Integer; ReadBytes: Integer; DefaultFileMode: Byte; begin Result := ''; DefaultFileMode := FileMode; FileMode := 0; AssignFile(F, FileName); Reset(F, 1); if (IOResult = 0) then begin Size := FileSize(F); while (Size > 1024) do begin SetLength(Buffer, 1024); BlockRead(F, Buffer[1], 1024, ReadBytes); Result := Result + Buffer; Dec(Size, ReadBytes); end; SetLength(Buffer, Size); BlockRead(F, Buffer[1], Size); Result := Result + Buffer; CloseFile(F); end; FileMode := DefaultFileMode; end; procedure TForm1.Button1Click(Sender: TObject); var bufferBig: string; MemStream2: TMemoryStream; begin SaveDialog1.Execute; MemStream2 := TMemoryStream.Create; BufferBig := ReadFileString('C:\film.avi'); MemStream2.Write(BufferBig[1], Length(BufferBig)); end;
j'ai essayé SaveDialog1.free apres le execute, aucun effet.
J'aimerais beaucoup recevoir un peu d'aide, merci à l'avance!
Partager