Как связать потоковое содержимое с именем файла без фактической записи содержимого на диск?
У меня есть интерфейс, который читает файлы нескольких типов. Интерфейс имеет read
а также open
методы (и еще немного). open
получает имя файла (const char*) и открывает файл для чтения. В настоящее время я поддерживаю два типа файлов: pcap и raw binary. Недавно я обнаружил, что все файлы, которые я предполагаю прочитать, на самом деле заархивированы (в формате gzip), но все остальное остается прежним (после распаковки файлов все работает как задумано). Я хотел бы добавить к возможности распаковки метода open, чтобы сначала файл был разархивирован (в памяти, без записи разархивированного содержимого на диск) и передал разархивированный контент фактическим реализациям. Основная проблема заключается в том, что open
реализация ожидает имя файла, в случае pcap open
вызовы реализации pcap_open_offline
который не получает поток или буфер. В идеале я мог бы создать какой-то файл (канал, ссылку или что-то еще) и связать его с содержимым, извлеченным из архива. Есть идеи, как мне это сделать? вот небольшой код, чтобы было легче понять, что я делаю
class FileReader //interface
{
public:
void open(const char* name)
{
// unzip file here
open_impl(name);
}
virtual size_t read() = 0;
protected:
virtual void open_impl(const char* name) = 0;
};
class PcapReader: public FileReader
{
public:
size_t read() {...}
protected:
virtual void open_impl(const char* name)
{
pcap_open_offline(name, error_buffer);
}
char error_buffer[1024];
};