UWP broadFileSystemAccess с использованием System.IO для чтения и извлечения rar-файлов - PullRequest
0 голосов
/ 02 июня 2018

Я нацеливаюсь на сборку 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?Чего мне не хватает?

1 Ответ

0 голосов
/ 04 июня 2018

В качестве введения в документ возможность broadFileSystemAccess и Доступ к дополнительным расположениям ,

Эта возможность работает для API в Windows.Storage Пространство имен.

Таким образом, вы все еще не можете получить файл напрямую по пути к файлу, как E:\, используя sharpispress 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у приложения есть разрешение на доступ к файлу, вы не можете использовать ни один 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();
}
...