Russian Qt Forum

Qt => Вопросы новичков => Тема начата: Pixel от Октябрь 30, 2012, 13:10



Название: динамическое создание файла ресурсов
Отправлено: Pixel от Октябрь 30, 2012, 13:10
как создать файл в который можно динамически поместить другие файлы? например: пользователь выбирает файлы с жесткого диска, эти файлы помещаются в некий архив, который сохраняется на диске в указанном месте, чтобы потом эти файлы другой пользователь мог извлечь к примеру.


Название: Re: динамическое создание файла ресурсов
Отправлено: Bepec от Октябрь 30, 2012, 13:41
Это называется архив. Поместить файлы в архив можно архиватором.

Так же под ваше описание подпадает папка :D


Название: Re: динамическое создание файла ресурсов
Отправлено: Pixel от Октябрь 30, 2012, 15:38
мне нужно написать программу, которая будет создавать свои архивы. Именно файлом, а не папкой


Название: Re: динамическое создание файла ресурсов
Отправлено: Alex Custov от Октябрь 30, 2012, 15:45
мне нужно написать программу, которая будет создавать свои архивы. Именно файлом, а не папкой

Если сжатия не нужно, используй tar архивы. Их формат можно найти, как и написать простейшие [де]архиваторы.


Название: Re: динамическое создание файла ресурсов
Отправлено: Bepec от Октябрь 30, 2012, 15:57
на linux папки и файлы это одно и то же как бэ :)

PS простейший архиватор. Их дофига.


Название: Re: динамическое создание файла ресурсов
Отправлено: Igors от Октябрь 30, 2012, 17:59
мне нужно написать программу, которая будет создавать свои архивы. Именно файлом, а не папкой
Ну я так понял задание именно "свои". Ну так берете и пишете (примерно час)

Код
C++ (Qt)
struct MyTag {
int mID;              // ID тега (пока только 'FILE')
qint64 mTagSize; // размер тега
QString mName;  // имя файла
qint64 mFileSize;  // размер
QDate mDate;   // дата
int mFlag;        // флаги (напр read-only)
};
 
Например извлечь

- открываете файл архива и считываете MyTag. Имя не подходит - делаете seek на след тег. Подходит - считываете содержимое которое записано за тегом, устанавливаете дату и флаги для извлеченного файла. Остальные операции (добавление, удаление и др) столь же очевидны.


Название: Re: динамическое создание файла ресурсов
Отправлено: Pixel от Октябрь 30, 2012, 21:12
Igors, спасибо! не подскажете где можно по подробней почитать про "seek" (поиск и чтение данных из файла)


Название: Re: динамическое создание файла ресурсов
Отправлено: Igors от Октябрь 30, 2012, 21:28
не подскажете где можно по подробней почитать про "seek" (поиск и чтение данных из файла)
В букваре (Assistent). И не травмируйте форум такими квешнзами  :'(


Название: Re: динамическое создание файла ресурсов
Отправлено: xokc от Ноябрь 01, 2012, 07:35
При наличии в структуре поля mName в виде QString так просто считать/записать MyTag не получится.


Название: Re: динамическое создание файла ресурсов
Отправлено: Bepec от Ноябрь 01, 2012, 08:10
Ну почему же. Сделать ему фиксированную длину аля 1024 символа.

Больше смысла нет - имя файла в W рубится на 1024 символах в длине пути. К такому каталогу ни одна программа не сможет обратиться.

PS в линуксе незнаю.


Название: Re: динамическое создание файла ресурсов
Отправлено: Serr500 от Ноябрь 01, 2012, 08:54
Больше смысла нет - имя файла в W рубится на 1024 символах в длине пути. К такому каталогу ни одна программа не сможет обратиться.
Это в ANSI-версиях функций. В Unicode-версиях (с суффиксом W) максимальная длина имени около 32000 символов.


Название: Re: динамическое создание файла ресурсов
Отправлено: Bepec от Ноябрь 01, 2012, 09:39
to Serr500

Извиняюсь я конечно, но Unicode версии ОС Windows(W7) я незнаю. Однако я знаю, что если создать не совсем корректными методами каталог с путём/названием больше 1024, то эксплорер отказывается с ним работать, как и 95% программ. Удаление/открытие/обращение к файлу/каталогу прерывается.

Если даже шелл ОС не работает с такими папками, то... То нефиг так делать.


Название: Re: динамическое создание файла ресурсов
Отправлено: Serr500 от Ноябрь 01, 2012, 10:25
to Верес

Согласен. Однако, моё уточнение относилось к фразе
К такому каталогу ни одна программа не сможет обратиться.
Всё-таки 5% программ может.  ;)

Unicode версии ОС Windows(W7) я незнаю.
А такой версии нет. Просто большинство функций WinAPI с аргументами-строками имеют два варианта - ANSI и Unicode. Обычно используются стандартные хидеры M$, а в них имена функций - это макросы. Там FunctionName в зависимости от включенного/выключенного Unicode транслируется либо в FunctionNameA (ANSI), либо в FunctionNameW (Unicode).


Название: Re: динамическое создание файла ресурсов
Отправлено: Bepec от Ноябрь 01, 2012, 10:34
Нууу... Скажем так - программы исключительно перестрахованных программистов, которыми пользуются перестрахованные программисты :D


