Как положить три файла в один в C #? - PullRequest
1 голос
/ 15 июня 2011

Я пытаюсь сделать карту для игры, которую планирую создать.На карте должно быть два файла данных и файл изображения.

Я хочу соединить их, чтобы сформировать один файл, и я хочу использовать только библиотеки по умолчанию.

Как можноЯ делаю это, и все еще могу разделить их позже?

Решением будет сжатие, но я не смог найти способ сжать несколько файлов с помощью класса gzipstreamer.

Ответы [ 5 ]

1 голос
/ 15 июня 2011

Вы можете использовать SharpZipLib для создания ZIP-файла.

1 голос
/ 15 июня 2011

Рассматривали ли вы встраивание файлов как ресурсов в сборку (или в отдельную сборку?)

Многое зависит от причин, по которым вы хотите сгруппировать их.

Сжатие будет стоить времени и мощности процессора.

0 голосов
/ 15 июня 2011

Я думаю, вам следует рассмотреть возможность встраивания ресурсов в сборку, как предлагает Эрно.

Но если вы действительно хотите упаковать их в один файл, вы можете сделать это, просто записав длину каждого потока перед самим потоком.Затем вы можете прочитать length байт и затем вернуть следующий length байт в виде потока.Чтение / запись уродливыми методами ниже.Целевой поток может быть в конечном итоге разархивирован.Обратите внимание, что приведенные ниже наивные методы считывают и записывают всю строку в один буфер и предполагают, что ни один файл не превышает int.MaxValue.

Но я бы не рекомендовал использовать только стандартные библиотеки.

    static void Append(Stream source, Stream target)
    {
        BinaryWriter writer = new BinaryWriter(target);
        BinaryReader reader = new BinaryReader(source);  
        writer.Write((long)source.Length);
        byte[] buffer = new byte[1024];
        int read;
        do
        {
            read = reader.Read(buffer, 0, buffer.Length);
            writer.Write(buffer, 0, read);
        }
        while (read > 0);
        writer.Flush();
    }

    static Stream ReadNextStream(Stream packed)
    {
        BinaryReader reader = new BinaryReader(packed);
        int streamLength = (int)reader.ReadInt64();

        MemoryStream result = new MemoryStream();
        byte[] buffer = new byte[streamLength];
        reader.Read(buffer, 0, buffer.Length);

        BinaryWriter writer = new BinaryWriter(result);
        writer.Write(buffer, 0, buffer.Length);
        writer.Flush();

        result.Seek(0, SeekOrigin.Begin);
        return result;
    }
0 голосов
/ 15 июня 2011

У меня недавно был похожий вопрос здесь о сохранении 2 файлов XML в одном файле.

См. Мой ответ с кодом.

"Я закончил тем, что написал свой собственный поток, который можно рассматривать как многопотоковый. Он позволяет обрабатывать один поток как несколько потоков подряд. То есть передавать многопотоковый анализатор xml (или что-либо еще) и он будет читать до маркера, который говорит «это конец потока». Если вы затем передадите этот же поток другому анализатору xml, он будет читать с этого маркера на следующий или EOF "

Ваше основное использование будет:

Writing:
    Open File Stream
    Create MultiStream passing in File Stream in constructor
    Write data file to multistream
    Call write end of stream marker on multistream
    Write 2nd data file to multistream
    Call write end of stream marker on multistream
    Save picture to multistream
    Close multistream
    Close file stream

Reading:
    Open File Stream
    Create MultiStream passing in File Stream in constructor
    Read data file
    Call advance to next stream on multistream
    Read 2nd data file
    Call advance to next stream on multistream
    Read image (Image.FromStream() etc.)
    Close multistream
    Close file stream
0 голосов
/ 15 июня 2011

Сжатие Gzip работает только для одного файла (только когда-либо).Вы можете попробовать ZIP, 7-ZIP или другой формат архива, который позволяет использовать несколько файлов.Альтернативно, вы можете сначала заархивировать файлы вместе, что было обычной практикой для схемы сжатия, которую Gzip был изобретен для замены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...