Tôi đang viết một ứng dụng đa nền tảng và tôi cần tổng dung lượng đĩa sẵn có. Đối với hệ thống posix (Linux và Macos) tôi đang sử dụng statvfs. Tôi đã tạo phương pháp C++ này:Làm thế nào để có được tổng dung lượng đĩa sẵn có trong các hệ thống Posix?
long OSSpecificPosix::getFreeDiskSpace(const char* absoluteFilePath) {
struct statvfs buf;
if (!statvfs(absoluteFilePath, &buf)) {
unsigned long blksize, blocks, freeblks, disk_size, used, free;
blksize = buf.f_bsize;
blocks = buf.f_blocks;
freeblks = buf.f_bfree;
disk_size = blocks*blksize;
free = freeblks*blksize;
used = disk_size - free;
return free;
}
else {
return -1;
}
}
Thật không may tôi nhận được các giá trị khá lạ mà tôi không thể hiểu được. Ví dụ: f_blocks = 73.242.188 f_bsize = 1048576 f_bfree = 50.393.643 ...
Là những giá trị trong bit, byte hoặc bất cứ điều gì khác? Tôi đọc ở đây trên stackoverflow những người cần được byte, nhưng sau đó tôi sẽ nhận được tổng số byte miễn phí là: f_bsize * f_bfree = 1048576 * 50.393.643 nhưng điều này có nghĩa 49212.542GB ... quá nhiều ...
Am Tôi làm điều gì đó sai với mã hoặc bất cứ điều gì khác? Cảm ơn!
Bạn đang sử dụng hệ thống tệp nào có kích thước khối 1048576? –
Đây là một hệ điều hành Mac mở rộng (Phân biệt chữ hoa chữ thường, được ghi nhật ký). Ngay bây giờ tôi đang làm việc trên mac, nhưng, theo như tôi có thể hiểu, điều này là nghĩa vụ phải làm việc. –
Ngoài sự kỳ quặc với kích thước khối và ổ đĩa 70TB bị cáo buộc của bạn - hãy cẩn thận rằng một 'dài' trên OSX 32 bit chỉ là 32 bit. Ngay cả khi bạn có số lượng phù hợp, điều đó có thể đủ lớn cho số lượng * khối * của bạn, nhưng không đủ lớn cho số lượng * byte * của bạn. Ổ đĩa lớn như 4GB có sẵn từ các nhà cung cấp chuyên nghiệp ;-) –