linux系统下用c语言实现统计/tmp文件夹及子文件夹下每个文件夹的大小和每个文件的大小,并找出占内存最大的文件夹和文件
时间: 2023-08-09 15:10:17 浏览: 114
你可以使用递归的方式遍历 `/tmp` 目录及其子目录下的所有文件和文件夹,并使用 `stat` 系统调用获取文件的大小,最终统计出每个文件夹的大小和每个文件的大小,再找出占内存最大的文件夹和文件。
以下是一个示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include <string.h>
// 定义一个结构体用于存储文件夹的大小和路径
struct FolderSize {
long long size;
char path[1024];
};
// 递归遍历目录
void traverse_dir(const char *dir_path, long long *total_size, struct FolderSize *max_folder) {
DIR *dir = opendir(dir_path);
if (dir == NULL) {
perror("opendir");
return;
}
struct dirent *entry;
struct stat st;
long long folder_size = 0;
while ((entry = readdir(dir)) != NULL) {
// 构造文件路径
char path[1024];
snprintf(path, sizeof(path), "%s/%s", dir_path, entry->d_name);
if (stat(path, &st) == -1) {
perror("stat");
continue;
}
if (S_ISDIR(st.st_mode)) {
// 如果是目录,则递归遍历
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
traverse_dir(path, &folder_size, max_folder);
} else if (S_ISREG(st.st_mode)) {
// 如果是普通文件,则累加文件大小
folder_size += st.st_size;
*total_size += st.st_size;
// 如果文件大小比当前最大文件夹还大,则更新最大文件夹信息
if (folder_size > max_folder->size) {
max_folder->size = folder_size;
strncpy(max_folder->path, dir_path, sizeof(max_folder->path));
}
}
}
closedir(dir);
printf("Folder %s size: %lld bytes\n", dir_path, folder_size);
}
int main() {
long long total_size = 0;
struct FolderSize max_folder = {0, ""};
traverse_dir("/tmp", &total_size, &max_folder);
printf("Total size of /tmp and its subdirectories: %lld bytes\n", total_size);
printf("Largest folder: %s (%lld bytes)\n", max_folder.path, max_folder.size);
return 0;
}
```
注意,在程序中使用了 `strncpy` 函数来复制文件夹路径,以防止路径溢出问题。