【发布时间】:2017-04-25 22:28:49
【问题描述】:
我正在尝试修改文件流,但遇到了一些有趣的事情。当我从原始流中读取一个字符串,然后尝试将其写入一个新流时,我最终会得到比原始流更大的大小。
我没有发现任何类似的问题。有人可以澄清发生了什么吗?我逐步检查并记录了变量的大小
private Stream CopyAndChangeStreamContents(Stream input)
{
input.Position = 0; //input.Length is (long)84863
string contents = new StreamReader(input).ReadToEnd(); //contents.Length is (int)80765
Stream output = new MemoryStream();
new StreamWriter(output).Write(contents); //output.Length is (long)151950
output.Flush();
return output;
}
编辑 #2 Downvoter:该方法的 cmets 和意图并没有解释这里发生了什么。无论正在读取什么类型的数据,我都想了解是什么底层流特性导致了如此巨大的大小差异。
读取字节时,不管它来自 zip 文件还是文本文件,字节仍然是字节,所以如果我有输入 0110 0001 0110 0010 0110 0011 0110 0100,我希望仍会读取 4 个字节。即使我将其读取为字符串“abcd”,如果我完全按照我找到的方式写回二进制文件,它也不会对我产生影响。
为什么一个 Stream 给我的长度是 84863,而另一个 Stream 给我的长度是 151950?
编辑: 我尝试使用 StreamReader 构造函数来尝试读取编码:
var reader = new StreamReader(input, true);
然后在写出时使用相同的编码:
new StreamWriter(output, reader.CurrentEncoding).Write(contents);
..无济于事。同样的问题。
【问题讨论】:
-
原始源文件可能是ASCII,但你写的是UTF8。如果您只想复制文件,则不应将它们视为文本。
-
这样
input.CopyTo(output)就可以了。 -
我尝试设置编码但没有运气。我会用代码更新问题
-
@PixelCakeGames 您是否尝试将 DOCX 文件作为字符串读取?如果是这样,那就行不通了。 DOCX 基本上是一个包含一堆 XML 文件的 ZIP 文件——它是实际描述文档的 XML 文件。您需要编辑 XML 文件 - 通常的方法是使用 OpenXML SDK 或围绕它的更易于使用的包装器之一。
-
@PixelCakeGames 肯定与您正在阅读的文字有关...