C# 关于StreamWriter和压缩工作原理的困惑

C# 关于StreamWriter和压缩工作原理的困惑,c#,.net,C#,.net,在开始之前,是否可以使用streamwriter编写包含混合内容的.doc文件?例如,我可能有一个包含图像和文本的.doc文件-streamwriter适合这样做吗?我假设textwriter用于编写纯文本文档 我想做的是压缩一个文件(格式未知),这很简单。但我感到困惑的是,我为什么要称之为减压?这将使大小成为其正常值和更大的值,那么这有什么意义呢?如果我想压缩一个文件并将其发送到网络驱动器,我应该压缩它,将其复制到网络位置,然后将其解压缩到新文件吗?此应用程序将是windows服务,因此我需要

在开始之前,是否可以使用streamwriter编写包含混合内容的.doc文件?例如,我可能有一个包含图像和文本的.doc文件-streamwriter适合这样做吗?我假设textwriter用于编写纯文本文档

我想做的是压缩一个文件(格式未知),这很简单。但我感到困惑的是,我为什么要称之为减压?这将使大小成为其正常值和更大的值,那么这有什么意义呢?如果我想压缩一个文件并将其发送到网络驱动器,我应该压缩它,将其复制到网络位置,然后将其解压缩到新文件吗?此应用程序将是windows服务,因此我需要使用windows模拟,对吗


谢谢

一个Word
.doc
文件有一个非常特殊的二进制格式;我不确定
StreamWriter
是否会使编写一个流式编写器变得容易

再压缩。。。您可以使用
GZipStream
之类的方法压缩数据流,但这通常用于传输目的;收件人还需要了解如何对其进行解压缩(例如,TCP客户端/服务器可能同意使用压缩)。对于一个文件,假设您希望它在另一端是“原始的”,那么您需要在另一端提供一个服务来解压缩它

就个人而言,对于本地网络的使用,我不确定它是否值得,除非你正在转移大量的数据-只需使用
robocopy
并使用快速网络即可

对于internet使用,大多数协议都内置了压缩支持。Http,其中gzip/deflate最为明显


当然,如果您谈论的是归档,那么将文件存储在.zip归档之类的东西中非常有意义。。。在“整体”执行此操作时,我倾向于在离物理磁盘最近的服务器上运行存档工具,以最大限度地提高IO性能。

Word
.doc
文件具有非常特定的二进制格式;我不确定
StreamWriter
是否会使编写一个流式编写器变得容易

再压缩。。。您可以使用
GZipStream
之类的方法压缩数据流,但这通常用于传输目的;收件人还需要了解如何对其进行解压缩(例如,TCP客户端/服务器可能同意使用压缩)。对于一个文件,假设您希望它在另一端是“原始的”,那么您需要在另一端提供一个服务来解压缩它

就个人而言,对于本地网络的使用,我不确定它是否值得,除非你正在转移大量的数据-只需使用
robocopy
并使用快速网络即可

对于internet使用,大多数协议都内置了压缩支持。Http,其中gzip/deflate最为明显


当然,如果您谈论的是归档,那么将文件存储在.zip归档之类的东西中非常有意义。。。在“整体”执行此操作时,我倾向于在离物理磁盘最近的服务器上运行存档工具,以最大限度地提高IO性能。

我认为您对一般的压缩感到困惑

您可以“压缩”任何数据以减小其大小。但是,通过减小数据的大小,数据的结构也必须改变

因此,如果将MS Word文档保存为.doc文件,则会在.doc文件中获得MS Word文档结构

但是如果你压缩.doc文件,压缩算法的魔力会使文件变小。。。但它将不再包含MS Word文档结构

那么MS Word如何读取它得到的外来结构呢?不可能

这就是为什么您必须“解压缩”,以恢复压缩前的任何数据结构,使其再次变得有用

例如,假设您有一个句子“Woah.NET rocks”,某个压缩算法可能会用英语词典中的一页替换每个单词,并生成字符串“77 69 84”

那么你如何理解字符串“776984”

这当然没有意义!因为它被压缩了

要再次理解它,您必须对其进行解压缩,如下所示:

77 -> Woah
69 -> .NET
84 -> rocks
因此,基本上,您正在获取“其他人”的数据结构并对其进行压缩。压缩后的数据对他们来说没有意义,因为它是压缩的形式。因此,你必须“解压”它,以便“其他人”可以再次阅读。”


我对你的问题理解正确吗?

我想你对一般的压缩感到困惑

您可以“压缩”任何数据以减小其大小。但通过减小其大小,数据的结构也必须改变

因此,如果将MS Word文档保存为.doc文件,则会在.doc文件中获得MS Word文档结构

但是如果你压缩.doc文件,压缩算法的魔力会使文件变小……但它不再包含MS Word文档结构

那么微软Word怎么能读取它得到的外星人结构呢?它不能

这就是为什么您必须“解压缩”,以恢复压缩前的任何数据结构,使其再次变得有用

例如,假设您有一个句子“Woah.NET rocks”,某个压缩算法可能会用英语词典中的一页替换每个单词,并生成字符串“77 69 84”

那么你如何理解字符串“776984”

这当然没有意义!因为它已经被压缩了

要再次理解它,您必须对其进行解压缩,如下所示:

77 -> Woah
69 -> .NET
84 -> rocks
因此,基本上,您是在获取“其他人”的数据结构并对其进行压缩。压缩后,数据对他们来说将没有意义,因为它是压缩的形式。因此,您必须“解压缩”它,以便“其他人”可以再次读取它


我对你的问题理解正确吗?

首先,我发了上述帖子,但不是在家的时候,所以我使用了一个未注册的帐户

你有安全套吗
      MemoryStream ms = new MemoryStream();
        // Use the newly created memory stream for the compressed data.
        DeflateStream compressedzipStream = new DeflateStream(ms, CompressionMode.Compress, true);
        Console.WriteLine("Compression");
        compressedzipStream.Write(buffer, 0, buffer.Length);
        // Close the stream.
        compressedzipStream.Close();
        Console.WriteLine("Original size: {0}, Compressed size: {1}", buffer.Length,    ms.Length);