我在我的应用程序中使用了这个(如何在 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);