Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
ВнизКак разрезать файл на куски Найти похожие ветки
← →
AlickSnegov (2003-05-20 13:29) [0]Есть такая задача. Существует файл приблизительно следующей структуры: Заголовок_Блок1_Блок2_..._БлокN. Блоки различной длины. Можно подсчитать длину каждого блока. Эти блоки нужно сохранить в отдельные файлы. Перебирать же побайтно весь файл тоскливо. Может кто-нибудь подскажет как это решить по другому. Может API специально под такие дела заточенная есть?
← →
Skier (2003-05-20 13:31) [1]BlockRead
BlockWrite ?
← →
Yanis (2003-05-20 13:37) [2]
// Split file / File splitten
{
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);
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);
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;
Попробуй, взял я это с фака, на ... непомню вобщем.
← →
AlickSnegov (2003-05-21 10:15) [3]Спасибо, Yanis! Разбивать файл при помощи TFileStream действительно получается, только вот как в потоке осуществлять поиск подстроки не могу понять. Может подкинешь идею?
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.06.02;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.007 c