Распакуйте файлы в Windows Phone 8 - "System.OutOfMemoryException"

Я использовал класс UnZipper из этого поста ( Как разархивировать файлы в Windows Phone 8) в своем приложении для архивов с изображениями, но в некоторых редких случаях он выдает мне эту ошибку:

Первое случайное исключение типа "System.OutOfMemoryException" произошло в System.Windows.ni.dll. System.OutOfMemoryException: было сгенерировано исключение типа "System.OutOfMemoryException". в System.Windows.Application.GetResourceStreamInternal(StreamResourceInfo zipPackageStreamResourceInfo, Uri resourceUri) в System.Windows.Application.GetResourceStream(StreamResourceInfo zipPackageStreamResourceInfo, Uri uriResline. (String zipFilePath, String 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 = новый byte[unzip.GetFileStream(currentFileAndDirectory).Length];                            unzip.GetFileStream(currentFileAndDirectory).Read(fileBytes, 0, fileBytes.Length);
unzip.GetFileStream(currentFileAndDirectory).close();

Я отладил его, и он не работает на

byte[] fileBytes = новый byte [unzip.GetFileStream (currentFileAndDirectory).Length];

Я проверил метод GetFileStream

публичный поток GetFileStream (строка имени файла)
        {
            if (fileEntries == null)
                fileEntries = ParseCentralDirectory(); // Мы должны сделать это, если почтовый индекс в формате, который Silverligth не нравится
            длинная позиция = this.stream.Position;
            this.stream.Seek(0, SeekOrigin.Begin);
            Uri fileUri = новый Uri(имя файла, UriKind.Relative);
            StreamResourceInfo info = new StreamResourceInfo(this.stream, null);
            StreamResourceInfo stream = System.Windows.Application.GetResourceStream(info, fileUri);
            this.stream.Position = position;
            если (поток!= ноль)
                обратный поток. Стрим;
            вернуть ноль;
        }

Выдает исключение OutOfMemory в этой строке:

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

0 ответов

Другие вопросы по тегам