2013-09-03 4 views
1

J'utilise QDir::drives() pour obtenir la liste des lecteurs. Cela fonctionne très bien sur Windows, mais sur Linux et Mac il ne renvoie qu'un seul élément "/", je. e. racine. C'est un comportement attendu, mais comment puis-je obtenir une liste de lecteurs sur Mac et Linux?Détection de lecteurs montés sur Linux et Mac OS X

Les solutions d'API natives non-Qt sont également les bienvenues. Clarification sur la définition de «lecteur»: J'aimerais obtenir une liste des points de montage qui sont visibles en tant que «lecteurs» dans le Finder ou le gestionnaire de fichiers intégré de Linux.

Répondre

5

En ce qui concerne le système de fichiers, il n'y a pas de concept de lecteurs sous Unix/Linux (je ne peux pas me porter garant de MacOSX mais je dirais que c'est pareil). La chose la plus proche serait probablement les points de montage, mais une application normale ne devrait pas déranger à leur sujet puisque tout est déjà disponible sous la racine du système de fichiers / (d'où le comportement de QDir::drives() que vous observez). Si vous voulez vraiment voir quels points de montage sont utilisés, vous pouvez analyser la sortie de la commande mount (sans aucun argument) ou, au moins sur Linux, le contenu du fichier /etc/mtab. Attention cependant, les points de montage peuvent devenir très poilus (périphériques loop, systèmes de fichiers FUSE, partages réseau, ...) donc, encore une fois, je ne recommanderais pas de les utiliser à moins que votre application soit conçue pour les administrer. Gardez à l'esprit que sous les systèmes d'exploitation Unix-y, les points de montage sont normalement réservés aux administrateurs système, et non aux utilisateurs finals, à moins que nous ne parlions de supports amovibles ou de partages réseau transitoires.


Edit: Suite à vos précisions dans les commentaires, sur Linux, vous devez utiliser getmntent or getmntent_r pour analyser le contenu du fichier /etc/mtab et ainsi obtenir une liste de tous les points de montage et les dispositifs correspondants.

L'astuce après cela est de déterminer ceux que vous souhaitez afficher (partage réseau amovible?). Je sais que /sys/block/... peut aider avec cela, mais je ne connais pas tous les détails, donc vous devrez creuser un peu plus.

Par exemple, pour vérifier si /dev/sdd1 (une clé USB) monté sur /media/usb0/ est un dispositif amovible, vous pouvez le faire (notez comment j'utiliser le nom du périphérique sdd, pas le nom de la partition sdd1):

$ cat /sys/block/sdd/removable 
1 

Contrairement à mon disque dur principal:

$ cat /sys/block/sda/removable 
0 

espère que cela vous met sur la bonne voie.

+0

Édité ma question pour indiquer les points de montage qui m'intéressent. La solution idéale serait une API système appropriée qui renvoie une liste de chemins de système de fichiers, mais jusqu'à présent, je ne la trouve pas pour aucun système. –

+0

MacOSX est essentiellement BSD à cet égard, et se comporte comme tel - mais avec beaucoup plus d'automatisation de l'automontage que ce que l'on trouve normalement sur * NIX. – marko

+0

@VioletGiraffe Ajout d'informations supplémentaires, pourrait être utile même si c'est encore un peu vague. – syam

1

Grattage de la sortie de la commande shell mount est certainement une option sur l'une ou l'autre plate-forme - bien que, quelle est votre définition d'un lecteur ici? Médias physiques, pilotes amovibles, volumes réseau? Vous devrez faire beaucoup de filtrage. Sur MacOSX, le point de montage pour les supports amovibles, les volumes réseau et les disques durs secondaires est toujours inférieur à /Volumes/. Par conséquent, l'énumération des éléments dans ce répertoire fera l'affaire si votre définition de lecteur est large. Cela devrait être assez sûr car ils sont tous montés automatiquement.

Sous Linux, il existe différents emplacements en fonction de la distribution utilisée./mnt/ est le traditionnel, mais il y en a d'autres.

+0

Je voudrais obtenir une liste de points de montage qui sont visibles comme" lecteurs "dans le Finder ou le fichier Linux construit dans le gestionnaire de fichiers. –

+0

Je pense que c'est le cas de '/ Volumes '- bien que vous puissiez les cacher dans la barre latérale du Finder – marko

+0

@VioletGiraffe Il n'y a pas de gestionnaire de fichiers intégré sur Linux, sauf si' ls' et 'cd' comptent comme un seul (Et ils n'ont certainement aucun concept de "lecteurs"). – syam

1

Si vous connaissez le format du ou des lecteurs en question, vous pouvez utiliser la commande df pour sortir la liste des lecteurs de la console ou la programmer en tant que commande système. Par exemple, pour trouver tous les lecteurs ext4:

df -t ext4 

Vous pouvez simplement ajouter des formats supplémentaires sur la même commande si vous êtes intéressé par plus d'un type:

df -t ext4 -t tmpfs 

Cela va revenir vous l'emplacement physique du lecteur, la quantité de mémoire qu'il a, la quantité de mémoire utilisée, la quantité de mémoire libre, l'utilisation% et où il est monté sur le système de fichiers.

df vous montrera tous les disques montés sur le système, mais certains vont être des choses qui ne sont pas vraiment ce que vous cherchez comme les systèmes de fichiers temporaires, etc.

Je ne sais pas si cela travailler sur OSX ou non, mais cela fonctionne sur ma distribution Ubuntu 12.04.

+0

C'est exactement ce que la fonction 'getmntent' me donne! Merci pour un moyen de vérifier. –

4

Pour OS X, le Disk Arbitration framework peut être utilisé pour lister et surveiller les disques et points de montage

+0

Le lien est mort. Le nouveau est https://developer.apple.com/library/mac/documentation/Darwin/Reference/DiscArbitrationFramework/ – prewett

0

Une autre façon est de vérifier les "volumes"

df -H | grep "/ Volumes"