c# - UWP broadFileSystemAccess 使用 System.IO 读取和提取 rar 文件
问题描述
我的目标是构建 17134 并尝试使用 system.IO 来获取目录中的文件。我还使用sharpcompress 来提取.rar 文件。根据我的理解/我在网上阅读的内容,新的受限功能“broadFileSystemAccess”应该允许我的应用程序完全访问任何目录。我的代码在下面,ATM 我在 E 驱动器上的硬编码目录中传递。
public void DirSearch(string sDir)
{
var ext = new List<string> { "*.rar", "*.zip" };
foreach (String fileExtension in ext)
{
foreach (String file in Directory.EnumerateFiles(sDir, fileExtension, SearchOption.AllDirectories))
{
var archive = ArchiveFactory.Open(file);
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
Console.WriteLine(entry.Key);
entry.WriteToDirectory(@"E:\temp\", new ExtractionOptions() { ExtractFullPath = true, Overwrite = true });
}
}
Debug.WriteLine(file);
}
}
}
这似乎对我不起作用,因为我总是得到:
System.UnauthorizedAccessException: 'Access to the path 'E:\rars' is denied.'
我也尝试过使用文件夹选择器 + storageFile,它确实列出了 rar 文件,但是下面的行会引发 UnauthorizedAccessException 错误:
var archive = ArchiveFactory.Open(file);
如何使用 System.IO 和使用 broadFileSystemAccess 功能的 Sharpcompress 读取和写入我的 E 驱动器?我错过了什么?
解决方案
此功能适用于Windows.Storage命名空间中的 API。
因此,您仍然无法像E:\
使用Sharpcompress API那样直接通过文件路径获取文件。但是您可以使用StorageFolder.GetFolderFromPathAsync
Api 获取文件夹,然后使用该ArchiveFactory.Open(Stream stream, ReaderOptions readerOptions = null)
方法来精确文件。
这是一些示例代码,您可以将其作为参考。
public async void DirSearch(string sDir)
{
var ext = new List<string> { ".rar", ".zip" };
var folder = await StorageFolder.GetFolderFromPathAsync(sDir);
var exactFile = await folder.CreateFileAsync("newFile", CreationCollisionOption.GenerateUniqueName);
using (var writeStream = await exactFile.OpenStreamForWriteAsync())
{
foreach (var file in await folder.GetFilesAsync())
{
if (ext.Contains(file.FileType))
{
var stream = await file.OpenReadAsync();
var archive = ArchiveFactory.Open(stream.AsStream());
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
Console.WriteLine(entry.Key);
entry.WriteTo(writeStream);
}
}
Debug.WriteLine(file);
}
}
}
}
---更新---
由于 UWP 应用具有文件访问权限,因此您不能使用 none Windows.Storage namespace api 直接访问文件路径E:\foldre\
,但您的应用对本地文件夹具有完全权限,您可以使用IArchiveEntry.WriteToDirectory(string destinationDirectory)
方法将文件精确到本地文件夹,然后你可以将文件复制到你想要的文件夹位置,试试下面的代码,
public async void DirSearch(string sDir)
{
var ext = new List<string> { ".rar", ".zip" };
var folder = await StorageFolder.GetFolderFromPathAsync(sDir);
var ExactLocalFolder =await ApplicationData.Current.LocalFolder.CreateFolderAsync("ExactLocalFolder");
foreach (var file in await folder.GetFilesAsync())
{
if (ext.Contains(file.FileType))
{
var stream = await file.OpenReadAsync();
var archive = ArchiveFactory.Open(stream.AsStream());
foreach (var entry in archive.Entries)
{
if (!entry.IsDirectory)
{
Console.WriteLine(entry.Key);
//extract the files to local folder
entry.WriteToDirectory(ExactLocalFolder.Path);
}
}
}
}
//copy the files to the folder that you want to save the extract file into
foreach (var file in await ExactLocalFolder.GetFilesAsync())
{
await file.CopyAsync(folder);
}
//delete the folder in the local folder
await ExactLocalFolder.DeleteAsync();
}
推荐阅读
- java - Person[]::new 调用了哪个类的构造函数
- linux - 即使服务器中有图像,Docker API 也总是返回空 JSON
- java - 如果它不是 int,如何捕获用户输入?
- python - 如何使用 feedparser 在 tkinter 文本小部件中添加文本链接?
- python - 量子隐形传态之前 qbit 崩溃
- angular - 在 CKEditor 5 中保留标准插件的样式属性
- javascript - 如何在javascript中使用模型函数?
- elixir - 无法编译依赖项:salty,“混合编译”失败。**(混合)无法使用“make”编译(退出状态:2)
- c++ - 是否可以在 C++ 中的类对象中添加整数类型值?
- python-3.x - 协议 = 4 泡菜(python 3.7):加载具有相同键的字典时出现键错误