Невозможно создать файл блокировки с монопольным доступом LibreOffice

Автор FaceHoof, 26 сентября 2023, 08:26

0 Пользователи и 1 гость просматривают эту тему.

FaceHoof

Здравствуйте.

Я пишу небольшой скрипт на языке Lua, который должен открыть файл в LibreOfficeCalc и отредактировать его. Файл успешно открывается, но с вот таким сообщением:

ЦитироватьНевозможно создать файл блокировки с монопольным доступом LibreOffice из-за отсутствия соответствующих разрешений для этого пути или из-за недостатка свободного места.

Выберите Уведомить, чтобы открыть только для чтения и получить уведомление, когда документ станет доступным для редактирования.

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

self.mydoc = luacom.CreateObject("com.sun.star.ServiceManager")
 
self._desktop = self.mydoc:createInstance("com.sun.star.frame.Desktop")
 
self._desktop:loadComponentFromURL("file:///" .. file_path, "_blank", 0, {})

Замечу, что я спокойно могу открыть этот файл для редактирования без скрипта, офис работает корректно. Так же я пробовал запускать свою среду отладки (из которой стартует скрипт) с правами администратора, это не помогает. Мне кажется, я чего-то не знаю. Может, для открытия с возможностью редактирования надо передавать какой-то особый параметр (прописать необязательный параметр {ReadOnly = false} я пробовал, но эффекта это не дало)?

mikekaganski

#1
1. Какая ОС? Исходя из
Цитата: FaceHoof от 26 сентября 2023, 08:26self.mydoc = luacom.CreateObject("com.sun.star.ServiceManager")
и из
Цитата: FaceHoof от 26 сентября 2023, 08:26с правами администратора
это какой-то вариант Windows.
2. Какая версия программы?
3. Как выглядит file_path? Это не UNC? Правильно ли он закодирован?
4. Что говорят утилиты мониторинга файловой системы типа Sysinternals ProcMon?

Я проверил идентичный код в VBS:

mydoc = CreateObject("com.sun.star.ServiceManager")
desktop = mydoc.createInstance("com.sun.star.frame.Desktop")
desktop.loadComponentFromURL "file:///D:/Documents/url_field.fods", "_blank", 0, Array()

От работает у меня на Windows 10 Home с LO Version: 7.6.1.2 (X86_64) нормально
С уважением,
Михаил Каганский

FaceHoof

1. Windows 10
2. 7.6.1.2
3. Путь выглядит так: 'C:\\Users\\testuser\\MyTestReport\\FiletestName ШП.xlsm'
Уверен, что с путём всё в порядке, ведь открывается нужный файл.
4. В ProcMon видно как мой скрипт открывает нужный файл, но потом почему-то появляется запись о его закрытии, хотя это не так, файл открыт, я его на экране вижу... 

mikekaganski

#3
Цитата: FaceHoof от 26 сентября 2023, 09:533. Путь выглядит так: 'C:\\Users\\testuser\\MyTestReport\\FiletestName ШП.xlsm'
Уверен, что с путём всё в порядке, ведь открывается нужный файл.

Ни в коем случае. Да, мы "поддерживаем" инвалидные URL типа "file:///C:\Users\testuser\MyTestReport\FiletestName ШП.xlsm", но это именно что инвалидные URL. Стандарт требует, чтобы в URL не было обратных слэшей "\", пробелов и т.п. Кроме того, в URL (в отличие от IRI) могут быть только символы ASCII.

И я не знаю, какие преобразования будут в коде с Вашим исходным "URL", чтобы на его основе сгенерировать файл блокировки. Исходя из принципа GIGO, может так быть, что Ваша проблема именно тут.

Правильный URL был бы в Вашем случае

file:///C:/Users/testuser/MyTestReport/FiletestName%20%D0%A8%D0%9F.xlsm

Цитата: FaceHoof от 26 сентября 2023, 09:534. В ProcMon видно как мой скрипт открывает нужный файл, но потом почему-то появляется запись о его закрытии, хотя это не так, файл открыт, я его на экране вижу...

Вопрос в основном о событиях попытки открытия не самого файла, а файла блокировки. Ну, и при открытии самого файла - какие права доступа запрошены, какой режим блокировки.
С уважением,
Михаил Каганский

bigor

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

mikekaganski

@bigor: нет. Автодетект отработает. Это нужно только в редких случаях, когда возможно ошибочное / неоднозначное автоопределение - например, если хочется RTF открыть в Calc (а не в Writer, который по умолчанию).
С уважением,
Михаил Каганский

FaceHoof

Цитата: mikekaganski от 26 сентября 2023, 09:59Правильный URL был бы в Вашем случае

file:///C:/Users/testuser/MyTestReport/FiletestName%20%D0%A8%D0%9F.xlsm

Вы абсолютно правы! Заменил путь и всё стало как надо сразу. Большое спасибо!

mikekaganski

#7
В этом ответе на ask.libreoffice.org можно посмотреть, как правильно преобразовать файловые пути в URL. Насколько я понял из краткого гуглинга, Lua не имеет встроенных методов/библиотек для этого.

EDIT: tdf#157450
С уважением,
Михаил Каганский