首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在一个ZIP文件中归档多个文件?

如何在一个ZIP文件中归档多个文件?
EN

Stack Overflow用户
提问于 2018-08-20 20:56:59
回答 3查看 129关注 0票数 1

我正在尝试将文件夹的内容存档到zip文件中。内容大多是大图片。我正在尝试使用以下代码来完成此操作:

代码语言:javascript
运行
复制
var folderPicker =
      new Windows.Storage.Pickers.FolderPicker();
folderPicker.SuggestedStartLocation =
      Windows.Storage.Pickers.PickerLocationId.Desktop;
folderPicker.FileTypeFilter.Add("*");
StorageFolder folder = await folderPicker.PickSingleFolderAsync();
if (folder != null)
  {
    StorageFile zipFile = await folder.CreateFileAsync(ThemeName.Text + ".zip",
        Windows.Storage.CreationCollisionOption.GenerateUniqueName);
    Stream themeZipFile = await zipFile.OpenStreamForWriteAsync();
    ZipArchive archive = new ZipArchive(themeZipFile);
    StorageFolder localFolder = ApplicationData.Current.LocalFolder;
    StorageFolder temp = await localFolder.GetFolderAsync("Temp");
    var files = await temp.GetFilesAsync();
    foreach (var item in files)
      {
        archive.CreateEntryFromFile(item.Path, item.Name);
      }
   }

但是,在执行时,我收到一个错误:

IOException:无法查找为负数的绝对流位置。

现在,当我尝试这段代码时:

代码语言:javascript
运行
复制
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
var folderPicker = new Windows.Storage.Pickers.FolderPicker();
folderPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop;
folderPicker.FileTypeFilter.Add("*");
StorageFolder folder = 
    await folderPicker.PickSingleFolderAsync();
if (folder != null)
  {
    StorageFile zipFile =
        await folder.CreateFileAsync(ThemeName.Text + ".zip", Windows.Storage.CreationCollisionOption.GenerateUniqueName);
    await Task.Run(() => ZipFile.CreateFromDirectory(localFolder.Path, zipFile.Path));
  }

我得到的访问权限被拒绝,无论我选择的文件夹!我如何解决这个问题,将几个较大的文件合并到一个归档文件中?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-08-21 16:01:39

如何将多个文件归档到一个

文件中?

CreateFromDirectory方法将使用第二个destinationArchiveFileName参数创建zip文件。因此您不需要预先创建zip文件。你可以使用下面的代码直接压缩你的文件夹。

代码语言:javascript
运行
复制
if (ZipFolder != null)
{
    // Application now has read/write access to all contents in the picked folder (including other sub-folder contents)
    StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", ZipFolder);
    await Task.Run(() =>
    {
        try
        {
            ZipFile.CreateFromDirectory(ApplicationData.Current.LocalFolder.Path, $"{ZipFolder.Path}\\{Guid.NewGuid()}.zip");
            Debug.WriteLine("folder zipped");
        }
        catch (Exception w)
        {
            Debug.WriteLine(w);
        }
    });

}
票数 1
EN

Stack Overflow用户

发布于 2018-08-20 21:03:16

使用此方法,您可以从源目录开始创建ZIP文件。以下是微软的一些文档:ZIPFile.CreateFromDirectory

您可以在以下名称空间中找到提到的类和方法: System.IO.Compression

票数 1
EN

Stack Overflow用户

发布于 2018-08-20 21:05:10

如果创建临时文件夹来归档整个文件夹是您的解决方案,请尝试以下方法:

代码语言:javascript
运行
复制
using System.IO.Compression;

var files = System.IO.Directory.EnumerateFiles(string PATH, ".jpeg", System.IO.SearchOption.AllDirectories)

 foreach (var file in files)
   {
   File.Copy(file, tempPath + @"\" + System.IO.Path.GetFileName(file));
   }

ZipFile.CreateFromDirectory(tempPath, zipPath, CompressionLevel.Fastest, true);

Directory.Delete(tempPath, true); //delete tempfolder after compress commplete
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51931277

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档