2

すべてのユーザーが使用できるディスクの空き容量を返す必要があるプログラムに問題があります。

私の目標は、sudo 権限を持たない人が使用できるハード ドライブのすべてのパーティションのすべての空きディスク領域を取得することです。

だから私はこれを試しました:

int main() {
    struct statvfs diskData;
    statvfs("/", &diskData);
    unsigned long long available = (diskData.f_favail + diskData.f_bavail) * diskData.f_frsize) / (1024 * 1024)
    std::cout << "Free Space : " << available << std::endl;
}

これにより、合計で2810になります...

ただし、を出力df -hすると、使用可能なスペースが25Gforsda330Gforであることがわかりますsda1

これは完全に不正確なようです。

私は Stackoverflow の投稿を実行し、見たソリューションを組み合わせましたが、満足できるものはありませんでした。使用可能な空き容量のメガバイト単位で正しい値を取得するにはどうすればよいですか?

EDIT:フルstatvfsdf /出力

statvfs:

Block Size            : 4 096
Fragment Size         : 4 096
Blocks                : 9 612 197
Free Blocks           : 7 009 166
Non Root Free Blocks  : 6 520 885
Inodes                : 2 444 624
Free Inodes Space     : 2 137 054
Non Root Free Inodes  : 2 137 054
File System ID        : 4 224 884 198
Mount Flags           : 4 096
Max Filename Length   : 255

df /:

Filesystem     1K-Blocks      Used           Available      Use%     Mounted on
/dev/sda3      38 448 788     10 412 112     26 083 556     29%      / 
4

2 に答える 2

4

これは、空きディスク容量のより正確な測定のようです。

unsigned long long available = (diskData.f_bavail * diskData.f_bsize) / (1024 * 1024);

df私のシステムの出力と非常によく一致します(dfサイズはギグ単位で表示され、おそらく丸められます)。

あなたがこれを使うことができるようにギグで出力したい場合df

#include <sys/statvfs.h>
#include <stdio.h>

unsigned long rounddiv(unsigned long num, unsigned long divisor) {
    return (num + (divisor/2)) / divisor;
}

int main() {
    struct statvfs diskData;
    statvfs("/home", &diskData);
    unsigned long available = diskData.f_bavail * diskData.f_bsize;
    printf("Free Space : %luG\n", rounddiv(available, 1024*1024*1024));
    return 0;
}

私のシステムでのこれからの出力:
Free Space : 31G

そして、私が実行した場合df -h /home:

Filesystem            Size  Used Avail Use% Mounted on
                      181G  141G   31G  83% /home
于 2013-04-11T15:50:44.347 に答える