C# UWP 在用户自定义目的地创建 zip

C# UWP create zip in user custom destination

我正在尝试在 UWP 应用程序中创建 zip。我需要在自定义位置创建 zip,所以我使用文件夹选择器。但是如果我 select 文件夹来保存 zip,如果我正在为这个补丁创建 zip,那么访问这个补丁会被拒绝。

这是我的代码:

public async Task CreateZipFile2()
{
   Windows.Storage.StorageFolder storageFolder = Windows.Storage.ApplicationData.Current.LocalFolder;

   var folderPicker = new Windows.Storage.Pickers.FolderPicker();
   folderPicker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.Desktop;
   folderPicker.FileTypeFilter.Add("*");

   Windows.Storage.StorageFolder folder = await folderPicker.PickSingleFolderAsync();
   if (folder != null)
   {
       Windows.Storage.AccessCache.StorageApplicationPermissions.FutureAccessList.AddOrReplace("PickedFolderToken", folder);
       await Task.Run(() =>
       {
            ZipFile.CreateFromDirectory($"{storageFolder.Path}\source", $"{folder.Path}\e.zip", CompressionLevel.NoCompression, false);
       });
   }
}

感谢您的帮助。

这是预期的行为。使用 ZipFile.CreateFromDirectory 方法 时,在这种情况下无法访问目标文件,因为它是桌面 API。它的工作方式不同于 UWP 本机存储 API.

当您使用文件夹选择器选择目标文件夹时,您的应用将获得访问目标文件夹的权限,但这适用于存储 API。 ZipFile API 尝试使用 System.IO 而不是 Windows.Storage API 直接打开路径,但失败了。

对于 UWP 应用程序拥有所有权限的本地文件夹等位置,ZipFile API 将起作用。例如,您可以将目标文件夹更改为本地文件夹,这样就可以了。像这样:

 ZipFile.CreateFromDirectory($"{storageFolder.Path}\source", $"{storageFolder.Path}\e.zip", CompressionLevel.NoCompression, false);

我的建议是您可以在本地文件夹中创建zip文件,然后使用StorageFile.CopyAsync Method将文件复制到用户所在的目标文件夹中选择。

像这样:

    StorageFile file = await storageFolder.GetFileAsync("e.zip");
        await file.CopyAsync(folder);

那么你只需要删除本地文件夹中的旧文件即可。

您无权访问“{storageFolder.Path}\source”,只能访问“{storageFolder.Path}”,因此请将其删除。只有用户可以通过 FolderPicker 给你一个文件夹的权限,你不能change/complement这个文件夹。

 await Task.Run(() =>
   {
        ZipFile.CreateFromDirectory($"{storageFolder.Path}", $"{folder.Path}\e.zip", CompressionLevel.NoCompression, false);
   });