UWP broadFileSystemAccess с использованием System.IO для чтения и извлечения файлов rar

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
1 178
1

Ответы 1

Как введение в документе возможность 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();
}

Спасибо, он работает с простыми файлами .zip, но не с файлами .rar, состоящими из нескольких частей. Он считает, что поток читает только исходный файл .rar и ни одну из дополнительных частей

Steve Fitzsimons 05.06.2018 00:21

@SteveFitzsimons Я добавил в свой ответ часть Обновлять, пожалуйста, проверьте это.

Breeze Liu - MSFT 05.06.2018 05:17

Другие вопросы по теме