【问题标题】:System.UnauthorizedAccessException: Access to the path is denied (UWP C#)System.UnauthorizedAccessException:对路径的访问被拒绝(UWP C#)
【发布时间】:2018-07-19 08:27:19
【问题描述】:

我正在开发一个允许使用 imgur api 将图像上传到 imgur 的 uwp 平台。 我正在这样做:

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.ThrowForNonSuccess(任务 任务)在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务 任务)在 System.IO.WinRTFileSystem.Open(字符串 fullPath,FileMode 模式、FileAccess 访问、FileShare 共享、Int32 bufferSize、 FileOptions 选项,FileStream 父级)在 System.IO.MultiplexingWin32WinRTFileSystem.Open(字符串 fullPath, FileMode 模式、FileAccess 访问、FileShare 共享、Int32 bufferSize、 FileOptions 选项,FileStream 父级)在 System.IO.FileStream.Init(String path, FileMode mode, FileAccess 访问、FileShare 共享、Int32 bufferSize、FileOptions 选项)在 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess 访问,文件共享共享)在 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(任务 任务)在 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

我一整天都看到了很多关于这个的话题

【问题讨论】:

  • 你能在 %appdata% 中重新创建写入目录

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


【解决方案1】:

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

但是,您可以通过调用适当的扩展方法从检索到的StorageFile bu 中获取流:

var stream = await file.OpenStreamForReadAsync();

更新

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

【讨论】:

    【解决方案2】:

    自 2018 年 4 月更新 Windows 10 以来,您可以声明 >Broad Filesystem 访问功能,该功能将允许您的应用 > 访问文件系统中的任何路径,即使使用 >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: 'Access to the path 'C:\1\1.txt' is denied.'

    【讨论】:

    • 我也刚刚发现了这一点。你找到解决这个问题的方法了吗? (除了使用 StorageFile API)
    【解决方案3】:

    根据 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多