Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.91/33: Рейтинг темы: голосов - 33, средняя оценка - 4.91
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752

Как можно программно сунуть файлы в архив

22.10.2011, 14:53. Показов 7397. Ответов 44
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как можно программно сунуть файлы в архив.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.10.2011, 14:53
Ответы с готовыми решениями:

Кто-нибудь знает как можно программно заполнять (создавать) файлы справки Windows
Кто-нибудь знает как можно программно заполнять (создавать) файлы справки Windows. : Желание ж таково: при программировании своих модулей...

Сколько макс. оперативы сюда можно сунуть
Системная плата Asus P5GD2 Deluxe Разъёмы ОЗУ 4 DDR2 DIMM Тип ЦП Intel Celeron D 336, 2800 MHz (21 x 133) Хочу купить 2 планки по 4...

Как программно распаковать архив?
Как без использования программ типа WinRAR и т.д. распаковать архив? Без разницы рар или зип. В инете много информации об этом, но там...

44
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
26.10.2011, 09:12  [ТС]
Студворк — интернет-сервис помощи студентам
На самом деле, запись будет производится не в файл, а в память.
Это понятно)
Это имя виртуального файла (оно зарезервировано в системе).
Как оно зарезервировано. Как задать другое имя. Или оно всегда такое неизменно?
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
26.10.2011, 12:25
Цитата Сообщение от Le Thaw Посмотреть сообщение
Как оно зарезервировано.
В системе есть ряд зарезервированных имен файлов, таких как:
Имя Назначение
AUX асинхронный интерфейс (Auxiliary – вспомогательный выход)
CLOCKS драйвер часов
СОМ1 первый последовательный интерфейс (от COMmunication)
COM2 второй последовательный интерфейс
COM3 третий последовательный интерфейс
COM4 четвертый последовательный интерфейс
CON консоль (клавиатура и дисплей)
LPT1 первый параллельный интерфейс (от Line PrinTer 1)
LPT2 второй параллельный интерфейс
LPT3 третий параллельный интерфейс
NUL отсутствующий выход («черная дыра»)
PRN принтер (от PRiNter)
Цитата Сообщение от Le Thaw Посмотреть сообщение
Как задать другое имя.
А зачем?
Нужно ведь данные спрайта поместить в память или нет?
Вот, файл с именем NUL это запись в память. А из памяти можно записать на диск (или прямо в архив, пример выше) под любым именем.
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
26.10.2011, 14:55  [ТС]
Понятно, спасибо.
И еще вопрос. Что быстрее работает, запись в память или в файл функцией saveimage. Мне кажется что быстрее в память. Но может разницы и нет, и нет смысла записывать в память.

Добавлено через 13 минут
Ассемблерный код, как я понимаю, выделяет ячейку памяти, размером максимально допустимым(т.е. свободным). Дальше записывается код изображения, и только этот размер используется в памяти?
Правильно?
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
26.10.2011, 15:16
Цитата Сообщение от Le Thaw Посмотреть сообщение
Что быстрее работает, запись в память или в файл
В память конечно.

Цитата Сообщение от Le Thaw Посмотреть сообщение
Ассемблерный код, как я понимаю, выделяет ячейку памяти, размером максимально допустимым
Нет.
Я в асме не очень хорошо разбираюсь, но судя по коду, производится подмена адреса функции в стеке и в место стандартной, вызывается процедура fwritef(), в которой выделяется память и записываются данные картинки в память, указатель на которую хранится в переменной mem.
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
26.10.2011, 15:31  [ТС]
Я в асме не очень хорошо разбираюсь, но судя по коду, производится подмена адреса функции в стеке и в место стандартной, вызывается процедура fwritef(), в которой выделяется память и записываются данные картинки в память, указатель на которую хранится в переменной mem.
Ну как. Сначала выделяется память размером в 2 миллиарда байт. А потом уже в ячейку записывается код изображения.
Проверил я это тем, что узнал размер выделенной памяти до ассемблера, и после.

 Комментарий модератора 
Не нужно цитаты заключать в тег BASIC
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
26.10.2011, 15:49
Цитата Сообщение от Le Thaw Посмотреть сообщение
Сначала выделяется память размером в 2 миллиарда байт

Как определил?
Столько не выделяется.

Цитата Сообщение от Le Thaw Посмотреть сообщение
Проверил я это тем, что узнал размер выделенной памяти до ассемблера, и после.
Где, в переменной memsize?
Там ноль после выполнения асм кода и вообще, асм не изменяет эту переменную.

Только что проверил - работает нормально для PNG рисунка, размером 140 КБ, было выделено 110 КБ памяти в которую был записан код рисунка.
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
26.10.2011, 17:12  [ТС]
Вот так проверял
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
UsePNGImageEncoder() 
UsePNGImageDecoder() 
Global mem=AllocateMemory(16) 
Global memsize=0 
 
 
ProcedureC fwritef(a,b,c,d) 
   mem=ReAllocateMemory(mem,memsize+c) 
   CopyMemory(a,mem+memsize,c) 
   memsize+c 
   ProcedureReturn c 
