我目前正在尝试提取使用 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 提供句柄并防止程序崩溃。