我似乎无法通过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))
{
答案 0 :(得分:0)
第二个示例here解决了将流直接写入SharpZipLib的zip文件的问题。快速浏览一下,让我们知道它是如何运作的。
编辑:由于链接存在问题,以下是维基的示例。
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;
}
}
如果您可以访问该网站,则有一个调用该代码的示例。
答案 1 :(得分:0)
我最终为此目的倾倒了SharpZipLib,而是采用了更加空间密集的路线,首先解压缩zip容器中的所有文件,处理数据,然后将文件移回zip容器。如上所述,我面临的问题是,由于尺寸较大,我无法立即读取容器中的任何文件。很高兴看到一个可以在将来处理部分流写入容器的zip库,但是现在我没有看到使用SharpZipLib完成它的方法。