function SplitFile(FileName: TFileName; SizeofFiles: Int64; ProgressBar: TProgressBar; outputfolder: string): Boolean; var i: Word; fs, sStream: TFileStream; SplitFileName: string; BufferSize: Integer; begin ProgressBar.Position := 0; BufferSize := 2048; Result := False; if outputfolder[length(outputfolder)] <> '\' then outputfolder := outputfolder + '\'; fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try for i := 1 to Trunc(fs.Size / SizeofFiles) + 1 do begin SplitFileName := outputfolder + ExtractFileName(FileName) + '.' + FormatFloat('000', i); sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive); try repeat if fs.Size - fs.Position < BufferSize then BufferSize := fs.Size - fs.Position; sStream.CopyFrom(fs, BufferSize); ProgressBar.Position := Round((fs.Position / fs.Size) * 100); Application.ProcessMessages; until (sStream.Position >SizeofFiles) or (fs.Size fs.Position); finally sStream.Free; end; end; finally fs.Free; end; Result := True; end;
procedure TForm7.Button1Click(Sender: TObject); begin // $100000000 ==> 4 Go // $E0000000 ==> 3.5 Go if OpenDialog1.Execute then if SplitFile(OpenDialog1.FileName, $E0000000, ProgressBar1, ExtractFilePath(OpenDialog1.FileName) + 'Splitt') then ShowMessage('Copie Terminée'); end;
ExtractFilePath(OpenDialog1.FileName) + 'Splitt'
est ce que D4 est capable d'ouvrir un fichier > 4 Go et d'en renvoyer la taille ?
classe d'exception EReadError avec le message 'Erreur de lecture du flux'
function TStream.CopyFrom(Source: TStream; Count: Int64): Int64;
function TStream.CopyFrom(Source: TStream; Count: Longint): Longint;
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionLe problème de limitation que tu rencontres provient du fait que tu ais choisi le type Integer pour la variable "SizeOfFiles" à la place d'utiliser Int64 dont l'étendue est plus grande.
9 févr. 2020 à 16:30