我的目标是使用gzip压缩文件,然后将压缩的字节写入Xml部分,这意味着我需要在代码中使用压缩的字节数组。我发现GZip的所有示例都只是将字节直接写入文件。
所以这是我的代码:
public ContainerFile(string[] inputFiles, string Output)
{
XmlDocument doc = new XmlDocument();
XmlNode root;
FileInfo fi;
FileStream fstream;
BinaryReader reader;
GZipStream gstream;
root = doc.CreateElement("compressedFile");
doc.AppendChild(root);
foreach (string f in inputFiles)
{
fstream = File.OpenRead(f);
MemoryStream s = new MemoryStream();
byte[] buffer = new byte[fstream.Length];
// Read the file to ensure it is readable.
int count = fstream.Read(buffer, 0, buffer.Length);
if (count != buffer.Length)
{
fstream.Close();
//Console.WriteLine("Test Failed: Unable to read data fromfile");
return;
}
fstream.Close();
gstream = new GZipStream(s, CompressionMode.Compress, true);
gstream.Write(buffer, 0, buffer.Length);
gstream.Flush();
byte[] bytes = new byte[s.Length];
s.Read(bytes, 0, bytes.Length);
File.WriteAllBytes(@"c:\compressed.gz", bytes);
}
出于调试原因,我只是在加载后尝试将数据写入文件。
因此,输入文件的长度约为4k字节。正如degubber告诉我的那样,“bytes” - 数组的长度约为2k。因此看起来压缩字节数组的大小是正确的,但其中的所有值都是0。
可以s.o.帮帮我?
答案 0 :(得分:4)
您的Read
来电正试图从MemoryStream
的结尾中读取 - 您还没有“重绕”它。您可以使用s.Position = 0;
执行此操作 - 但只需拨打MemoryStream.ToArray
即可。
请注意,我会亲自尝试不从流中读取,假设整个数据可以一次性使用,就像您开始时一样。您还应该对流使用using
语句,以避免在抛出异常时泄漏句柄。但是,使用File.ReadAllBytes
无论如何都会更简单:
byte[] inputData = File.ReadAllBytes();
using (var output = new MemoryStream())
{
using (var compression = new GZipStream(output, CompressionMode.Compress,
true))
{
compression.Write(inputData, 0, inputData.Length);
}
File.WriteAllBytes(@"c:\compressed.gz", output.ToArray());
}
目前尚不清楚为什么你在这里首先使用MemoryStream
,因为你正在将数据写入文件......