【问题标题】:WPF Desktop Bridge ApplicationData.GetPublisherCacheFolder UnauthorizedAccessException on Windows 2004 and 20H2Windows 2004 和 20H2 上的 WPF 桌面桥 ApplicationData.GetPublisherCacheFolder UnauthorizedAccessException
【发布时间】:2021-07-10 12:33:20
【问题描述】:

我有一个包含桌面桥包项目的 WPF 应用程序。 WPF 项目安装了 nuget Microsoft.Windows.SDK.Contracts。 在 package.appxmanifest 我添加了适当的权限:

<Extensions>
  <Extension Category="windows.publisherCacheFolders">
    <PublisherCacheFolders>
      <Folder Name="SomeFolder" />
    </PublisherCacheFolders>
  </Extension>
</Extensions>

我想在属于一个发布者的多个 WPF 和 UWP 应用程序之间共享一些信息。 我调用 Windows 运行时 API:

var folder = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("SomeFolder");
var file = await folder.CreateFileAsync("SomeFile", CreationCollisionOption.OpenIfExists);

我得到 System.UnauthorizedAccessException: 'Access is denied. 无法访问指定的文件或文件夹 (C:\Users\AppData\Local\Publishers\5w92pj7ar334m\SomeFolder\SomeFile)。验证该项目未标记系统或隐藏文件属性。'

在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 在 System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务) 在 System.Runtime.CompilerServices.TaskAwaiter`1.GetResult() 在 GetPublisherFolderWPF.MainWindow.d__1.MoveNext()

文件夹 5w92pj7ar334m 和 SomeFolder 是在部署此应用程序后创建的,并且文件 SomeFile 也是以零大小创建的。

这发生在 Windows 2004 和 20H2 上。在早期版本的 Windows 10 上,此代码运行良好。

Sample project

【问题讨论】:

  • 当我使用 OpenIfExists 或 ReplaceExisting 作为参数时,我可以重现您的问题。您可以尝试使用CreationCollisionOption.GenerateUniqueName 来代替,如果文件夹已经存在,它会自动在指定名称的基础上附加一个数字。
  • 使用CreationCollisionOption.GenerateUniqueName,它会创建一个文件并可以将数据写入文件,但之后它甚至无法从文件await folder.GetFileAsync("SomeFile") 中读取数据,同样的例外:UnauthorizedAccessException: 'Access is denied.

标签: c# wpf windows-runtime desktop-bridge appxmanifest


【解决方案1】:

如果你想获取生成的文件并写入,我建议你可以使用 System.IO 命名空间下的File.Open 方法来获取文件流,不会导致权限问题。请参考以下代码。

private async void Button_Click(object sender, RoutedEventArgs e)
        {
            var folder = Windows.Storage.ApplicationData.Current.GetPublisherCacheFolder("SomeFolder");
            try { stream = File.Open(folder.Path + "/SomeFile.txt", FileMode.Open); }
            catch
            {
                file = await folder.CreateFileAsync("SomeFile.txt", CreationCollisionOption.GenerateUniqueName);
                stream = File.Open(folder.Path + "/SomeFile.txt", FileMode.Open);
            }
          
            finally
            {
                var buffer = Encoding.UTF8.GetBytes("SomeContent");
                await stream.WriteAsync(buffer, 0, buffer.Length);
                stream.Dispose();
            }

        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 2018-04-26
    • 2011-02-17
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多