[英]Detecting mounted drives on Linux and Mac OS X
我正在使用QDir::drives()
來獲取驅動器列表。 它在Windows上運行良好,但在Linux和Mac上它只返回單個項目“/”,即root。 這是預期的行為,但我怎樣才能獲得Mac和Linux上的驅動器列表?
非Qt原生API解決方案也受到歡迎。
關於“驅動器”定義的澄清:我想得到一個在Finder或Linux內置文件管理器中作為“驅動器”可見的掛載點列表。
就文件系統而言,Unix / Linux中沒有驅動器的概念(我不能擔保MacOSX,但我會說它是相同的)。 最接近的事可能會被掛載點,但一個正常的應用程序不應該理會他們,因為所有文件系統的根目錄下已經可用/
(的,因此行為QDir::drives()
你觀察)。
如果您真的想要查看正在使用的掛載點,則可以解析mount
命令的輸出(不帶任何參數),或者至少在Linux上解析/etc/mtab
文件的內容。 請注意,掛載點可以快速實現(循環設備,FUSE文件系統,網絡共享......),因此,除非您的應用程序旨在管理它們,否則我不建議使用它們。
請記住,在Unix-y操作系統上,掛載點通常是系統管理員而不是最終用戶的問題,除非我們談到可移動媒體或瞬態網絡共享。
編輯:在評論中澄清之后,在Linux上,您應該使用getmntent
或getmntent_r
來解析/etc/mtab
文件的內容,從而獲得所有掛載點和相應設備的列表。
之后的訣竅是確定要顯示哪些(可移動?網絡共享?)。 我知道/sys/block/...
可以幫助解決這個問題,但我不知道所有細節,所以你需要多挖一點。
例如,要檢查/media/usb0/
上安裝的/dev/sdd1
(USB密鑰)是否是可移動設備,您可以這樣做(注意我如何使用設備名稱sdd
,而不是分區名稱sdd1
):
$ cat /sys/block/sdd/removable
1
與我的主硬盤相反:
$ cat /sys/block/sda/removable
0
希望這能讓你走上正軌。
對於OS X, 磁盤仲裁框架可用於列出和監視驅動器和掛載點
刮掉mount
shell命令的輸出肯定是任何一個平台上的一個選項 - 盡管你在這里定義了什么驅動器? 物理媒體,可移動驅動程序,網絡卷? 你需要做很多過濾。
在MacOSX上,可移動媒體,網絡卷和輔助硬盤驅動器的安裝點始終位於/Volumes/
之下,因此,如果您對驅動器的定義很寬泛,只需枚舉此目錄中的項目即可。 這應該是相當安全的,因為它們都是自動安裝的。
在Linux上,根據使用的特定發行版,有多種位置。 /mnt/
是傳統的,但還有其他的。
在linux中,獲取當前掛載的驅動器信息的方法是解析mtab
文件。 glibc提供了一個宏_PATH_MNTTAB
來定位這個文件。 請參閱http://www.gnu.org/software/libc/manual/html_node/Mount-Information.html#Mount-Information
如果您知道有問題的驅動器/驅動器的格式,則可以使用df命令從控制台輸出驅動器列表,或者以編程方式輸出系統命令。 例如,要查找所有ext4驅動器:
df -t ext4
如果您對多種類型感興趣,可以在同一命令中添加其他格式:
df -t ext4 -t tmpfs
這將返回驅動器的物理位置,它具有的內存量,使用的內存量,可用內存量,使用%以及它在文件系統上的安裝位置。
df將向您顯示系統上安裝的所有驅動器,但有些驅動器將是您正在尋找的不是臨時文件系統等的東西。
不確定這是否適用於OSX,但它確實適用於我的Ubuntu 12.04發行版。
另一種方法是檢查“卷”
df -H | grep“/ Volumes”
我知道這是舊的,但它沒有提到我最終在macos中使用的getfsstat
。 您可以使用getfsstat
獲取安裝列表(包括大多數磁盤)。 有關詳細信息,請參閱man 2 getfsstat
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.