XAML SpecialFolder.ApplicationData在.net MAUI中不起作用?

ia2d9nvy  于 2023-09-28  发布在  .NET
关注(0)|答案(2)|浏览(99)

在.net MAUI中使用此代码时,我无法将目录设置为AppData/Roaming:

RootLocation = new DirectoryInfo(GetFolderPath(SpecialFolder.ApplicationData) + "/MyApp");
        SaveLocation = new DirectoryInfo(RootLocation.FullName + "/saves");
        SaveLocation.Create();
        BackupLocation = new DirectoryInfo(RootLocation.FullName + "/backups");
        BackupLocation.Create();

但是,如果我将SpecialFolder.ApplicationData更改为SpecialFolder.Desktop,它在Desktop上确实可以工作。这似乎是一个权限问题,但在Visual Studio 2019中使用WPF,我仍然可以保存到AppData/Roaming。这可能是Visual Studio 2022 Preview的问题吗?

zmeyuzjn

zmeyuzjn1#

if (IsWindows())
{
    savingPath = Environment.GetFolderPath(Environment.SpecialFolder.MyVideos);
    savingPath = Path.Combine(savingPath, "yourfolder");
    if (!Directory.Exists(savingPath))
    {
        Directory.CreateDirectory(savingPath);
    }
}

我觉得会更好。而且代码在我的桌面和我的安卓应用上都能正常运行

ykejflvf

ykejflvf2#

默认情况下,Maui应用程序不允许在正常位置访问SpecialFolder.ApplicationData。这是因为应用程序虚拟化和容器化。
Maui在Windows上编译为WinUI 3 appx/msix。它配置了特殊的“file system virtualization”,可以更改文件的写入位置。特别是,当您尝试写入C:\Users\username\AppData\Roaming时,它会写入C:\Users\username\AppData\Local\Packages\package_id\LocalCache\Roaming或Packages目录中的某个变体。这样做的理由是它允许卸载程序完全删除应用程序的所有资源。
幸运的是,可以通过将以下内容添加到项目的Platforms\Windows\Package.appxmanifest中来禁用虚拟化:

<Package
 ...
 xmlns:desktop6="http://schemas.microsoft.com/appx/manifest/desktop/windows10/6"
 xmlns:rescap="http://schemas.microsoft.com/appx/manifest/foundation/windows10/restrictedcapabilities"
 IgnorableNamespaces="... rescap">

  <Properties>
    ...
    <desktop6:FileSystemWriteVirtualization>disabled</desktop6:FileSystemWriteVirtualization>
  </Properties>

  <Capabilities>
    ...
    <rescap:Capability Name="unvirtualizedResources"/>

相关问题