0

我在我的应用程序中使用了这个(如何在 Windows Phone 8 中解压缩文件)中的 UnZipper 类来获取带有图像的 zip,但在极少数情况下它会给我这个错误:

System.Windows.ni.dll System.OutOfMemoryException 中发生了“System.OutOfMemoryException”类型的第一次机会异常:引发了“System.OutOfMemoryException”类型的异常。在 System.Windows.Application.GetResourceStreamInternal(StreamResourceInfo zipPackageStreamResourceInfo, Uri resourceUri) 在 System.Windows.Application.GetResourceStream(StreamResourceInfo zipPackageStreamResourceInfo, Uri uriResource) 在 ImperiaOnline.Plugins.UnZipper.GetFileStream(String filename) 在 ImperiaOnline.Plugins.IOHelpers.unzip (字符串 zipFilePath,字符串 zipDestinationPath)

该设备有超过两倍需要的可用内存。有人可以帮我解决这个问题。这是我的代码:

public static void unzip(string zipFilePath,string zipDestinationPath) {
            using (IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForApplication())
            {
                var dirNames = isolatedStorage.GetDirectoryNames(zipDestinationPath);
                bool doesFolderExists = (dirNames.Length > 0) ? true : false;
                if (!doesFolderExists)
                {
                    Debug.WriteLine("Folder does not exists");
                    isolatedStorage.CreateDirectory(zipDestinationPath);
                }
                try
                {
                    using (IsolatedStorageFileStream zipFile = isolatedStorage.OpenFile(zipFilePath, FileMode.Open, FileAccess.ReadWrite))
                    {
                        UnZipper unzip = new UnZipper(zipFile);
                        bool isModuleFolderDeleted = false;
                        foreach (string currentFileAndDirectory in unzip.FileNamesInZip())
                        {
                            string[] fileLocations = currentFileAndDirectory.Split('/');
                            string prefix = zipDestinationPath + '/';
                            int locationsCount = fileLocations.Length;
                            string fileName = fileLocations.Last();
                            string currentPath = prefix;
                            for (int i = 0; i < locationsCount - 1; i++)
                            {
                                dirNames = isolatedStorage.GetDirectoryNames(currentPath + fileLocations[i]);
                                doesFolderExists = (dirNames.Length > 0) ? true : false;
                                if (!doesFolderExists)
                                {
                                    isolatedStorage.CreateDirectory(currentPath + fileLocations[i]);
                                    if (i == 2)
                                    {
                                        isModuleFolderDeleted = true;
                                    }
                                }
                                else if (i == 2 && !isModuleFolderDeleted)
                                {
                                    Debug.WriteLine(currentPath + fileLocations[i] + " is deleted and recreated");
                                    DeleteDirectoryRecursively(isolatedStorage, currentPath + fileLocations[i]);
                                    isolatedStorage.CreateDirectory(currentPath + fileLocations[i]);
                                    isModuleFolderDeleted = true;
                                }
                                currentPath += fileLocations[i] + '/';
                            }
                            var newFileStream = isolatedStorage.CreateFile(currentPath + fileName);
                            byte[] fileBytes = new byte[unzip.GetFileStream(currentFileAndDirectory).Length];
                            unzip.GetFileStream(currentFileAndDirectory).Read(fileBytes, 0, fileBytes.Length);
                            unzip.GetFileStream(currentFileAndDirectory).Close();
                            try
                            {
                                newFileStream.Write(fileBytes, 0, fileBytes.Length);
                            }
                            catch (Exception ex)
                            {
                                Debug.WriteLine("FILE WRITE EXCEPTION: " + ex);
                                newFileStream.Close();
                                newFileStream = null;
                                zipFile.Close();
                                unzip.Dispose();
                            }
                            newFileStream.Close();
                            newFileStream = null;
                        }
                        zipFile.Close();
                        unzip.Dispose();
                    }
                }
                catch (Exception ex)
                {
                    Debug.WriteLine(ex);
                }

                isolatedStorage.DeleteFile(zipFilePath);
            }
        }

此错误出现在这里:

var newFileStream = isolatedStorage.CreateFile(currentPath + fileName);
byte[] fileBytes = new byte[unzip.GetFileStream(currentFileAndDirectory).Length]; unzip.GetFileStream(currentFileAndDirectory).Read(fileBytes, 0, fileBytes.Length);
unzip.GetFileStream(currentFileAndDirectory).Close();

我调试了它,但它失败了

byte[] fileBytes = new byte[unzip.GetFileStream(currentFileAndDirectory).Length];

我检查了 GetFileStream 方法

public Stream GetFileStream(字符串文件名)
        {
            如果(文件条目 == 空)
                fileEntries = ParseCentralDirectory(); //我们需要这样做,以防 zip 采用 Silverligth 不喜欢的格式
            多头头寸 = this.stream.Position;
            this.stream.Seek(0, SeekOrigin.Begin);
            Uri fileUri = new Uri(filename, UriKind.Relative);
            StreamResourceInfo info = new StreamResourceInfo(this.stream, null);
            StreamResourceInfo 流 = System.Windows.Application.GetResourceStream(info, fileUri);
            this.stream.Position = 位置;
            如果(流!= null)
                返回流。流;
            返回空值;
        }

它在这一行抛出 OutOfMemory 异常:

StreamResourceInfo 流 = System.Windows.Application.GetResourceStream(info, fileUri);
4

0 回答 0