System.UnauthorizedAccessException: доступ к пути запрещен (UWP C#)

Я разрабатываю платформу uwp, которая позволяет загружать изображения в imgur с помощью imgur api. Я делаю это:

var picker = new Windows.Storage.Pickers.FileOpenPicker();
        picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
        picker.SuggestedStartLocation =
            Windows.Storage.Pickers.PickerLocationId.PicturesLibrary;
        picker.FileTypeFilter.Add(".jpg");
        picker.FileTypeFilter.Add(".jpeg");
        picker.FileTypeFilter.Add(".png");
        String path;

        Windows.Storage.StorageFile file = await picker.PickSingleFileAsync();
        if (file != null)
        {
            path = file.Path;
        }
        else
        {
            path = "Operation cancelled.";
        }
try
            {
                var client = new ImgurClient("id", "secret");
                var endpoint = new ImageEndpoint(client);
                IImage img;
            await Task.Run(async () =>
            {
                await Task.Yield();
                Debug.Write("crash at FileStream\n");
                using (var fs = new FileStream(@path, FileMode.Open, FileAccess.Read, FileShare.Read))
                {
                    Debug.Write("crash at Upload\n");
                    img = await endpoint.UploadImageStreamAsync(fs);
                    Debug.Write("Image uploaded. Image Url: " + img.Link);
                    Windows.UI.Xaml.Controls.Image image = new Windows.UI.Xaml.Controls.Image();
                    image.Source = new BitmapImage(new Uri(img.Link));
                    image.Width = img.Width;
                    image.Height = img.Height;
                    imgList.Clear();
                    imgList.Add(image);
                    await LoadGalery();
                    index = 0;
                }
            });
            }
            catch (ImgurException imgurEx)
            {
                Debug.Write("An error occurred uploading an image to Imgur.");
                Debug.Write(imgurEx.Message);
            }

У меня есть эта ошибка:

  • $ исключение {System.UnauthorizedAccessException: доступ к пути 'C:\Nouveau dossier\mmmh.PNG' запрещен. в System.IO.WinRTIOExtensions.d__2`1.MoveNext() --- Конец трассировки стека из предыдущего местоположения, в котором было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Задача) в System.IO.WinRTFileSystem.d__41.MoveNext() --- Конец трассировки стека из предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaonSurow задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (Задача) в System.IO.WinRTFileSystem.Open(String fullPath, режим FileMode, доступ к FileAccess, общий доступ к FileShare, размер файла3232 parentSize, опции FileOptions, FileOptions, FileOptions).MultiplexingWin32WinRTFileSystem.Open(String fullPath, режим FileMode, доступ к FileAccess, общий доступ к FileShare, параметры типа3232 bufferSize, параметры FileOptions, родительский файл FileStream) в System.IO.FileStream.Init(путь строки, режим FileMode, FileAcc Доступ ess, общий доступ к FileShare, размер буфера Int32, параметры FileOptions) в System.IO.FileStream..ctor(путь строки, режим FileMode, доступ к FileAccess, общий ресурс FileShare) в App1.MainPage.<> c__DisplayClass7_1. d.MoveNext () --- Конец трассировки стека из предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (задача-задача) в System.Runtime.CompilerServices.TaskAwaiter.GetResult()
    в App1.MainPage.d__7.MoveNext() --- Конец трассировки стека от предыдущего местоположения, где было сгенерировано исключение --- в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) в System.Runtime.CompilerServices.TaskAwaiter. HandleNonSuccessAndDebuggerNotification (Задача) в System.Runtime.CompilerServices.TaskAwaiter.GetResult()
    в App1.MainPage.d__9.MoveNext()} System.UnauthorizedAccessException

Я попытался создать новый каталог в папке C:/ с моей картинкой, изменить права безопасности, запустить Visual Studio от имени администратора, но ничего не изменилось...

Ошибка происходит в var fs = new FileStream(@path, FileMode.Open, FileAccess.Read, FileShare.Read

Я видел много тем об этом весь день, я перепробовал все, но ничего не изменилось, если у кого-то есть идея!

3 ответа

Решение

Когда пользователь выбирает произвольный файл, используя FileOpenPicker, вы получите StorageFile пример. Это единственный способ получить доступ к файлу, вы не можете использовать Path напрямую, поскольку этот API не находится в изолированной программной среде WinRT. Вы можете получить доступ только к файлам в вашем приложении AppData каталог непосредственно с Path,

Однако вы можете получить поток из полученных StorageFile Бу вызывает соответствующий метод расширения:

var stream = await file.OpenStreamForReadAsync();

Обновить

Информация в этом посте сейчас устарела. После обновления Windows 10 от апреля 2018 года вы можете объявить о возможности доступа к широкой файловой системе, которая позволит вашему приложению получить доступ к любому пути в файловой системе, даже если System.IO API-интерфейсы. Эта возможность, однако, проверяется во время сертификации, поэтому вы должны убедиться, что у приложения есть веская причина иметь доступ ко всей файловой системе пользователя, поскольку в противном случае ваше приложение будет отклонено, чтобы предотвратить злонамеренное использование.

После обновления Windows 10 от апреля 2018 года вы можете объявить> возможность доступа к широкой файловой системе, которая позволит вашему приложению> получать доступ к любому пути в файловой системе, даже с помощью> API-интерфейсов System.IO.

Нет

StorageFile file = await 
StorageFile.GetFileFromPathAsync("c:\\1\\1.txt");

//string s = File.ReadAllText("C:\\1\\1.txt");
//string s = await 
File.ReadAllTextAsync("C:\\1\\1.txt");

string text = await 
Windows.Storage.FileIO.ReadTextAsync(file);

var dialog = new MessageDialog("done");
await dialog.ShowAsync();

StorageFile работает нормально, но System.IO имеет исключение System.UnauthorizedAccessException: "Доступ к пути" C:\1\1.txt "запрещен".

Согласно документам Microsoft, приложения UWP изолированы, то есть (в отличие от консольного приложения) они имеют ограниченный доступ к ресурсам компьютера. Можно предоставить дополнительные возможности приложению UWP, изменив Package.appxmanifest.

Эти ссылки содержат полную историю:

https://docs.microsoft.com/en-us/windows/uwp/packaging/app-capability-declarations#custom-capabilities https://docs.microsoft.com/en-us/windows/uwp/files/file -доступ-разрешения

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