Como dividir arquivos em pedaços menores?
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
Curtidas 0
Respostas
Marcelo Saviski
28/02/2005
vc podeia tentar abrir o arquivo numa Stream e escrever ewm outras Streams ele por partes, tipo:
Eu não testei :wink: , então se puder me dizer se funciona
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
GOSTEI 0
Marcelo Saviski
28/02/2005
Depois para juntar de volta, vc deveria abrir todos as partes do arquivo e salvar tudo num só devolta
GOSTEI 0
Jc
28/02/2005
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:
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;
GOSTEI 0
Delphi32
28/02/2005
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?
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?
GOSTEI 0