Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
1-2994
Пубертанец
2003-05-21 16:28
2003.06.02
Как в OnShow формы уничтожать ее при определенных условиях?


6-3034
StarGer
2003-04-03 09:08
2003.06.02
Почта. Indy + Koi-8 = =?koi8-r?Q?=D001020301=2Ezip?=


3-2786
VladN
2003-05-14 13:30
2003.06.02
Как в SQL запросе, сортировка в обратном порядке?


3-2826
Cranium
2003-05-12 20:58
2003.06.02
Как в клиентском приложении корректно обработать ситуацию ...


3-2772
td
2003-05-13 19:48
2003.06.02
dbiDoRestructure





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский