![]() |
|
#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) зачем записывать файл в память, а из памяти в другой файл, если можно сразу из файла в файл? РГРТУ - ФВТ - Системы Автоматизированного ПРоектирования. ت |