gzwrite в память
От: loknalori Россия  
Дата: 21.11.06 12:23
Оценка:
Хочется создать gz файл с помощью Zlib но в оперативной памяти. Т.е. чтобы gzwrite писал не в файл на ЖД, а в оперативную память.

Или второй вариант. Как результат compress() записать в файл так чтобы он валидно открывался архиваторами?
Re: gzwrite в память
От: Poirot Россия  
Дата: 21.11.06 19:17
Оценка: 2 (1)
Здравствуйте, loknalori, Вы писали:

L>Хочется создать gz файл с помощью Zlib но в оперативной памяти. Т.е. чтобы gzwrite писал не в файл на ЖД, а в оперативную память.


L>Или второй вариант. Как результат compress() записать в файл так чтобы он валидно открывался архиваторами?

Про второй вариант — посмотри в примеры, что идут вместе с либой — там есть minigzip — это должно помочь.
А оп поводу первого вопроса — варианта на самом деле 2...
1) Переписать функции gzopen и иже с ними для работы с буфером (я делал так когда пришлось изменячть старый код
2) Был тут пример с манипуляцией элементов структуры FILE, чтобы она была ассоциирована с буфером а не файлом.
Надеюсь, что хоть чем-то помог.
Re: gzwrite в память
От: Warturtle  
Дата: 21.11.06 19:51
Оценка:
Здравствуйте, loknalori, Вы писали:

L>Хочется создать gz файл с помощью Zlib но в оперативной памяти. Т.е. чтобы gzwrite писал не в файл на ЖД, а в оперативную память.

Можно через Boost.Istreams
#include <string>
#include <fstream>
#include <iostream>
#include <boost/iostreams/device/file.hpp> 
#include <boost/iostreams/device/mapped_file.hpp> 
#include <boost/iostreams/filtering_stream.hpp>
#include <boost/iostreams/copy.hpp>
#include <boost/iostreams/filter/gzip.hpp>
#pragma comment(lib, "libboost_iostreams-vc71-sgd.lib")

#include <windows.h>
#pragma comment(lib, "kernel32.lib")

namespace io = boost::iostreams;

int main(int argc, char* argv[])
{
    if (argc < 2) {
        printf("Not enough parameters!\n");
        exit(EXIT_FAILURE);
    }
    using namespace std;

    try {
        string path = argv[1];
        io::mapped_file_source unzipped(path);

        io::filtering_ostream out;
        path += ".gz";
        out.push(io::gzip_compressor());
        out.push(io::file_sink(path, ios::binary));

        //out.write(unzipped.data(), unzipped.size()); // можно так
        io::copy(unzipped, out); // ... то же самое, но короче
        printf("GZipped successfully into \"%s\"\n", path.c_str());
    }
    catch (io::gzip_error &e) {
        printf("failure == \"%s\"\n", e.what());
    }
    catch (std::exception &e) {
        printf("std::exception == \"%s\"\n", e.what());
        DWORD dwCode = ::GetLastError();
        ofstream ofs("error.log");
        ofs << e.what() << "\n" << hex << dwCode << endl << flush;
    }

    system("pause");
}

— только вместо file_sink взять container_sink из примеров к Boost.Iostreams
Re[2]: gzwrite в память
От: loknalori Россия  
Дата: 22.11.06 09:18
Оценка:
По поваду boost — нет времени... Сам я boost ом еще не озадачивался, а проект уже горит....

по поваду minigz — там метод compress вобще не используется, а используется только файловые операции. Так что "мимо"

FILE* в памяти — в точку. Большое спасибо.
Re[3]: gzwrite в память
От: loknalori Россия  
Дата: 22.11.06 10:23
Оценка:
L>FILE* в памяти — в точку. Большое спасибо.

Идем далее
FILE* указывающий на память это хорошо, НО!
конкретно мне нужен _fileno(FILE*), ибо

gzdopen (int fd, const char *mode);
где
...with the file descriptor fd. File descriptors are obtained from calls like open, dup, creat, pipe or fileno

А в случае наполнения структуры FILE руками это значение не валидно... Как быть?
Re[4]: gzwrite в память
От: Vladimir D Belousov Россия  
Дата: 22.11.06 10:46
Оценка:
Здравствуйте, loknalori, Вы писали:

L>>FILE* в памяти — в точку. Большое спасибо.


L>Идем далее

L>FILE* указывающий на память это хорошо, НО!
L>конкретно мне нужен _fileno(FILE*), ибо

А под какую платформу? Может тогда mmap?
--
Спасибо
Re[5]: gzwrite в память
От: Vladimir D Belousov Россия  
Дата: 22.11.06 10:52
Оценка:
Здравствуйте, Vladimir D Belousov, Вы писали:

VDB>А под какую платформу? Может тогда mmap?


Неоднозначно выразился.
И имел ввиду — получить декриптор путем open (что вам не подходит?) или shm_open (что может не подойти),
и потом отобразить себе в память этот файл или объект разделяемой памяти.

Если я правильно понял то, что Вы хотите
--
Спасибо
Re[6]: gzwrite в память
От: loknalori Россия  
Дата: 22.11.06 11:01
Оценка:
мне нужно чтобы на жестком диске файл не создавался.
Re[7]: gzwrite в память
От: Vladimir D Belousov Россия  
Дата: 22.11.06 11:14
Оценка:
Здравствуйте, loknalori, Вы писали:

L>мне нужно чтобы на жестком диске файл не создавался.


А Вам нужно т.с. портабельное решение, или под конкретную платформу?
--
Спасибо
Re[8]: gzwrite в память
От: loknalori Россия  
Дата: 22.11.06 11:22
Оценка:
Здравствуйте, Vladimir D Belousov, Вы писали:

VDB>Здравствуйте, loknalori, Вы писали:


L>>мне нужно чтобы на жестком диске файл не создавался.


VDB>А Вам нужно т.с. портабельное решение, или под конкретную платформу?

win32
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.