Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Разбиение файла на фрагменты.

67K
01 июня 2011 года
Mr.Wolf72
7 / / 02.05.2011
Доброй день, форумчане! Я писал такой вопрос на cyberforum, но мне там, к сожалению, никто не ответил. Надеюсь на вашу помощь тут.
У меня есть файл, для работы с которым нужно разбить его на множество фрагментов, как это делает torrent. И в дальнейшем либо все эти фрагменты держать в памяти некоторое время(такой способ скорее всего отпадет, ведь будет уж сильно много сжирать ресов), либо же все эти фрагменты держать в созданной папке под моим определенным расширением. После работы с ними удаляем их всех. Помогите, пожалуйста, как такое реализовать, если очень сложно, то хотя бы вкратце. Надеюсь на вашу помощь:)
277
01 июня 2011 года
arrjj
1.7K / / 26.01.2011
В дельфи в справке (F1) с примерами есть:
FileOpen
FileSeek
FileRead
FileWrite
FileClose
DeleteFile
Или альтернативно TFileStream
19K
01 июня 2011 года
Alegun
269 / / 10.09.2010
Попробуйте собрать пример из DRKB:

Создайте новый проект и разместите на форме прогрессбар и пару баттонов

Клик первой кнопки (Разрезать файл):

Вызываем функцию SplitFile() с параметрами:
FileToSplit: Имя файла, который будем резать.
SizeofFiles: Размер файлов-кусочков в байтах (последний файл может быть и меньшего размера)
Progressbar: Индикатор хода процесса разбиения файла (передаётся просто имя Вашего прогрессбара)
Result: В результате получаем группу файлов с именами FileName.001, FileName.002, FileName.003 итд. (где FileName - как имя разрезанного файла)

Код:
{ 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;



Клик второй кнопки (Собрать файл):

Вызываем 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;



Пример использования:

Код:
// 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



Удаление кусочков можно циклом выполнить с помощью функции DeleteFile,

function DeleteFile(const FileName:String): удаляет файл с именем FileName и в случае успеха возвращает True.

а можно и другими способами их удалять. Вроде всё.
67K
01 июня 2011 года
Mr.Wolf72
7 / / 02.05.2011
Огромное спасибо!
14
01 июня 2011 года
Phodopus
3.3K / / 19.06.2008
А зачем его вообще бить на фрагменты физически? Торрент не бьет файл на фрагменты, только если логически - на части.
394
02 июня 2011 года
MegaMozg
317 / / 18.03.2006
Может это поможет
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог