2012-02-24 8 views
2

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

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)) 
      { 
+0

タイトルに「c#」などのプレフィックスを付けないでください。それがタグのためのものです。 –

+0

が分かっています、申し訳ありません。 –

+0

それは問題ではありません。私は新しい[so]ユーザーに将来のタイトルでそれをしないよう知らせるようにしています。私には多くの作品編集タイトルを保存します。 –

答えて

0

私は、この目的のためにSharpZipLibをダンプすることになったし、代わりにまず、ZIPコンテナ内のすべてのファイルを解凍したデータを処理し、その後バックジップコンテナにファイルを移動するより多くのスペース集中的なルートを行ってきました。私が直面した問題は、上記のように、大きなサイズのために一度にコンテナ内のファイルを読み取ることができなかったことです。将来的にコンテナへの部分的なストリームの書き込みを処理することができるかもしれないzipライブラリを見てうれしいですが、今はSharpZipLibでそれを行う方法を見ていませんでした。

0

第二の例の書き込みhereアドレス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; 
    } 
} 

あなたはサイトに通じ得ることができる場合、そのコードを呼び出す例があります。

+0

リンクが機能していないようです。 –

+0

Odd。申し訳ありません。 http://wiki.sharpdevelop.net/SharpZipLib_Updating.ashx – TimW

+0

愛もない...奇妙な –

関連する問題