Я пытаюсь отредактировать существующий документ Word с помощью приложения UWP (универсальная версия Windows). Но по какой-то причине я получаю сообщение об ошибке «Файл не существует».
Я попытался использовать приведенный ниже код для доступа к текстовому документу:
using(WordprocessingDocument wordDoc = WordprocessingDocument.Open("C:\\Users\\Public\\Desktop\\Doc1.docx", true))
{
}
System.IO.FileNotFoundException: «Не удалось найти документ»
@YannTibodeau Опечаток нет. Я проверил путь к файлу 10 раз. Я попытался запустить тот же код в приложении Winforms, и это сработало. Эта проблема возникает только тогда, когда я запускаю ее в приложении UWP.
@YannTibodeau Есть ли в приложении UWP возможность редактировать текстовые документы?
Что ж, похоже, это проблема с приложением UWP, возможно, вам следует сообщить об этой проблеме на их github.
UWP изолирован, поэтому по умолчанию вы не можете получить доступ к рабочему столу, загрузкам, документам и т. д. Однако у вас есть несколько вариантов, вы можете включить слово doc в свое приложение и получить к нему доступ, как к любому ресурсу. Вы можете использовать средство выбора файлов, которое позволит пользователю вручную выбрать документ Word, тем самым предоставив вашему приложению разрешение на доступ к файлу. Или, как говорит @Xavier, вы можете объявить wideFileSystemAccess, который даст вашему приложению те же разрешения, что и пользователь. Однако этот метод подходит для боковой загрузки, но у вас могут возникнуть проблемы с публикацией в магазине.
@AdamMcMahon У вас есть пример/ссылка, где объясняется, как это сделать? Я могу добавить документ Word, но не знаю, как получить к нему доступ.
Я напишу ответ на основе ваших требований. Какой из 3 вариантов выше подходит больше?
@AdamMcMahon Наличие слова doc в приложении подходит. (Если возможно, вместо того, чтобы пользователь выбирал его вручную, вы можете показать, как выбрать это автоматически).
@XavierXie Я добавил wideFileSystemAcess в файл манифеста пакета, а также включил пространство имен Windows.Storage. Даже так я столкнулся с ошибкой, что файл не найден. Вчера я открыл вопрос с OpenXml, я также добавлю сегодняшние выводы. Спасибо!
@AdamMcMahon Попробовав ваш код, я получаю сообщение об ошибке «Отказано в доступе к пути». Я запускаю эту программу на своей локальной машине. Нужно ли что-то менять в программе, чтобы предоставить доступ? Спасибо за ваш вклад!
Я собираюсь установить тот же пакет nuget и протестировать для себя, я сообщу о своих выводах, когда закончу
Ладно, я думаю, ошибка происходила из-за того, что UWP не позволяет записывать файлы в папку установки, только читать из них. Поэтому я отредактировал свой ответ скорректированным решением, которое, похоже, работает для меня.
По умолчанию 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.
Основываясь на дальнейших разъяснениях в разделе комментариев, см. следующие инструкции.
Добавьте файл .DOCX в папку «Активы» в вашем проекте и установите для действия сборки значение «Содержимое».
Чтобы записать какие-либо изменения в файл, нам нужно скопировать его в пакеты 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
только один раз и т. д., но вы поняли основную идею.
Спасибо, Адам, но теперь я получаю сообщение об ошибке «Доступ к пути запрещен». Я запускаю эту программу на своей локальной машине. Нужно ли что-то менять в программе, чтобы предоставить доступ?
Позвольте мне установить пакет nuget и проверить себя.
Ладно, я думаю, ошибка происходила из-за того, что UWP не позволяет записывать файлы в папку установки, только читать из них. Итак, мое скорректированное решение выше.
Здорово. Если бы вы могли принять это как правильный ответ, чтобы он мог помочь будущим пользователям, это было бы здорово. :)
Судя по ошибке, действительно кажется, что файл не существует по этому пути, следите за опечатками