Распакуйте файлы в 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);