EndProcedure 
 
 
fwrite=@fwritef()
Debug fwrite
!extrn _fwrite 
!mov eax,[_fwrite+2] 
!push dword[eax] 
!push [v_fwrite] 
!pop dword[eax] 
!pop [v_fwrite] 
Debug fwrite
 
LoadImage(0, "1.png") 
SaveImage(0,"nul",#PB_ImagePlugin_PNG) 
;теперь в памяти по адресу mem лежит jpg картинка рамером memsize. 
;проверим 
 
 
CreateFile(0,"test.png") 
WriteData(0,mem,memsize) 
CloseFile(0)
Только что проверил - работает нормально для PNG рисунка
Я не говорил что не работает, или работает не нормально)
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
26.10.2011, 17:38
У меня этот код выделяет примерно столько же памяти, сколько весит сам рисунок.
Но это естественно не 2 ГБ памяти.
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
26.10.2011, 19:20  [ТС]
А можно загрузить картинку из памяти.
Т.е.
PureBasic
1
2
LoadImage(0, "1.png") 
SaveImage(0,"nul",#PB_ImagePlugin_PNG)
И то что находится в памяти о изображении, использовать так, чтобы загрузить новое.
Попробовал так
PureBasic
1
2
CatchImage(1, mem, memsize)
SaveImage(1,"as.png",#PB_ImagePlugin_PNG)
Но файл изображения получается пустой
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
26.10.2011, 19:48
Цитата Сообщение от Le Thaw Посмотреть сообщение
Но файл изображения получается пустой
Правильно, потому что была заменена процедура записи чтобы писать данные в память.
Ее нужно восстановить перед тем, как начать писать в файл.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
UsePNGImageEncoder() 
UsePNGImageDecoder() 
Global mem=AllocateMemory(16) 
Global memsize=0 
 
 
ProcedureC fwritef(a,b,c,d) 
   mem=ReAllocateMemory(mem,memsize+c) 
   CopyMemory(a,mem+memsize,c) 
   memsize+c 
   ProcedureReturn c 
EndProcedure 
 
 
fwrite=@fwritef()
!extrn _fwrite 
!mov eax,[_fwrite+2] 
!push dword[eax] 
!push [v_fwrite] 
!pop dword[eax] 
!pop [v_fwrite] 
 
LoadImage(0, "D:\1.png") 
SaveImage(0,"nul",#PB_ImagePlugin_PNG) 
;теперь в памяти по адресу mem лежит jpg картинка рамером memsize. 
;проверим 
 
!mov eax,[_fwrite+2] 
!push dword[eax] 
!push [v_fwrite] 
!pop dword[eax]
!pop [v_fwrite] 
 
CatchImage(1, mem, memsize)
SaveImage(1,"D:\as.png",#PB_ImagePlugin_PNG)
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
28.10.2011, 19:21  [ТС]
Как очистить память адреса "nul".
Надо 2 раза подряд записать код одной картинки в память, потом из памяти в файл, и 2ой круг...
Очищаю память так
PureBasic
1
2
3
    FreeMemory(mem)
    mem=AllocateMemory(16) 
    fwrite=@fwritef()
Но так не получается. Выходит, что размер области памяти после записи 1ой картинки равен 1015, после очистки и записи снова, равен 2030.
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
28.10.2011, 20:10
Цитата Сообщение от Le Thaw Посмотреть сообщение
Очищаю память так
Еще нужно переменную memsize обнулять.
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
29.10.2011, 17:30  [ТС]
Пытаюсь сунуть картинку из банка в архив. Делаю так
PureBasic
1
2
3
4
5
6
7
8
9
10
    !extrn _fwrite 
    !mov eax,[_fwrite+2] 
    !push dword[eax] 
    !push [v_fwrite] 
    !pop dword[eax] 
    !pop [v_fwrite] 
    Debug memsize
    SaveImage(Image()\ID,"nul",#PB_ImagePlugin_JPEG)
    Debug memsize
    PureZIP_Archive_CompressMem(Image()\Name+".png", *mem, memsize)
Получается пустой архив, да еще и раненый.
Если функцию компрессии поставить перед асм кодом, то все работает. Что делать?
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
29.10.2011, 18:01
Выше уже отвечал на этот вопрос Как можно программно сунуть файлы в архив
Нужно восстановить перехваченную функцию.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    !extrn _fwrite 
    !mov eax,[_fwrite+2] ; Перехват функции.
    !push dword[eax] 
    !push [v_fwrite] 
    !pop dword[eax] 
    !pop [v_fwrite] 
 
    Debug memsize
    SaveImage(Image()\ID,"nul",#PB_ImagePlugin_JPEG)
    Debug memsize
 
    !mov eax,[_fwrite+2] ; Восстановление функции.
    !push dword[eax] 
    !push [v_fwrite] 
    !pop dword[eax]
    !pop [v_fwrite]
 
    PureZIP_Archive_CompressMem(Image()\NAME+".png", *mem, memsize)
    FreeMemory(*mem) : memsize = 0 ; Освобождаем память.
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
29.10.2011, 21:34  [ТС]
Не получается из архива сунуть файл в память.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
  SavedFile=OpenFileRequester("Выберите файл стилей", "", "Style (*.stl)|*.stl|", 0)
  Name_Archive=GetFilePart(SavedFile)
  PureZIP_Archive_Read(Name_Archive)
  PureZIP_Archive_FindFirst() 
  PureZIP_Archive_FileInfo(@myFileinfo)
  memsize=myFileinfo\unCompressedSize
  namefile.s=myFileinfo\FileName
  
  
  
  NumberFile=PureZIP_FindFile(Name_Archive, namefile)
  bite=PureZIP_ExtractMemory(Name_Archive, NumberFile, *mem, memsize)
Пробовал и функцией PureZIP_Archive_ExtractMem извлекать, но тот же итог. Функция возвращает <0
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
29.10.2011, 21:52
Цитата Сообщение от Le Thaw Посмотреть сообщение
Функция возвращает <0
Такой код работает.
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Name_Archive.s=OpenFileRequester("Выберите файл стилей", "", "Style (*.stl)|*.zip", 0)
If  PureZIP_Archive_Read(Name_Archive)
  PureZIP_Archive_FindFirst() 
  PureZIP_Archive_FileInfo(@myFileinfo.PureZIP_FileInfo)
  memsize=myFileinfo\unCompressedSize
  namefile.s=myFileinfo\FileName
  
  *mem = AllocateMemory(memsize)
  If *mem
    NumberFile=PureZIP_FindFile(Name_Archive, namefile)
    bite=PureZIP_ExtractMemory(Name_Archive, NumberFile, *mem, memsize)
    Debug bite
    ShowMemoryViewer(*mem, bite)
    FreeMemory(*mem) ; Когда память больше не нужна, ее нужно освободить.
  Else
    Debug "Ошибка при выделении памяти."
  EndIf
  
  PureZIP_Archive_Close()
Else
  Debug "Ошибка при открытии архива."
EndIf
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
29.10.2011, 22:08  [ТС]
Все равно возвращает -3. И пишет
Указанное местоположение памяти не действительно для того, чтобы читать.
Попробовал вручную сунуть файл в пустой архив. Все получается.
А если программно засунут файл, то не получается.
В архиве, файлы заархив. программно, в имени файла в конце стоит символ "*". Если заархив. файлы вручную, то звездочки нет.
Видимо дело в этом.
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
29.10.2011, 22:18
Цитата Сообщение от Le Thaw Посмотреть сообщение
возвращает -3
Это #Z_DATA_ERROR.

int uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
Декомпрессирует исходный буфер в буфер назначения. sourceLen содержит длину в байтах исходного буфера. Перед вызовом функции, destLen должен содержать максимальный размер буфера назначения, который должен быть достаточно большим, чтобы вместить полностью несжатые данные. (Размер несжатых данных должен быть предварительно сохранен компрессором и передан декомпрессору посредством других способов, описание которых выходит за рамки данной библиотеки.) После вызова функции, destLen содержит актуальный размер несжатых данных.
Эта функция может быть использована для всего файла за один проход, если этот файл спроецирован в память.
Функция uncompress возвращает:
Z_OK в случае успеха
Z_MEM_ERROR если недостаточно памяти
Z_BUF_ERROR если недостаточно места в буфере назначения
Z_DATA_ERROR если входные данные были повреждены
Такое наблюдается на всех архивах?
Может архив битый?
1
37 / 37 / 1
Регистрация: 07.09.2010
Сообщений: 752
29.10.2011, 22:33  [ТС]
Понял в чем проблема. Создавал архив в формате *zip. Вручную менял на *stl.
Всему виной это. Хотя странно, как это может повлиять.

Добавлено через 6 минут
А нет. Не в этом дело.
Запускаю программу. Создаю в ней архив. Пихаю файл. Открываю архив(сколько угодно раз), все норм.
Закрываю прогу. Открываю заного, открываю архив, все плохо, ответ -3.
0
PB
Просто прогер
1292 / 1079 / 13
Регистрация: 13.03.2009
Сообщений: 2,502
29.10.2011, 22:37
Возможно ошибка в коде проги, создающей архив.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.10.2011, 22:37
Помогаю со студенческими работами здесь

Как программно распаковать архив ZIP
Приветствую всех. :) Возникла необходимость программной распаковки архива zip. Подскажите в каком направлении рыть? Есть такая...

Как можно обойти проверку CRC или как можно распаковать поврежденный архив?
Есть старый архив. Но при попытке достать из него файл выдается сообщение о несовпадении CRC. Как можно обойти проверку CRC или как вообще...

Как программно создать архив, и засунуть туда файл
Всем привет...))) Подскажите пожалуйста как программно создать архив, и засунуть туда файл... За ранее благодарствуй...))) Я только нашел...

Как программно незаметно создать zip/rar архив и отправить на хост?
C++(лучше C++/CLI). Например: моя программа на компьютере с именем пользователя &quot;User01&quot;. Она берет файли из нужных мне папок и пакует...

Как добавить файлы в архив?
Здравствуйте! Нужна помощь. Как реализовать добавление в готовый .zip архив файлы с заменой? :read: т.е нужно не создавать новый архив...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru