{ 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);
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;
Разбиение файла на фрагменты.
У меня есть файл, для работы с которым нужно разбить его на множество фрагментов, как это делает torrent. И в дальнейшем либо все эти фрагменты держать в памяти некоторое время(такой способ скорее всего отпадет, ведь будет уж сильно много сжирать ресов), либо же все эти фрагменты держать в созданной папке под моим определенным расширением. После работы с ними удаляем их всех. Помогите, пожалуйста, как такое реализовать, если очень сложно, то хотя бы вкратце. Надеюсь на вашу помощь:)
FileOpen
FileSeek
FileRead
FileWrite
FileClose
DeleteFile
Или альтернативно TFileStream
Создайте новый проект и разместите на форме прогрессбар и пару баттонов
Клик первой кнопки (Разрезать файл):
Вызываем функцию SplitFile() с параметрами:
FileToSplit: Имя файла, который будем резать.
SizeofFiles: Размер файлов-кусочков в байтах (последний файл может быть и меньшего размера)
Progressbar: Индикатор хода процесса разбиения файла (передаётся просто имя Вашего прогрессбара)
Result: В результате получаем группу файлов с именами FileName.001, FileName.002, FileName.003 итд. (где FileName - как имя разрезанного файла)
Код:
Клик второй кнопки (Собрать файл):
Вызываем CombineFiles() с параметрами:
FileName: Имя первого файла-кусочка (FileName.001)
CombinedFileName: Имя выходного файла (его мы будем собирать из кусочков)
Result: В результате, его мы и получим
Код:
// Combine files / Dateien zusammenfuhren
{
CombineFiles()
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);
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;
{
CombineFiles()
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);
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;
Пример использования:
Код:
// 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;
//©Drkb::03177
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;
//©Drkb::03177
Удаление кусочков можно циклом выполнить с помощью функции DeleteFile,
function DeleteFile(const FileName:String): удаляет файл с именем FileName и в случае успеха возвращает True.
а можно и другими способами их удалять. Вроде всё.
Огромное спасибо!
А зачем его вообще бить на фрагменты физически? Торрент не бьет файл на фрагменты, только если логически - на части.