私は50MiBの小さなパーティションを持ち、ext4形式になっています。/mnt/tmpにマウントされています。ファイルシステムのstatvfs()で計算された使用済みスペースは、fsファイル内のすべてのファイルのサイズの合計よりも大きいです。
その後、私はstatvfs()
を使用するためのパーティションで使用されるバイトを計算し、lstat()
のための内部のすべてのファイルのサイズを計算し、このために私はこのプログラムを書いた:
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <sys/statvfs.h>
#include <stdint.h>
#include <string.h>
#include <dirent.h>
#include <stdlib.h>
//The amount of bytes of all files found
uint64_t totalFilesSize=0;
//Size for a sector in the fs
unsigned int sectorSize=0;
void readDir(char *path) {
DIR *directory;
struct dirent *d_file; // a file in *directory
directory = opendir (path);
while ((d_file = readdir (directory)) != 0)
{
struct stat filestat;
char *abPath=malloc(1024);
memset(abPath, 0, 1024);
strcpy(abPath, path);
strcat(abPath, "/");
strcat(abPath, d_file->d_name);
lstat (abPath, &filestat);
switch (filestat.st_mode & S_IFMT)
{
case S_IFDIR:
{
if (strcmp (".", d_file->d_name) && strcmp ("..", d_file->d_name))
{
printf("File: %s\nSize: %d\n\n", abPath, filestat.st_size);
//Add slack space to the final sum
int slack=sectorSize-(filestat.st_size%sectorSize);
totalFilesSize+=filestat.st_size+slack;
readDir(abPath);
}
break;
}
case S_IFREG:
{
printf("File: %s\nSize: %d\n\n", abPath, filestat.st_size);
//Add slack space to the final sum
int slack=sectorSize-(filestat.st_size%sectorSize);
totalFilesSize+=filestat.st_size+slack;
break;
}
}
free(abPath);
}
closedir (directory);
}
int main (int argc, char **argv) {
if(argc!=2) {
printf("Error: Missing required parameter.\n");
return -1;
}
struct statvfs info;
statvfs (argv[1], &info);
sectorSize=info.f_bsize; //Setting global variable
uint64_t usedBytes=(info.f_blocks-info.f_bfree)*info.f_bsize;
readDir(argv[1]);
printf("Total blocks: %d\nFree blocks: %d\nSize of block: %d\n\
Size in bytes: %d\nTotal Files size: %d\n",
info.f_blocks, info.f_bfree, info.f_bsize, usedBytes, totalFilesSize);
return 0;
}
は、パーティションのマウントポイントを渡すとパラメータ(/ mnt/tmp)を指定すると、次の出力が表示されます。
File: /mnt/tmp/lost+found
Size: 12288
File: /mnt/tmp/photos
Size: 1024
File: /mnt/tmp/photos/IMG_3195.JPG
Size: 2373510
File: /mnt/tmp/photos/IMG_3200.JPG
Size: 2313695
File: /mnt/tmp/photos/IMG_3199.JPG
Size: 2484189
File: /mnt/tmp/photos/IMG_3203.JPG
Size: 2494687
File: /mnt/tmp/photos/IMG_3197.JPG
Size: 2259056
File: /mnt/tmp/photos/IMG_3201.JPG
Size: 2505596
File: /mnt/tmp/photos/IMG_3202.JPG
Size: 2306304
File: /mnt/tmp/photos/IMG_3204.JPG
Size: 2173883
File: /mnt/tmp/photos/IMG_3198.JPG
Size: 2390122
File: /mnt/tmp/photos/IMG_3196.JPG
Size: 2469315
Total blocks: 47249
Free blocks: 19160
Size of block: 1024
Size in bytes: 28763136
Total Files size: 23790592
最後の2行に注意してください。 FAT32ファイルシステムでは、量は同じですが、ext4では異なります。
質問:なぜですか?
statvfsのマンページから:「返された構造体のすべてのメンバーがすべてのファイルシステム上で意味のある値を持つかどうかは不明です。 – fge
@fge oopsなので、fsで使用されるバイトの信頼できる量を得る方法はありませんか?答えに感謝します。 – jlledom
まあ、あなたができることは、 'df'がやることです - 私はそれがどのように空間を計算するのか分かりません。以下の答えによれば、スパースファイルなどもあります。また、削除されていてもまだ開いているファイルの場合を考えてみましょう。ディスクスペースは必要ですが、ディレクトリには表示されません。 – fge