使用System.IO读取和提取rar文件的UWP broadFileSystemAccess

时间:2018-06-02 18:06:40

标签: c# uwp read-write file-access

我的目标是构建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);

如何使用broadFileSystemAccess功能使用System.IO和Sharpcompress读取和写入我的E盘?我错过了什么?

1 个答案:

答案 0 :(得分:0)

正如文档broadFileSystemAccess capabilityAccessing additional locations中的介绍,

  

此功能适用于Windows.Storage命名空间中的API。

因此,您仍然无法使用sharpcompress Apis通过文件的路径E:\直接获取文件。但您可以使用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应用程序具有文件访问权限,因此您不能使用任何Windows.Storage命名空间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();
}