1

我目前正在尝试提取使用 GZip 压缩的文件。我想在使用 Windows Mobile 6 的移动设备上进行编程。我使用 Compact Framework 3.5 和 C#。

压缩文件大小约为 4 MB。原始文件(文本文件)的大小约为 42 MB。我的算法在提取过程中崩溃。每次解压后的文件大小达到约 33.2 MB 时,它都会崩溃。

我的算法是否因为文件大小限制而崩溃?我知道紧凑型框架的内存限制约为 32 MB,但不应满足此内存限制,因为我使用缓冲区来提取文件。我对吗 ?

这是算法:

private void Extract(string GZippedFile, string TargetFile)
{
  int BUFFER_SIZE = 32768;

  using (FileStream InStream = new FileStream(GZippedFile, FileMode.Open, FileAccess.Read))
  {
    using (GZipStream GZipStream = new GZipStream(InStream, CompressionMode.Decompress))
    {
      using (FileStream OutStream =
        new FileStream(TargetFile, FileMode.Create, FileAccess.Write))
      {
        byte[] tempBytes = new byte[BUFFER_SIZE];
        int i;
        while ((i = GZipStream.Read(tempBytes, 0, tempBytes.Length)) != 0)
        {
          OutStream.Write(tempBytes, 0, i);
        }
      }
    }
  }
}

此外,通常在 Windows Mobile 上达到内存限制时,会显示一条系统消息。当该程序崩溃时,情况并非如此。

此外,设备上还有足够的存储内存和程序内存(通过系统上的设置>>内存显示)。

你有什么主意吗 ?

编辑:对不起,我想我错了。事实上,这个问题只发生在我用 Visual Studio 调试程序时。我正在使用 TCp/Connect 链接 Visual Studio 和我的设备。

我认为真正的问题如下:

  • 文件提取占用大量设备资源;

  • 由于设备太忙,无法与Visual Studio保持tcp连接;

  • Visual Studio 与设备之间的连接丢失,这会使整个程序崩溃,而不会向设备上的用户发出任何警告(在运行 Visual Studio 的 PC 上,会显示一条消息,警告连接已丢失)。

当我不使用 Visual Studio 调试器时,一切正常。

编辑: 由于 cackle 评论,问题不再出现。提示是执行一个

System.Threading.Thread.Sleep(1);

该指令在循环期间为 Visual Studio 提供句柄并防止程序崩溃。

4

1 回答 1

-1

也许考虑使用第 3 方工具?

http://www.icsharpcode.net/OpenSource/SharpZipLib/

于 2010-01-28T15:08:01.273 回答