{
Parameters:
FileToSplit: Specify a file to split.
SizeofFiles: Specify the size of the files you want to split to (in bytes)
Progressbar: Specify a TProgressBar to show the splitting progress
Result:
SplitFile() will create files FileName.001, FileName.002, FileName.003 and so on
that are SizeofFiles bytes in size.
}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);
tryfor i := 1 to Trunc(fs.Size / SizeofFiles) + 1 dobegin
SplitFileName := ChangeFileExt(FileName, '.'+ FormatFloat('000', i));
sStream := TFileStream.Create(SplitFileName, fmCreate or fmShareExclusive);
tryif 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 / Dateien zusammenfьhren {
Parameters:
FileName: Specify the first piece of the splitted files
CombinedFileName: Specify the combined file name. (the output file)
Result:
CombineFiles() will create one large file from the pieces
}function CombineFiles(FileName, CombinedFileName : TFileName) : Boolean;
var
i: integer;
fs, sStream: TFileStream;
filenameOrg: String;
begin
i := 1;
fs := TFileStream.Create(CombinedFileName, fmCreate or fmShareExclusive);
trywhile FileExists(FileName) dobegin
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;
// Examples: 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;
Привет! Я переведу контент на русский язык.
Функция SplitFile()
Эта функция принимает три параметра:
FileName: имя файла, который нужно разбить.
SizeofFiles: размер в байтах каждого кусочка файла.
ProgressBar: контроллер прогресс-бара для отображения процесса разделения.
Функция создает объект TFileStream (fs) и открывает указанный файл для чтения. Затем она проходит по файлу, делив его на более мелкие части в соответствии с параметром SizeofFiles. Каждая часть сохраняется как новый файл с расширением в формате "FileName.001", "FileName.002" и т.д.
Прогресс-бар обновляется после создания каждой части.
Функция CombineFiles()
Эта функция принимает два параметра:
FileName: имя первого куска разделенных файлов.
CombinedFileName: имя выходного файла, который будет скомбинирован из всех частей.
Функция создает объект TFileStream (fs) и открывает указанный выходной файл для записи. Затем она проходит по каждому куску файла, читая его из оригинального местоположения и копируя в выходной файл.
Пример использования
В примере, когда кнопка Button1 нажата, функция SplitFile() вызывается с параметрами 'C:\temp\filetosplit.chn', 1000000 и ProgressBar1. Это разбивает файл на части размером 1000000 байт каждая.
Когда кнопка Button2 нажата, функция CombineFiles() вызывается с параметрами 'C:\temp\FileToSplit.001' и 'H:\temp\filetosplit.chn'. Это комбинирует все разделенные файлы обратно в одиночный файл в указанном выходном месте.
Альтернативное решение
Вместо использования прогресс-бара для отображения процесса разделения, можно использовать болееadvanced метод, например, отображение сообщения статуса или процента выполнения. Например:
Код обновляет прогресс-бар и статус-лэйбл с процентом выполнения, когда файл разбивается.
Пособие для разрезания и соединения файлов в программировании на Delphi, с помощью функций SplitFile и CombineFiles, которые позволяют разбить большой файл на более мелкие и объединить их обратно.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.