Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.46 MB
Время: 0.017 c
3-2744
Studentik
2003-05-12 10:43
2003.06.02
InterBase и WebModule вместе работать не могут...


14-3051
Денис
2003-05-14 00:42
2003.06.02
Помогите, пожалуйста. Очень надо!!! (диплом)


1-2856
sapsi
2003-05-22 10:32
2003.06.02
Команда для активизации окна


3-2743
Карелин Артем
2003-05-13 10:13
2003.06.02
Рост базы после отката.


1-2920
marat111
2003-05-22 19:12
2003.06.02
Перетаскиваемые компоненты




   Наверх