在UWP中从归档中提取特定文件

时间:2016-04-19 20:14:21

标签: c# zip win-universal-app

为了节省空间,我已经在我的UWP项目中压缩了我的书籍(xml格式)。我想根据文件的名称将文件解压缩到我的本地文件夹。

直到现在我做了什么(这会提取所有文件):

ZipFile.ExtractToDirectory(sourceCompressedFile.Path, destinationFolder.Path);

但是,这会将我的存档中的所有文件提取到目标文件夹。我知道使用 SharpZipLib 这可能是一项微不足道的任务,但这是一个内置的方法,可以帮助我减少我的应用程序大小。我只想提取一个名称与我提供的名称相匹配的文件。除此之外还有三种方法,但我迷失了方法。

这可以使用DotNetZip轻松完成,如here所示,但我不想使用任何第三方库

2 个答案:

答案 0 :(得分:1)

好吧...明白了!

首先,要读取特定条目,请使用ZipArchiveEntry.GetEntry(entrytosearch);

第二,无法将ZipArchiveEntry读入IRandomAccessStream,我不知道为什么……在决定先在内存中读取之前,摆弄了好一阵子。由于我正在做的是读取要显示在屏幕上的图像,因此对内存管理的影响有限。但是,如果您要阅读的东西很大,请当心。在阅读之前,我会检查条目的.Length。但是,为简单起见,这是更新的代码,用于将zip文件的特定“ .jpg”条目读取到Image.Source中。

还不是优雅或精致,但是我希望它可以节省我花时间摆弄这个东西的时间!

    public class ZipItem
    {
        public StorageFile motherfile { get; set; }
        public ZipArchiveEntry motherentry { get; set; }
        public string Name { get; set; }
        public string ActualBytes { get; set; }
        public string CompressedBytes { get; set; }
    }

    public List<ZipItem> results;
    public int i = 0;

    private async void  nextimg_Click(object sender, RoutedEventArgs e)
    {
        //Open the zip file. At that point in the program, I previously read
        //all zip files in a hierarchy and stored them in the "results" a 
        //list of ZipItems populated in another method. i points to the
        //image I wish to display in the list. 

        Stream stream = await results[i].motherfile.OpenStreamForReadAsync();

        using (ZipArchive archive = new ZipArchive(stream, ZipArchiveMode.Read))
        {
            //look for the entry "i", which is my current slideshow position
            ZipArchiveEntry entry = archive.GetEntry(results[i].motherentry.Name);

            //Open the entry as a stream
            Stream fileStream = entry.Open();

            //Before I read this in memory, I do check for entry.Length to make sure it's not too big. 
            //For simplicity purposes here, I jsut show the "Read it in memory" portion
            var memStream = new MemoryStream();
            await fileStream.CopyToAsync(memStream);
            //Reset the stream position to start
            memStream.Position = 0;

            //Create a BitmapImage from the memStream;
            BitmapImage bitmapImage = new BitmapImage();
            bitmapImage.DecodePixelHeight = (int)ctlImage.Height;
            bitmapImage.DecodePixelWidth = (int)ctlImage.Width;

            //Set the source of the BitmapImage to the memory stream
            bitmapImage.SetSource(memStream.AsRandomAccessStream());

            //Set the Image.Source to the BitmapImage
            ctlImage.Source = bitmapImage;
            }
        }
    }

答案 1 :(得分:0)

我认为您在一个zip存档中压缩了多个文件,因此ZipFile.ExtractToDirectory Method (String, String)会将指定zip存档中的所有文件解压缩到一个目录中。

如果您只想访问此压缩存档中的一个特殊文件,可以使用ZipArchiveEntry Class来完成此项工作,例如:

StorageFolder _folder = await Windows.ApplicationModel.Package.Current.InstalledLocation.GetFolderAsync("Assets");
/*fails here FileNotFound*/
StorageFile sourceCompressedFile = await _folder.GetFileAsync("archived.zip");

StorageFolder folder = ApplicationData.Current.LocalFolder;

// ZipFile.ExtractToDirectory(file.Path, folder.Path);

using (ZipArchive archive = ZipFile.OpenRead(sourceCompressedFile.Path))
{
    foreach (ZipArchiveEntry entry in archive.Entries)
    {
        if (entry.FullName.ToString() == "miao2.jpg")
        {
            entry.ExtractToFile(Path.Combine(folder.Path, entry.FullName));
        }
    }
}

我将几张图片压缩为“archived.zip”文件进行测试,在此示例中,它只会提取名为“miao2.jpg”的图像文件。