Простой файловый менеджер на Mono под Linux

141
18 мая 2019, 19:00

Необходимо написать простейший проводник или файловый менеджер, который будет работать с НМЖД и внешним USB накопителем. Должны быть функции копирования, вставки и удаления. В плане GUI на винформах это возможно реализовать при помощи mono и не является проблемой. На данном этапе столкнулся с не пониманием. При работе в ОС Windows проблем нет, так как я могу свободно использовать WMI и получать доступ к ресурсам и тем же событиям при подключении отключении внешнего накопителя. А вот как быть в ОС Линукс используя mono? Вот пример который я сделал для Windows, здесь реализован пока только просмотр:

Вот так я читаю диски:

//Get Drive list
ManagementObjectCollection queryCollection = getDrives();
foreach ( ManagementObject mo in queryCollection)
{
    ...
}

В качестве события использован:

System.Windows.Forms.TreeViewEventArgs

Для отображения накопителей и при изменении их количества. Посоветуйте пожалуйста, в какую сторону копать?

Answer 1

DBUS

Если в системе присутствует Udisks, то хорошим вариантом будет отслеживание подключения дисков по dbus.

http://storaged.org/doc/udisks2-api/latest/ch02.html

Не нахожу сигнала на добавление диска, но есть сигнал об изменении конфигурации - можно перечитать.

Отследить подключение дисков можно в gvfs также по dbus. Есть методы получить список и можно подписаться на сигналы подключения-отключения.

gdbus introspect --session --dest org.gtk.vfs.Daemon --object-path /org/gtk/vfs/mounttracker   --recurse
 ....
  interface org.gtk.vfs.MountTracker {
    methods:
      LookupMount(in  (aya{sv}) mount_spec,
                  out (sossssssbay(aya{sv})ay) mount);
      LookupMountByFusePath(in  ay fuse_path,
                            out (sossssssbay(aya{sv})ay) mount);
      MountLocation(in  (aya{sv}) mount_spec,
                    in  (so) mount_source);
      ListMounts(out a(sossssssbay(aya{sv})ay) mounts);
      ListMounts2(in  b user_visible_only,
                  out a(sossssssbay(aya{sv})ay) mounts);
      RegisterMount(in  o obj_path,
                    in  s display_name,
                    in  s stable_name,
                    in  s x_content_types,
                    in  s icon,
                    in  s symbolic_icon,
                    in  s prefered_filename_encoding,
                    in  b user_visible,
                    in  (aya{sv}) mount_spec,
                    in  ay default_location);
      UnregisterMount(in  o obj_path);
      ListMountTypes(out as mount_types);
      ListMountableInfo(out a(ssasib) mountables);
      RegisterFuse();
    signals:
      Mounted((sossssssbay(aya{sv})ay) mount);
      Unmounted((sossssssbay(aya{sv})ay) mount);
    properties:
  };
};

Файлы

Самый "железный" и простой метод это смотреть содержимое файла /proc/mounts/ и папки /dev/disks/by-id/

UDEV

Запустить udevadm monitor и ловить события или сишные вызовы.

DMESG

Смотреть лог dmesg на события ядра.

READ ALSO
Получить данные с двух таблиц

Получить данные с двух таблиц

Для работы с базами данных использую ORM RedBeanPHP

146
Ошибка mysql SQLSTATE[HY000] [2054]

Ошибка mysql SQLSTATE[HY000] [2054]

При попытки подключения к MySQL из PHP Yii2, да и просто из PHP методом PDO Происходит ошибка: SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client

186
Как подключиться к PDO через константы?

Как подключиться к PDO через константы?

Как вписать константы для подключения?

110
Как удалить ссылки на php?

Как удалить ссылки на php?

Беру информацию с другого сайта таким макаром

139