Название: Re: динамическое создание файла ресурсов
Отправлено: Igors от Ноябрь 01, 2012, 10:58
При наличии в структуре поля mName в виде QString так просто считать/записать MyTag не получится.
Поэтому 2 поля длины  :)


Название: Re: динамическое создание файла ресурсов
Отправлено: xokc от Ноябрь 01, 2012, 22:17
Т.е. qint64 (кстати, почему тогда не quint64?) на длину тега с учётом возможной длины имени файла в 2^32 байт :)? Но ведь всё равно sizeof (MyTag) будет константой сколько полей длинны не клади :)


Название: Re: динамическое создание файла ресурсов
Отправлено: Igors от Ноябрь 02, 2012, 13:02
(кстати, почему тогда не quint64?)
Ну винтов (или томов) вылазящих за long long пока не видно, а иметь знаковое значение удобнее

Т.е. qint64 (кстати, почему тогда не quint64?) на длину тега с учётом возможной длины имени файла в 2^32 байт :)? Но ведь всё равно sizeof (MyTag) будет константой сколько полей длинны не клади :)
Задумка такая: считали ID и длину тега, смотрим интересен ли нам он. Нет - seek на следующий. Да - заглатываем имя и др информацию (обычной сериализацией). Т.е. использовать sizeof (MyTag) никто не собирается, Обычно считывается контейнер тегов (их заголовков) а там уже по месту.


Название: Re: динамическое создание файла ресурсов
Отправлено: GreatSnake от Ноябрь 02, 2012, 13:43
Задумка такая: считали ID и длину тега, смотрим интересен ли нам он. Нет - seek на следующий. Да - заглатываем имя и др информацию (обычной сериализацией). Т.е. использовать sizeof (MyTag) никто не собирается, Обычно считывается контейнер тегов (их заголовков) а там уже по месту.
Неоптимальное решение, ибо если в архиве тысяча файлов и нужный файл самый последний, то придётся про-seek-ать весь файл.
Для таких вещей обычно делается такая структура архива:
в начале файла храним указатель на индекс:
struct Header
{
   quint64 index_offset;
   quit64  index_size;
};
в MyTag нужно добавить quit64 offset;
далее друг за дружкой пишем файлы c сохранением позиции начала файла в MyTag::offset
и уже после них получаем Header.index_offset;
далее пишем MyTag's, заполняем Header.index_size;
далее встаём в начало файла и опять пишем Header.
При чтении считываем Header. По его данным получаем индекс. В индексе ищем нужный файл и получаем его смещение.


Название: Re: динамическое создание файла ресурсов
Отправлено: vregess от Ноябрь 02, 2012, 13:55
как создать файл в который можно динамически поместить другие файлы? например: пользователь выбирает файлы с жесткого диска, эти файлы помещаются в некий архив, который сохраняется на диске в указанном месте, чтобы потом эти файлы другой пользователь мог извлечь к примеру.

Почему бы не использовать zip-архивы, есть обертка для Qt - QuaZip (http://quazip.sourceforge.net).


Название: Re: динамическое создание файла ресурсов
Отправлено: Igors от Ноябрь 02, 2012, 13:57
Неоптимальное решение, ибо если в архиве тысяча файлов и нужный файл самый последний, то придётся про-seek-ать весь файл.
Для таких вещей обычно делается такая структура архива:
в начале файла храним указатель на индекс:
Это часто называется TOC. Так были устроены еще незабвенные .wad файлы :) Однако Вы забыли упомянуть о минусе этого решения: уязвимость TOC. Если я начал писать (и уже затер ТOC) и тут рубанули свет - все накрылось.


Название: Re: динамическое создание файла ресурсов
Отправлено: GreatSnake от Ноябрь 02, 2012, 14:14
Однако Вы забыли упомянуть о минусе этого решения: уязвимость TOC. Если я начал писать (и уже затер ТOC) и тут рубанули свет - все накрылось.
Хм, а где гарантия, что всё не накроется при Вашем последовательном варианте? При современном устройстве дисковых подсистем что-либо гарантировать при отключении питания я бы не стал.


Название: Re: динамическое создание файла ресурсов
Отправлено: Igors от Ноябрь 02, 2012, 14:32
Хм, а где гарантия, что всё не накроется при Вашем последовательном варианте? При современном устройстве дисковых подсистем что-либо гарантировать при отключении питания я бы не стал.
Ну так я тупенько пишу в конец файла. Сбой - ну да, последний тег invalid, но я могу это определить на следующем скане (размер не сбивается). Впрочем обе схемы (с TOC и без) достаточно популярны/хороши.

У меня есть такая задача. На каждом запуске/проходе приложение грузит N картинок (больших). Расходы на распаковку jpg, png и др. значительны. Используются имеджи в "прямом" формате (ARGB и др), так же как и QImage. Однако никто не гарантирует что файлы остаются неизменными - надо проверять и, если надо, перегружать. Как бы Вы кешировали загрузку?


Название: Re: динамическое создание файла ресурсов
Отправлено: GreatSnake от Ноябрь 02, 2012, 14:40
Размер + timestamp.


Название: Re: динамическое создание файла ресурсов
Отправлено: Igors от Ноябрь 02, 2012, 15:14
Размер + timestamp.
Ну как определить что файл изменен - то ясно. Вопрос был как кешировать. Хотя если нет желания обсуждать - не настаиваю