GIOライブラリのGVolumeMonitorで、ある程度の事はできるのではないでしょうか。
そもそも「USBメモリ」の判別は難しいと思います。
(おそらくDVDやUSBハードディスクも引っかかってしまうけど)「エジェクトできるか」で判断するとかで妥協するとか。
「プログラム」としか書かれてなく何の言語化はわかりませんが、GIOライブラリはGObjectIntrospectionに対応しているので、大抵の言語でも使えると思います。
例えば、C言語なら。
c
1#include <gio/gio.h>
2#include <stdio.h>
3
4int main()
5{
6 GVolumeMonitor *mon;
7 GList *mounts;
8 GList *l;
9 char *mount_name;
10 GFile *root;
11 char *root_path;
12
13 mon = g_volume_monitor_get();
14 mounts = g_volume_monitor_get_mounts(mon);
15
16 for (l = mounts; l != NULL; l = l->next) {
17 mount_name = g_mount_get_name(G_MOUNT(l->data));
18 root = g_mount_get_root(G_MOUNT(l->data));
19 root_path = g_file_get_path(root);
20 printf("%s, %s, %s.\n", mount_name, g_mount_can_eject(G_MOUNT(l->data))? "ejectable": "unejectable", root_path);
21 g_free(root_path);
22 g_object_unref(root);
23 g_free(mount_name);
24 }
25
26 g_list_free_full(mounts, (GDestroyNotify)g_object_unref);
27 g_object_unref(G_OBJECT(mon));
28
29 return 0;
30}
31
Pythonなら。
python
1# coding: utf-8
2
3from gi.repository import Gio
4
5mon = Gio.VolumeMonitor.get()
6for m in mon.get_mounts():
7 d = m.get_drive()
8 print('%s, %s, %s(%s).' % (repr(m.get_name()), repr(m.get_root().get_path()), repr(d.get_name() if d is not None else '(none)'), repr(m.can_eject())))
9
と書いてから、「USBメモリーを差し込む場所はいつも同じ場所で」という点に気づきました。
指す場所が一緒ならば、Unixのデバイス名も一緒なのでは?(ちょっと自信ない)
とりあえずGIOでデバイス名も取ってみました。(Cで書くのは面倒なので、Pythonで)
python
1# coding: utf-8
2
3from gi.repository import Gio
4
5mon = Gio.VolumeMonitor.get()
6for m in mon.get_mounts():
7 d = m.get_drive()
8 vol = m.get_volume()
9 device_path = vol.get_identifier('unix-device')
10 print('%s, %s, %s(%s), %s.' % (repr(m.get_name()), repr(m.get_root().get_path()), repr(d.get_name() if d is not None else '(none)'), repr(m.can_eject()), repr(device_path)))
11
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/30 04:05