Я нацелен на сборку 17134 и пытаюсь использовать system.IO для получения файлов в каталоге. Я также использую sharpcompress для извлечения файлов .rar. Насколько я понимаю / прочитал в Интернете, новая ограниченная возможность «broadFileSystemAccess» должна разрешить моему приложению полный доступ к любому каталогу. Мой код ниже, а банкомат я передаю в жестко закодированный каталог на моем диске 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);
Как я могу читать и записывать на свой диск E с помощью System.IO и Sharpcompress с помощью возможности broadFileSystemAccess? Что мне не хватает?





Как введение в документе возможность broadFileSystemAccess и Доступ к дополнительным локациям,
This capability works for APIs in the Windows.Storage namespace.
Таким образом, вы по-прежнему не можете получить файл напрямую по пути к файлу, например E:\, с помощью Sharpcompress Apis. Но вы можете использовать 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 имеет разрешение на доступ к файлам, вы не можете использовать API пространства имен Windows.Storage для прямого доступа к пути к файлу, например 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();
}
@SteveFitzsimons Я добавил в свой ответ часть Обновлять, пожалуйста, проверьте это.
Спасибо, он работает с простыми файлами .zip, но не с файлами .rar, состоящими из нескольких частей. Он считает, что поток читает только исходный файл .rar и ни одну из дополнительных частей