Fórum Como dividir arquivos em pedaços menores? #270495

28/02/2005

0

Olá galera, gostaria de saber como dividir arquivos grandes (de qualquer extensão) em pedaços menores, ou por quantidade de bytes ou por quantidade de arquivos divididos? Se puderem me passar o código pra estudar, prefiro!


Jc

Jc

Responder

Posts

01/03/2005

Marcelo Saviski

vc podeia tentar abrir o arquivo numa Stream e escrever ewm outras Streams ele por partes, tipo:
const
  MaxFileSize = 50*1024; //50Kb
var
  NomeArquivo, NomeArquivosFilhos: TFileName;
  Arquivo: TStream;
  I, FileSize: Integer;
  Buffer: array[0..MaxFileSize -1] of Byte;
begin
  NomeArquivo := ´ArquivoX´;
  NomeArquivosFilhos := ChangeFileExt(NomeArquivos, ´.parte¬d.dat´);
  I := 1;
  with TFileStream.Create(Arquivo, fmOpenRead or fmShareDenyWrite);  
  try
    while Position < Size do
    begin
      Arquivo := TFileStream.Create(Format(NomeArquivosFilhos, [I]), fmCreate);
      FileSize := MaxFileSize;
      if FileSize > Size - Position then
        FileSize := Size - Position;
      ReadBuffer(Buffer, FileSize);
      Arquivo.WriteBuffer(Buffer, FileSize);
      Arquivo.Free;
      Inc(I);
    end;
  finally
    Free;
  end;
end;


Eu não testei :wink: , então se puder me dizer se funciona


Responder

Gostei + 0

01/03/2005

Marcelo Saviski

Depois para juntar de volta, vc deveria abrir todos as partes do arquivo e salvar tudo num só devolta


Responder

Gostei + 0

02/03/2005

Jc

Olá galera... e ai Marcelo, valeu pela força.
Acabei encontrando na net uma ajudinha que caiu perfeitamente (claro que deve ser feitos alguns ajustes).
Vejam ai abaixo:

// Split file / Dividir arquivo { Parametros: FileToSplit: Especificar um arquivo para divisão. SizeofFiles: Especificar o tamanho dos arquivos divididas (em bytes). Progressbar: Especificar a TProgressBar para mostrar o progresso da divisão. Resultado: SplitFile() criará os arquivos FileName.001, FileName.002, FileName.003 e assim por diante, e terão o tamanho em bytes definidos em SizeofFiles. } function SplitFile(FileName: TFileName; SizeofFiles: Integer; ProgressBar: TProgressBar): Boolean; var i: Word; fs, sStream: TFileStream; SplitFileName: String; begin ProgressBar.Position := 0; fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try for i := 1 to Trunc(fs.Size / SizeofFiles) + 1 do begin SplitFileName := ChangeFileExt(FileName, ´.´+ FormatFloat(´000´, i)); sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive); try if fs.Size - fs.Position < SizeofFiles then SizeofFiles := fs.Size - fs.Position; sStream.CopyFrom(fs, SizeofFiles); ProgressBar.Position := Round((fs.Position / fs.Size) * 100); finally sStream.Free; end; end; finally fs.Free; end; end;


// Combine files / Juntar arquivos { Parametros: FileName: Especificar o primeiro dos arquivos da divisão (.001) CombinedFileName: Especifique o nome combinado do arquivo (o arquivo a ser salvo) Resultado: CombineFiles() criará um arquivo das divisões informadas. } function CombineFiles(FileName, CombinedFileName : TFileName) : Boolean; var i: integer; fs, sStream: TFileStream; filenameOrg: String; begin i := 1; fs := TFileStream.Create(CombinedFileName, fmCreate or fmShareExclusive); try while FileExists(FileName) do begin sStream := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try fs.CopyFrom(sStream, 0); finally sStream.Free; end; Inc(i); FileName := ChangeFileExt(FileName, ´.´+ FormatFloat(´000´, i)); end; finally fs.Free; end; end;


// Exemplos de uso: procedure TForm1.Button1Click(Sender: TObject); begin SplitFile(´C:\temp\FileToSplit.chm´,1000000, ProgressBar1); end; procedure TForm1.Button2Click(Sender: TObject); begin CombineFiles(´C:\temp\FileToSplit.001´,´H:\temp\FileToSplit.chm´); end;



Responder

Gostei + 0

20/05/2005

Delphi32

Olá! Achei este tópico antigo por pesquisa e tenho algumas dúvidas com relação a esse código postado acima:

1) Como poderia fazer para no primeiro arquivo eu colocar sempre uma identificação no início (cabeçalho) do arquivo. Queria fazer isso porque queria que o programa verificasse se esse era um arquivo válido. E o modo de validação seria procurar por essa indentificação no cabeçalho do primeiro arquivo.

2) E como eu teria que modificar a rotina de juntar os arquivos para na hora de formar o arquivo ele ignorasse a identificação?


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar