DBUSコネクタ(DBUSコネクタ)を使用して、USBストレージデバイスに利用可能なディスク容量がどれだけあるかを確認しますsdbus-c++
。 USBメモリの接続状態に関する信号を受信するために、このorg.freedesktop.UDisks2
サービスを利用してください。
正常に動作しますが、「利用可能なディスク容量」情報を含むプロパティが見つかりません。
この機能を実装するには、他のサービスを使用する必要がありますか?または、この情報をどのように取得できますか?現在私はDebianシステムを使用していますが、最初のテストの後に組み込みビジボックスシステムに切り替えます(この情報が重要な場合に備えて)。
答え1
Udisksは、実際にはパーティション/ボリュームのマウントまで、ストレージデバイスのハードウェアの側面をカバーしています。これらのパーティションにどのファイルシステムがあり、どのくらいの空き容量があるかは、Udisks2の範囲をわずかに超えています。 Udiskでマウントできる一部のファイルシステムは、「空き領域」の概念さえ理解していません(例:ISO9669)。
私の頭の上で利用可能なDBUSインターフェイスを調べた後、DBUSは「空き領域」プロパティを公開するとは思わない。まあ、それは非常に古いですが、効果的な解決策は実行ですdf /path/to/mount
。 (多くのファイルシステムでは、空き容量の量を見積もるために読み取り専用でもマウントが必要です。しかし、多くのファイルシステムでは、空き容量と使用済みスペースはこの点で非常に複雑です。)
df
特に、後でそれを最小のByboxボックスベースのシステムに縮小する場合は、GNU coreutil実行を使用してテキストから解析する必要があるものを読み、自分で入手できる情報を取得したくありません。あなたがC ++をしていることを確認し(私の考えにはコンパイルしようとしませんでした)、C ++ 17がないとします。std::filesystem::space
、間違いなくDBUSを使用するよりもはるかに少ない面倒です。
#include <sys/statvfs.h>
std::string mountpoint;
/*
* Get the mount point using org.freedesktop.UDisks2.Filesystem's "MountPoints" property, see
* http://storaged.org/doc/udisks2-api/latest/gdbus-org.freedesktop.UDisks2.Filesystem.html#gdbus-property-org-freedesktop-UDisks2-Filesystem.MountPoints
* We'll act as if you already did this and it was stored in `mountpoint`.
*/
// Terrible naming choices made the structure typename be the same as the function name, so even in C++ we have to use `struct`. Wah.
struct statvfs filesystem_info;
statvfs(mountpoint.c_str(), &filesystem_info);
auto bytes_per_block = filesystem_info.f_bsize;
auto blocks_free_for_unprivileged_users = filesystem_info.f_bavail;
auto blocks_free_total = filesystem_info.f_bfree;