Вопрос или проблема
Сводка проблемы
Сама по себе секция, озаглавленная “Контекст” ниже, могла бы быть вопросом на Stack Overflow. Однако после дальнейшей диагностики я выяснил, что я, похоже, совершенно не в состоянии получить доступ к URI applications:/
вне Dolphin, через CLI:
-
CLI (
gio
)gio list -l applications:/
PS /home/RokeJulianLockhart/Documents/webpage_frontend> gio list -l applications:/ gio: applications:/: Операция не поддерживается
-
Dolphin
Почему так? Насколько мне известно, это должно быть доступно как виртуальный монтирование через подсистему GVFS. Тем не менее, кажется, что это не смонтировано:
PS /home/RokeJulianLockhart/Documents/webpage_frontend> gio mount -l
Mount(0): s11vzd -> file:///run/media/RokeJulianLockhart/s11vzd
Тип: GUnixMount
Для них даже нет директории:
PS /home/RokeJulianLockhart/Documents/webpage_frontend> tree "$Env:XDG_RUNTIME_DIR/gvfs"
/run/user/1000/gvfs [ошибка открытия директории]
0 директорий, 0 файлов
Я предполагаю, что я что-то делаю неправильно. Тем не менее, мне не удалось выяснить что именно.
Контекст
Я пытаюсь создать файл .JS
, который выводит содержимое applications:/
(доступного через файловые менеджеры KDE Dolphin и GNOME Nautilus) в файл .HTML
, чтобы я мог отобразить его в веб-браузере KDE Plasma 6 plasmashell
plasmoid. Однако, когда я подключаюсь к серверу (по адресу http://localhost:3000/index.html
), я вижу:
<html><head>
<title>Список файлов GVFS</title>
</head>
<body>
<h1>Файлы в applications:/</h1>
<div id="fileList"><ol><li>Ошибка доступа к URI GVFS: gio: applications:/: Операция не поддерживается</li></ol></div>
<script>
async function fetchFiles() {
try {
const response = await fetch('http://localhost:3000/list-gvfs-files');
const fileList = await response.text();
// Разбор и отображение списка файлов
const fileArray = fileList.split('\n').filter(line => line.trim() !== '');
const listContainer = document.getElementById('fileList');
const list = document.createElement('ol');
fileArray.forEach(file => {
const listItem = document.createElement('li');
listItem.textContent = file;
list.appendChild(listItem);
});
listContainer.appendChild(list);
} catch (error) {
console.error("Ошибка получения файлов:", error);
}
}
fetchFiles();
</script>
</body></html>
В частности:
Ошибка доступа к URI GVFS: gio: applications:/: Операция не поддерживается
Ниже я прилагаю копию файлов, если это интересно:
server.js
-
// server.js const express = require('express'); const { exec } = require('child_process'); const app = express(); const PORT = 3000; // Обслуживание статических файлов из текущего каталога app.use(express.static(__dirname)); app.get('/list-gvfs-files', (req, res) => { // Проверка текущих переменных окружения console.log('Текущие переменные окружения:', process.env); // Выполнение команды gio и захват вывода для отладки exec("gio list -l applications:/", (error, stdout, stderr) => { if (error) { console.error("Ошибка команды:", error); console.error("Стандартная ошибка:", stderr); return res.status(500).send("Ошибка доступа к URI GVFS: " + stderr); } console.log("Вывод команды:", stdout); res.send(stdout); }); }); app.listen(PORT, () => { console.log(`Сервер работает по адресу http://localhost:${PORT}`); });
-
index.html
<!DOCTYPE html> <html> <head> <title>Список файлов GVFS</title> </head> <body> <h1>Файлы в applications:/</h1> <div id="fileList"></div> <script> async function fetchFiles() { try { const response = await fetch('http://localhost:3000/list-gvfs-files'); const fileList = await response.text(); // Разбор и отображение списка файлов const fileArray = fileList.split('\n').filter(line => line.trim() !== ''); const listContainer = document.getElementById('fileList'); const list = document.createElement('ol'); fileArray.forEach(file => { const listItem = document.createElement('li'); listItem.textContent = file; list.appendChild(listItem); }); listContainer.appendChild(list); } catch (error) { console.error("Ошибка получения файлов:", error); } } fetchFiles(); </script> </body> </html>
Они были немного собраны из того, что я нашел в интернете по похожим темам (к сожалению, большинство обсуждений на эту тему касались PHP, который я бы не хотел использовать, поскольку я еще меньше с ним знаком).
Это не URI, предоставленный GIO/GVFS. Dolphin не основан на GLib2 от GNOME ни в каком виде – он написан с использованием Qt и фреймворков KDE и использует аналог KDE, KIO, для предоставления функции виртуального монтирования. Возможно, вы сможете получить к нему доступ, используя kioclient
вне приложений, основанных на Qt/KF.
Ответ или решение
Почему я не могу программно получить доступ к содержимому URI, предоставляемого GVFS?
Введение
Ваша ситуация с невозможностью доступа к URI applications:/
вне файлового менеджера Dolphin демонстрирует проблемы, связанные с различиями между технологическими стеками. Здесь следует рассмотреть использование KIO и GVFS, а также объяснить, как правильно получить доступ к этим данным программно.
Природа проблемы
Первоначально, стоит отметить, что URI applications:/
не является GIO/GVFS-URI, как многим может показаться. Dolphin использует библиотеку KIO, которая предназначена для работы с виртуальными файловыми системами в окружении KDE, и не совместима с GIO/GVFS, напрямую используемым в GNOME. Это означает, что команды на основе GIO, такие как gio list
, не смогут обратиться к URI applications:/
, так как они не поддерживают этот механизм.
Путь к решению
Чтобы получить доступ к содержимому applications:/
, необходимо использовать kioclient
. Вот как вы можете это сделать:
-
Убедитесь, что kioclient установлен:
Убедитесь, что на вашей системе установленkioclient
. Это инструмент входит в состав KDE и позволяет взаимодействовать с KIO-системой. -
Используйте kioclient для доступа:
Попробуйте выполнить следующую команду в терминале:kioclient5 ls applications:/
Если эта команда выполнится успешно, вы получите список доступных приложений.
-
Обновите ваш сервер:
Вам необходимо адаптировать ваш Node.js сервер, чтобы использоватьkioclient
вместоgio
. Пример обновленного кода будет выглядеть примерно так:app.get('/list-kio-files', (req, res) => { exec("kioclient5 ls applications:/", (error, stdout, stderr) => { if (error) { console.error("Command Error:", error); console.error("Standard Error:", stderr); return res.status(500).send("Error accessing KIO URI: " + stderr); } console.log("Command Output:", stdout); res.send(stdout); }); });
Код и развертывание
После внесения этих изменений вам нужно перезапустить ваш сервер:
node server.js
Теперь вы можете открыть свой HTML-файл в браузере, и он должен без проблем отображать список приложений, используя applications:/
.
Заключение
В заключение, проблема, с которой вы столкнулись, вызвана несовместимостью GIO/GVFS с KIO. Использование kioclient
является правильным подходом для решения этой проблемы. Убедитесь, что вы обращаетесь к нужному URI через подходящий инструмент, чтобы избежать ошибок доступа. Надеюсь, это поможет вам успешно выполнить вашу задачу.