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);
            }

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

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

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

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

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


person maluss    schedule 08.02.2018    source источник
comment
Можете ли вы воссоздать запись в каталог в% appdata%   -  person colinwurtz    schedule 08.02.2018


Ответы (3)


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

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

var stream = await file.OpenStreamForReadAsync();

Обновлять

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

person Martin Zikmund    schedule 08.02.2018

После обновления 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 »запрещен».

person Irakli Lomidze    schedule 29.06.2018
comment
Я тоже это только что обнаружил. Вы нашли способ решить эту проблему? (кроме использования StorageFile API) - person Michael Kreich; 06.12.2018

Согласно документам 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-access-permissions

person Clinton Avery    schedule 25.06.2021