![]() |
|
|
|
|
#1
|
|||
|
|||
|
Всем привет!!! У меня такая проблемма вернее их даже 3 надеюсь поможите или дадите совет. Так вот написал я функцию записи нескольких файлов разных форматов в один и запихнул её в dll вот эта функция:
Код:
function WriteBase(ListBox: TListBox; OutFile: String): Boolean;
var
I: Integer;
begin
try
Memory := TMemoryStream.Create;
for I := 0 to ListBox.Count - 1 do
begin
InputFile := TFileStream.Create(ListBox.Items.Strings[i], fmOpenRead);
Memory.Seek(0, soFromEnd);
Memory.CopyFrom(InputFile, InputFile.Size);
InputFile.Free;
end;
finally
Memory.SaveToFile(OutFile);
Memory.Free;
Result := True;
end;
end; тут вроде всё просто список файлов берётся с ListBoxа затем поочереди файлы открываются для чтения и копируются в память затем содержимое памяти сохраняется в файл. И так вопросы после сохранения памити выводится такая фигня "Project D:\Программирование\Маiп Project [Delphi]\Write_basefile.exe faulted with message: "access violation at 0x003359b1: write of address 0x00030d04l. Process Stopped. Use Step or Run to continue." хотелось бы знать что это за ошибка ипочему она возникает? Второй вопрос как в этот же файл сохранить ещё и текст скажем из Мемо? И третий вопрос вот если я не ошибаюсь функция чтения этого файла должна иметь такой вид [позиция чтения] [колличество байт которые будут считываться] [файл куда это будет сохранено] Пример! Записали в файл 3 изображения. Теперь изображение 2 необходимо вытащить из этого файла как узнать позицию с которой начинается 2е изображение и скалько байт должно быть прочитанно. как это узнать. заранее благодарен всем. Также хотклось бы прочитать ваши комментарии по моей функции плохие и хорошие. ![]() Последний раз редактировалось Admin, 14.10.2010 в 21:05. |
|
#2
|
||||
|
||||
|
MemoryStream тут совершенно не подходит(а если файлы в несколько гигов?)
Код:
function WriteBase(ListBox: TListBox; OutFile: String): Boolean;
var
I: Integer;
sz:int64;
InF, OutF:TFileStream;
begin
Result:=false;
try
OutF := TFileStream.Create(OutFile, fmCreate);
i:=ListBox.Count;
OutF.Write(i, SizeOf(Integer)); //сохраняем количество файлов
for I := 0 to ListBox.Count - 1 do
begin
InF := TFileStream.Create(ListBox.Items.Strings[i], fmOpenRead);
sz:=InF.Size;
OutF.Write(sz, SizeOf(Int64)); //сохраняем размер
OutF.CopyFrom(InF, sz); //сохраняем сам файл
InF.Free;
end;
Result := True;
finally
OutF.Free;
end;
end; | Кол-во файлов n | Размер файла 1 | Файл 1 | ... | Размер файла n | Файл n | для ускорения доступа после количества файлов можно записывать таблицу индексов с позициями начала каждого файла |
|
#3
|
|||
|
|||
|
Спасибо помог очень! А почему MemorySream не подходит к 2 гигабайтным файлам?
![]() |
|
#4
|
||||
|
||||
|
1) в 32-битной венде процессы могут использовать не более 2ГБ памяти
2) зачем записывать файл в память, а из памяти в другой файл, если можно сразу из файла в файл? |