fsize:高效计算目录中文件大小而不计入目录节点

0 下载量 38 浏览量 更新于2024-12-03 收藏 763KB GZ 举报
资源摘要信息:"fsize是一个开源工具,专门用于在不计算目录节点的情况下,在目录中累积文件的大小。这个工具可以帮助用户在使用rsync同步两个文件存储库时,显示双方是否显示了相同数量的文件和相同的文件大小。在使用du命令时,总是会计算文件和目录(选项-sb),这可能会导致大小不同。因为目录节点在rsync源上可能使用12 KB,在rsync目标上使用16 KB。使用fsize可以有效避免这种情况,使得文件大小的计算更为准确。" 详细知识点: 1. rsync工具:rsync是一种快速增量备份工具,用于文件同步。它可以用来在本地计算机和远程计算机之间同步文件和目录。rsync会比较源目录和目标目录的文件,然后只同步改变过的部分。这种方法可以大大提高同步速度。 2. fsize工具:fsize是一个专门为解决rsync同步问题而设计的工具。它可以用来计算目录中文件的总大小,而不会计算目录节点的大小。这使得fsize在同步文件时,可以更准确地比较文件大小。 3. du命令:du是一个用于估算文件和目录磁盘空间使用的命令。它会显示每个文件和目录的磁盘使用量。在使用du时,选项-sb表示计算目录的大小,并以字节为单位显示结果。但是,du会计算文件和目录,包括目录节点的大小,这可能会导致计算结果的差异。 4. 目录节点大小问题:在使用rsync同步文件时,可能会遇到目录节点大小的问题。在rsync源上,目录节点可能使用12 KB的空间,而在rsync目标上,可能使用了16 KB的空间。这个问题可能会导致使用du命令计算的文件大小出现差异。而使用fsize可以避免这个问题,因为它不会计算目录节点的大小。 5. 开源软件:fsize是一个开源工具,其源代码对所有人开放。这使得任何人都可以阅读、修改和改进代码。开源软件的优点是透明度高,安全性好,而且可以由全球的开发者共同维护和改进。 6. 文件同步问题:在使用rsync同步文件时,可能会遇到各种问题,比如文件权限问题、文件所有权问题等。使用fsize可以避免因目录节点大小不同而导致的文件大小计算问题。这使得文件同步过程更加顺利,避免了不必要的错误。 总结来说,fsize是一个非常有用的工具,特别是在使用rsync同步文件时。它可以帮助用户准确地计算文件大小,避免因目录节点大小不同而导致的问题。同时,作为一个开源工具,fsize也可以根据用户的需求进行改进和优化。

void write(string* str,char *content,int size) { char fName[20];strcpy_s(fName, str[1].c_str()); //在当前目录下查找目标文件 int i, j; for (i = 2; i < MSD + 2; i++) if (!strcmp(curDir->directItem[i].fileName, fName) && curDir->directItem[i].type == 0) break; if (i >= MSD + 2) { cout << "找不到该文件!" << endl; return; } int cur = i;//当前目录项的下标 int fSize = curDir->directItem[cur].size;//目标文件大小 int item = curDir->directItem[cur].firstDisk;//目标文件的起始磁盘块号 while (fat[item].item != -1)item = fat[item].item;//计算保存该文件的最后一块盘块号 char* first = fdisk + item * DISK_SIZE + fSize % DISK_SIZE;//计算该文件的末地址 //如果盘块剩余部分够写,则直接写入剩余部分 if (DISK_SIZE - fSize % DISK_SIZE > size) { strcpy_s(first, content); curDir->directItem[cur].size += size; } //如果盘块剩余部分不够写,则找到空闲磁盘块写入 else { //先将起始磁盘剩余部分写完 for (j = 0; j < DISK_SIZE - fSize % DISK_SIZE; j++) { first[j] = content[j]; } int res_size = size - (DISK_SIZE - fSize % DISK_SIZE);//剩余要写的内容大小 int needDisk = res_size / DISK_SIZE;//占据的磁盘块数量 int needRes = res_size % DISK_SIZE;//占据最后一块磁盘块的大小 if (needDisk > 0)needRes += 1; for (j = 0; j < needDisk; j++) { for (i = USER_ROOT_STARTBLOCK + 1; i < DISK_NUM; i++) if (fat[i].state == 0) break; if (i >= DISK_NUM) { cout << "磁盘已被分配完!" << endl; return; } first = fdisk + i * DISK_SIZE;//空闲磁盘起始盘物理地址 //当写到最后一块磁盘,则只写剩余部分内容 if (j == needDisk - 1) { for (int k = 0; k < size - (DISK_SIZE - fSize % DISK_SIZE - j * DISK_SIZE); k++) first[k] = content[k]; } else { for (int k = 0; k < DISK_SIZE; k++) first[k] = content[k]; } //修改文件分配表内容 fat[item].item = i; fat[i].state = 1; fat[i].item = -1; } curDir->directItem[cur].size += size; } }

2023-05-29 上传