System.UnauthorizedAccessException:拒绝访问路径(UWP C#)

时间:2018-02-08 17:08:11

标签: c# .net uwp imgur access-rights

我正在开发一个uwp平台,允许使用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档案\ mmmh.PNG'被拒绝。在   System.IO.WinRTIOExtensions.d__2`1.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   System.IO.WinRTFileSystem.d__41.MoveNext())   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.IO.WinRTFileSystem.Open(String fullPath,FileMode   模式,FileAccess访问,FileShare共享,Int32 bufferSize,   FileOptions选项,FileStream parent)at   System.IO.MultiplexingWin32WinRTFileSystem.Open(String fullPath,   FileMode模式,FileAccess访问,FileShare共享,Int32 bufferSize,   FileOptions选项,FileStream parent)at   System.IO.FileStream.Init(String path,FileMode mode,FileAccess   访问,FileShare共享,Int32 bufferSize,FileOptions选项)at   System.IO.FileStream..ctor(String path,FileMode mode,FileAccess   访问,FileShare共享)at   App1.MainPage<> c__DisplayClass7_1< b__0> d.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务   任务)在System.Runtime.CompilerServices.TaskAwaiter.GetResult()
      在App1.MainPage.d__7.MoveNext()   ---从抛出异常的先前位置开始的堆栈跟踪结束--- at   System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务   任务)   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 个答案:

答案 0 :(得分:4)

当用户使用FileOpenPicker选择任意文件时,您将获得StorageFile个实例。这是您可以访问该文件的唯一方法,您不能直接使用Path,因为该API不在WinRT沙箱下。您只能使用AppData直接访问应用Path目录中的文件。

然而,您可以从检索到的StorageFile bu获取一个流,并调用相应的扩展方法:

var stream = await file.OpenStreamForReadAsync();

更新

这篇文章中的信息现在已经过时了。自2018年4月更新Windows 10以来,您可以声明一个Broad Filesystem访问功能,该功能将允许您的应用访问文件系统中的任何路径,即使使用System.IO API也是如此。但是,在认证过程中会检查此功能,因此您必须确保应用程序有充分理由可以访问所有用户的文件系统,因为您的应用程序将被拒绝,以防止恶意滥用。

答案 1 :(得分:1)

  

自2018年4月Windows 10更新以来,您可以声明>广泛的文件系统访问功能,该功能使您的应用程序即使使用> System.IO API也可以访问文件系统中的任何路径。

不,不是

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'的访问被拒绝。'

答案 2 :(得分:0)

根据 Microsoft Docs,UWP 应用程序是沙盒化的,这意味着(与控制台应用程序不同)它们对计算机资源的访问权限有限。可以通过修改 Package.appxmanifest 为 UWP 应用授予其他功能。

这些链接有完整的故事:

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