我目前正在尝试提取使用GZip压缩的文件。 我想在使用Windows Mobile 6的移动设备上进行programmaticaly。 我使用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调试器时,一切正常。
编辑: 由于ctackle评论,问题不再出现。 提示是执行
System.Threading.Thread.Sleep(1);
此指令在循环期间为visual studio提供句柄,并防止程序崩溃。