Не удается получить доступ к документу Word в моей системе с помощью приложения UWP

Я пытаюсь отредактировать существующий документ Word с помощью приложения UWP (универсальная версия Windows). Но по какой-то причине я получаю сообщение об ошибке «Файл не существует».

Я попытался использовать приведенный ниже код для доступа к текстовому документу:

using(WordprocessingDocument wordDoc = WordprocessingDocument.Open("C:\\Users\\Public\\Desktop\\Doc1.docx", true))
{

}

System.IO.FileNotFoundException: «Не удалось найти документ»

Судя по ошибке, действительно кажется, что файл не существует по этому пути, следите за опечатками

Yann Thibodeau 29.05.2019 21:57

@YannTibodeau Опечаток нет. Я проверил путь к файлу 10 раз. Я попытался запустить тот же код в приложении Winforms, и это сработало. Эта проблема возникает только тогда, когда я запускаю ее в приложении UWP.

Sandeep Raja 29.05.2019 22:04

@YannTibodeau Есть ли в приложении UWP возможность редактировать текстовые документы?

Sandeep Raja 29.05.2019 22:06

Что ж, похоже, это проблема с приложением UWP, возможно, вам следует сообщить об этой проблеме на их github.

Yann Thibodeau 29.05.2019 22:07

UWP изолирован, поэтому по умолчанию вы не можете получить доступ к рабочему столу, загрузкам, документам и т. д. Однако у вас есть несколько вариантов, вы можете включить слово doc в свое приложение и получить к нему доступ, как к любому ресурсу. Вы можете использовать средство выбора файлов, которое позволит пользователю вручную выбрать документ Word, тем самым предоставив вашему приложению разрешение на доступ к файлу. Или, как говорит @Xavier, вы можете объявить wideFileSystemAccess, который даст вашему приложению те же разрешения, что и пользователь. Однако этот метод подходит для боковой загрузки, но у вас могут возникнуть проблемы с публикацией в магазине.

Adam McMahon 30.05.2019 13:33

@AdamMcMahon У вас есть пример/ссылка, где объясняется, как это сделать? Я могу добавить документ Word, но не знаю, как получить к нему доступ.

Sandeep Raja 30.05.2019 14:25

Я напишу ответ на основе ваших требований. Какой из 3 вариантов выше подходит больше?

Adam McMahon 30.05.2019 14:27

@AdamMcMahon Наличие слова doc в приложении подходит. (Если возможно, вместо того, чтобы пользователь выбирал его вручную, вы можете показать, как выбрать это автоматически).

Sandeep Raja 30.05.2019 15:08

@XavierXie Я добавил wideFileSystemAcess в файл манифеста пакета, а также включил пространство имен Windows.Storage. Даже так я столкнулся с ошибкой, что файл не найден. Вчера я открыл вопрос с OpenXml, я также добавлю сегодняшние выводы. Спасибо!

Sandeep Raja 30.05.2019 15:11

@AdamMcMahon Попробовав ваш код, я получаю сообщение об ошибке «Отказано в доступе к пути». Я запускаю эту программу на своей локальной машине. Нужно ли что-то менять в программе, чтобы предоставить доступ? Спасибо за ваш вклад!

Sandeep Raja 30.05.2019 16:30

Я собираюсь установить тот же пакет nuget и протестировать для себя, я сообщу о своих выводах, когда закончу

Adam McMahon 30.05.2019 16:39

Ладно, я думаю, ошибка происходила из-за того, что UWP не позволяет записывать файлы в папку установки, только читать из них. Поэтому я отредактировал свой ответ скорректированным решением, которое, похоже, работает для меня.

Adam McMahon 30.05.2019 17:05
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
12
571
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

По умолчанию UWP не разрешает доступ к файлам за пределами контейнера приложения. Но в Windows 10 build 17134 появилась новая возможность broadFileSystemAccess. Это позволяет приложениям получать такой же доступ к файловой системе, как и пользователь, который в данный момент запускает приложение, без каких-либо дополнительных запросов в стиле средства выбора файлов во время выполнения.

Итак, проверьте, объявили ли вы эту возможность в файле Package.appxmanifest.

Дополнительные сведения см. в записи Разрешения на доступ к файлам и BroadFileSystemAccess в Декларации возможностей приложений.

Если вы все еще сталкиваетесь с этой проблемой при добавлении возможности broadFileSystemAccess, проблема должна быть в API WordprocessingDocument.Open. Вы должны отметить, что в документе «Разрешения на доступ к файлам» упоминается:

This broadFileSystemAccess capability works for APIs in the Windows.Storage namespace.

Это означает, что WordprocessingDocument.Open не может использовать API Windows.Хранилище для доступа к файлам. Если это так, вам нужно сообщить об этой проблеме Open-XML-SDK.

Ответ принят как подходящий

Основываясь на дальнейших разъяснениях в разделе комментариев, см. следующие инструкции.

  1. Добавьте файл .DOCX в папку «Активы» в вашем проекте и установите для действия сборки значение «Содержимое».

    Set Build action to Content

  2. Чтобы записать какие-либо изменения в файл, нам нужно скопировать его в пакеты LocalFolder, а затем получить к нему доступ оттуда.

    var file = await StorageFile.GetFileFromApplicationUriAsync(new Uri("ms-appx:///Assets/doc1.docx"));
    if (file != null)
    {
        //Copy .docx file to LocalFolder so we can write to it
        await file.CopyAsync(ApplicationData.Current.LocalFolder);
        String newFile = ApplicationData.Current.LocalFolder.Path + "/doc1.docx";
    
        using (WordprocessingDocument wordDoc = WordprocessingDocument.Open(newFile, true))
        {
                //Your code here
        }
    }
    

Вам нужно будет немного расширить это, чтобы убедиться, что файл копируется в LocalFolder только один раз и т. д., но вы поняли основную идею.

Спасибо, Адам, но теперь я получаю сообщение об ошибке «Доступ к пути запрещен». Я запускаю эту программу на своей локальной машине. Нужно ли что-то менять в программе, чтобы предоставить доступ?

Sandeep Raja 30.05.2019 16:10

Позвольте мне установить пакет nuget и проверить себя.

Adam McMahon 30.05.2019 16:30

Ладно, я думаю, ошибка происходила из-за того, что UWP не позволяет записывать файлы в папку установки, только читать из них. Итак, мое скорректированное решение выше.

Adam McMahon 30.05.2019 17:05

Здорово. Если бы вы могли принять это как правильный ответ, чтобы он мог помочь будущим пользователям, это было бы здорово. :)

Adam McMahon 30.05.2019 20:00

Другие вопросы по теме