【问题标题】:System.UnauthorizedAccessException when creating a file from Async task从异步任务创建文件时出现 System.UnauthorizedAccessException
【发布时间】:2017-01-25 17:46:29
【问题描述】:

我正在尝试从异步任务创建一个新的 jpeg 文件。相关代码sn-p如下所示

private async void OnSocketConnectionReceived(StreamSocketListener sender, StreamSocketListenerConnectionReceivedEventArgs args)
{
   await ReceiveFile(args);
}

private async Task ReceiveFile(StreamSocketListenerConnectionReceivedEventArgs args)
{
  string pathString = @"C:\Users\sarav\test.jpg";
  FileStream writeStream = new FileStream(pathString, FileMode.CreateNew, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true);
}

它在 FileStream 中抛出上面的 System.UnauthorizedAccessException。相同路径的相同 Filestream sn-p 正在基于控制台的 C# 应用程序上工作,从某种意义上说,文件 test.jpg 正在创建。关于我在这里缺少的任何建议。

【问题讨论】:

  • 检查你的文件“test.jpg”是否已经存在于磁盘上。
  • await Task.Run(() => ReceiveFile(args));
  • 也试过了,同样的异常被抛出
  • 您的代码在我的机器上运行良好。尝试查看stackoverflow.com/questions/7706467/…stackoverflow.com/questions/17304191/…
  • 即使对我来说作为一个独立的应用程序也可以正常工作。由于上下文来自回调,这在这里有什么不同吗?

标签: c#


【解决方案1】:

您很可能正在尝试在不同的用户下创建文件。在new FileStream 之前,在这两种情况下查看Thread.CurrentPrincipal 中的内容。

由于您在问题中没有确切的代码和环境设置,因此我无法提出确切的解决方案,但可以给出深入研究的方向。如果您有其他用户,只需确保它可以访问您需要的特定目录。

【讨论】:

  • 我使用我的 gmail 帐户登录到我的 windows 10 笔记本电脑,该帐户具有管理员权限。应该没问题吧?
  • 关于 Thread.CurrentPrincipal,我正在调试器中查看此内容。你能告诉我我需要寻找哪个字段 int hat 结构吗?
  • 您可以查看System.Security.Principal.WindowsIdentity.GetCurrent() 以了解您在哪个Windows 用户下运行。
  • 我无法查看这些变量中的任何一个,因为我猜它是一个异步任务?调试器显示为没有红色十字标记。如果我尝试从 UI 线程上下文创建文件,还有一个观察结果,然后我会得到一个不同的异常“不应在 UI 线程上执行同步操作。考虑将此方法包装在 Task.Run 中。”
  • 如果我把它放在这个代码块中,我会得到同步操作不应该在 UI 线程上执行 var task = Dispatcher.RunAsync(CoreDispatcherPriority.Normal, async () => { await ReceiveFile(args) ; });
猜你喜欢
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-04
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多