WPF Desktop Bridge ApplicationData.GetPublisherCacheFolder UnauthorizedAccessException в Windows 2004 и 20H2

У меня есть приложение WPF, упакованное с проектом пакета моста рабочего стола. В проекте WPF установлен nuget Microsoft.Windows.SDK.Contracts. В package.appxmanifest я добавил соответствующее разрешение:

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

И я хочу поделиться некоторой информацией между несколькими приложениями WPF и UWP, принадлежащими одному издателю. Я вызываю Windows Runtime API:

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

и я получаю System.UnauthorizedAccessException: «Доступ запрещен. Нет доступа к указанному файлу или папке (C: \ Users ‹myusername› \ AppData \ Local \ Publishers \ 5w92pj7ar334m \ SomeFolder \ SomeFile). Убедитесь, что элемент не отмечен системными или скрытыми атрибутами файла. '

в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification. .GetResult () в GetPublisherFolderWPF.MainWindow. ‹MainWindow_Loaded› d__1.MoveNext ()

Папки 5w92pj7ar334m и SomeFolder были созданы после развертывания этого приложения, а файл SomeFile также был создан с нулевым размером.

Это происходит в Windows 2004 и 20H2. В более ранних версиях Windows 10 этот код работает хорошо.

Образец проекта


person Asteron Jr    schedule 15.04.2021    source источник
comment
Когда я использую OpenIfExists или ReplaceExisting для параметра, я могу воспроизвести вашу проблему. Вместо этого вы можете попробовать использовать CreationCollisionOption.GenerateUniqueName, который автоматически добавляет номер к основанию указанного имени, если папка уже существует.   -  person Arya Ding - MSFT    schedule 16.04.2021
comment
С CreationCollisionOption.GenerateUniqueName он создает файл и может записывать данные в файл, но после этого он не может даже читать из файла await folder.GetFileAsync("SomeFile") с тем же исключением: UnauthorizedAccessException: 'Access is denied.   -  person Asteron Jr    schedule 16.04.2021


Ответы (1)


Если вы хотите получить сгенерированный файл и записать его, я предлагаю вам использовать File.Open в пространстве имен System.IO для получения потока файлов, который не вызовет проблем с разрешениями. См. Следующий код.

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();
            }

        }
person Arya Ding - MSFT    schedule 20.04.2021