2

StreamWriter を介して、新しく作成される zip ファイル (gzip ではない) にテキストを書き込むことができないようです。私は SharpZipLib を使用していますが、それを機能させる方法がよくわかりません。DJ Kraze は、圧縮されたテキスト ファイルから StreamReader にコンテンツをストリーミングするのを手伝ってくれましたが、今はその逆を試しています。最初にcsvファイルを作成してから、完成したファイルを圧縮したくはありませんが、zipコンテナー内で作成されるcsvにテキストを直接ストリーミングしたいです。それは可能ですか?StreamReader で使用できるストリームを取得するために使用するスニペットの下に、何を探しているかが分かります。今回は、StreamWriter で使用するストリームを取得したいということです。

public static Stream GetZipInputFileStream(string fileName)
{
    ZipInputStream zip = new ZipInputStream(File.OpenRead(fileName));
    FileStream filestream = 
        new FileStream(fileName, FileMode.Open, FileAccess.Read);
    ZipFile zipfile = new ZipFile(filestream);
    ZipEntry item;

    if ((item = zip.GetNextEntry()) != null)
    {
        return zipfile.GetInputStream(item);
    }
    else
    {
        return null;
    }
}

これが私が基本的に探す方法ですが、逆の方法です(StreamWriter->新しいzipコンテナー内の新しいcsvファイル):

using (StreamReader streamReader = Path.GetExtension(fileName).ToUpper().Equals(".ZIP") ? new StreamReader(FileOperations.GetZipInputFileStream(fileName)) : new StreamReader(fileName))
            {
4

2 に答える 2

0

ここでの 2 番目の例は、ストリームを直接 SharpZipLib から zip ファイルに書き込む方法を示しています。それを簡単に見て、それがどのように機能するかをお知らせください.

編集: リンクに問題があるため、以下は wiki の例です。

public void UpdateZipInMemory(Stream zipStream, Stream entryStream, String entryName) 
{

    // The zipStream is expected to contain the complete zipfile to be updated
    ZipFile zipFile = new ZipFile(zipStream);

    zipFile.BeginUpdate();

    // To use the entryStream as a file to be added to the zip,
    // we need to put it into an implementation of IStaticDataSource.
    CustomStaticDataSource sds = new CustomStaticDataSource();
    sds.SetStream(entryStream);

    // If an entry of the same name already exists, it will be overwritten; otherwise added.
    zipFile.Add(sds, entryName);

    // Both CommitUpdate and Close must be called.
    zipFile.CommitUpdate();

    // Set this so that Close does not close the memorystream
    zipFile.IsStreamOwner = false;
    zipFile.Close();

    // Reposition to the start for the convenience of the caller.
    zipStream.Position = 0;
}

そしてそれをサポートするデータ構造

public class CustomStaticDataSource : IStaticDataSource
{
    private Stream _stream;

    // Implement method from IStaticDataSource
    public Stream GetSource() { return _stream; }

    // Call this to provide the memorystream
    public void SetStream(Stream inputStream) 
    {
        _stream = inputStream;
        _stream.Position = 0;
    }
}

サイトにアクセスできる場合にそのコードを呼び出す例があります。

于 2012-02-24T18:10:28.150 に答える
0

この目的のために SharpZipLib をダンプすることになり、代わりに、最初に zip コンテナー内のすべてのファイルを解凍し、データを処理してから、ファイルを zip コンテナーに戻すという、よりスペースを集中的に使用するルートに進みました。上記のように、私が直面した問題は、サイズが大きいためにコンテナー内のファイルを一度に読み取ることができないことでした。将来、コンテナへの部分的なストリーム書き込みを処理できる可能性のある zip ライブラリが表示されると便利ですが、今のところ、SharpZipLib でそれを実行する方法はわかりませんでした。

于 2012-03-03T10:20:49.257 に答える