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

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

22.10.2011, 14:53. Показов 7617. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Гайд, как ворваться в вайб-кодинг в мае 2026
Noname2331 17.05.2026
Простите за получившееся полотно текста, я даже не знаю, как его разбить на главы. Тут, что называется, ни добавить ни убавить, одна сцена одним дублем. На моих глазах недавно случилось чудо. Как. . .
[golang] Алгоритм «Хак Госпера»
alhaos 17.05.2026
Алгоритм «Хак Госпера» Хак Госпера (Gosper's Hack) — алгоритм нахождения следующего по величине числа с тем же количеством установленных бит. Придуман Биллом Госпером в 1970-х, опубликован в. . .
Рисование бинарного древа до 6-го колена на js, svg.
russiannick 17.05.2026
<svg width="335" height="240" viewBox="0 0 335 240" fill="#e5e1bb"> <style> <!]> </ style> <g id="bush"> </ g> </ svg> function fn(){ let rost;/ / высота древа let xx=165,yy=210,w=256;
FSharp: interface of module
DevAlt 16.05.2026
Интерфейс модуля F# позволяет управлять доступностью членов, содержащихся в реализации модуля. По-умолчанию все члены модуля доступны: module Foo let x = 10 let boo () = printfn "boo" . . .
Хитросплетение родственных связей пантеона греческих богов.
russiannick 14.05.2026
Однооконник, позволяющий узреть и изучить отдельных героев древней Греции. <!DOCTYPE html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible". . .
[golang] Угол между стрелками часов
alhaos 12.05.2026
По заданным значениям часа и минуты необходимо определить значение меньшего угла между стрелками аналогового циферблата часов. import "math" func angleClock(hour int, minutes int) float64 { . . .
Debian 13: Установка Lazarus QT5
ВитГо 09.05.2026
Эта инструкция моя компиляция инструкций volvo https:/ / www. cyberforum. ru/ blogs/ 203668/ 10753. html и его же старой инструкции по установке Lazarus с gtk2. . .
Нейросеть на алгоритме "эстафета хвоста" как перспектива.
Hrethgir 06.05.2026
На десерт, когда запущу сервер. Статья тут https:/ / habr. com/ ru/ articles/ 1030914/ . Автор я сам, нейросеть только помогает в вопросах которые мне не известны - не знаю людей которые знали-бы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru