Почему я не могу (или как) программно получить доступ к содержимому URI, предоставленному GVFS?

Вопрос или проблема

Сводка проблемы

Сама по себе секция, озаглавленная “Контекст” ниже, могла бы быть вопросом на Stack Overflow. Однако после дальнейшей диагностики я выяснил, что я, похоже, совершенно не в состоянии получить доступ к URI applications:/ вне Dolphin, через CLI:

  1. CLI (gio)
    gio list -l applications:/
    
    PS /home/RokeJulianLockhart/Documents/webpage_frontend> gio list -l applications:/                                                     
    gio: applications:/: Операция не поддерживается
    
  2. 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
  1. // 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}`);
    });
    
    
  2. 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. Вот как вы можете это сделать:

  1. Убедитесь, что kioclient установлен:
    Убедитесь, что на вашей системе установлен kioclient. Это инструмент входит в состав KDE и позволяет взаимодействовать с KIO-системой.

  2. Используйте kioclient для доступа:
    Попробуйте выполнить следующую команду в терминале:

    kioclient5 ls applications:/

    Если эта команда выполнится успешно, вы получите список доступных приложений.

  3. Обновите ваш сервер:
    Вам необходимо адаптировать ваш 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 через подходящий инструмент, чтобы избежать ошибок доступа. Надеюсь, это поможет вам успешно выполнить вашу задачу.

Оцените материал
Добавить комментарий

Капча загружается...