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);
});
我正在尝试在 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);
});