Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.02;
Скачать: CL | DM;

Вниз

Как разрезать файл на куски   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.016 c
3-2738
АлексейТ
2003-05-13 00:07
2003.06.02
Работа с BDE


14-3065
Swift
2003-05-15 21:21
2003.06.02
новичок в Delphi. Первые вопросы.


4-3217
sucer
2003-03-23 15:46
2003.06.02
Как поставить Hook


7-3194
QUE
2003-04-01 11:08
2003.06.02
Rasapi


14-3166
Вячеслав
2003-05-15 11:32
2003.06.02
Гидравлика теплотехника