`int init(FILE* file,int startbyte, int endcount,char * path,int model,char *operation) {
int containsItem = 0;
struct RootEntry rootEntryObj;
struct RootEntry* rootEntry=&rootEntryObj;
int i = 1;
int startOfData = 19 * 512 + RootEntCnt * 32;//数据区的开始位置
int fileNumber = 0;
int dirNumber = 0;
for (i;i <= endcount;i++) {
fseek(file, startbyte, SEEK_SET);
fread(rootEntry, 1, 32, file);//读取一个文件项到一个rootEntry结构体当中
//判断rootEntry项的属性,是文件还是目录,可怜找不到具体哪个数字对应哪种文件,只知道0x20是txt
startbyte += 32;//指针移动32个字节
if (rootEntry->DIR_Attr == 0)//有大量为0的条目,此处过滤
continue;
if ((!(rootEntry->DIR_Name[0] >= 65 && rootEntry->DIR_Name[0] <= 90))&&(!(rootEntry->DIR_Name[0] >= 97 && rootEntry->DIR_Name[0] <= 122)))
continue;
if (rootEntry->DIR_Attr == 0x20) {//文件
containsItem = 1;
char filename[12];
int j = 0;
for (j;j < 11;j++) {
if ((rootEntry->DIR_Name[j] >= 65 && rootEntry->DIR_Name[j] <= 90) || (rootEntry->DIR_Name[j] >= 97 && rootEntry->DIR_Name[j] <= 122))
filename[j] = rootEntry->DIR_Name[j];
else
break;
}
filename[j] = '.';
filename[j + 1] = rootEntry->DIR_Name[8];
filename[j + 2] = rootEntry->DIR_Name[9];
filename[j+3] = rootEntry->DIR_Name[10];
filename[j + 4] = '\0';
char copypath[100];
strcpy(copypath, path);
stringAdd(copypath,filename);//copypath此时加入了名字
if (model == 1) {
simplePrint(copypath);//调用打印程序
printf("\n");
}
if (model == 3) {
if (stringEqualTail(path, operation)) {
fileNumber++;
}
}
else if (model == 2) {
if (stringEqual(path, operation) == 2)
simplePrint(copypath);
if (stringEqual(copypath, operation) == 2) {
findfile = 1;
int startClusNumber;//开始簇号
startClusNumber = rootEntry->DIR_FstClus;
int data_ptr;//指向该目录在数据区的位置
data_ptr = startOfData + (startClusNumber - 2)*SecPerClus*BytsPerSec;//数据区指针
//查询FAT表,确定是否只占有一个数据簇,FAT1表的起始字节为512字节,但是前三个字节是固定的,故偏移从第四个字节开始,即簇号为2则扫描4,5字节,然后右移四位,簇号为3则扫描5,6字节并且左移四位,4则6,7
by2 fatValue=0;
char test[3];
while (fatValue < 0xFF8) {
if (startClusNumber % 2 == 0) {//偶数的FAT项
fseek(file, 512+startClusNumber+1, SEEK_SET);
fread(test, 1, 2, file);
fatValue = fatValue >> 4;//右移四位
}
else {//奇数的FAT项
fseek(file, 516, SEEK_SET);
//fseek(file, 512+startClusNumber + 1, SEEK_SET);
fread(&fatValue, 1, 2, file);
fatValue = fatValue << 4;//左移四位
}
char contentOfFile[512];
fseek(file, data_ptr, SEEK_SET);
fread(contentOfFile, 1, 512, file);//将内容填充到了数组中
simplePrint(contentOfFile);
data_ptr= startOfData + (fatValue - 2)*SecPerClus*BytsPerSec;//更新data_ptr
}
}
}
}
else if(rootEntry->DIR_Attr==0x10){//目录
containsItem = 1;
char dirName[12];
int j = 0;
for (j;j < 11;j++) {
if ((rootEntry->DIR_Name[j] >= 65 && rootEntry->DIR_Name[j] <= 90) || (rootEntry->DIR_Name[j] >= 97 && rootEntry->DIR_Name[j] <= 122)||(rootEntry->DIR_Name[j]>='0'&&rootEntry->DIR_Name[j]<='9'))
dirName[j] = rootEntry->DIR_Name[j];
else
break;
}
dirName[j] = '\0';
char copypath[100];
strcpy(copypath, path);
stringAdd(copypath,dirName);
stringAdd(copypath, "/");//此时copypath已经认定了当前目录
//发现是目录,去寻找开始簇号
int startClusNumber;//开始簇号
startClusNumber= rootEntry->DIR_FstClus;
int data_ptr;//指向该目录在数据区的位置
data_ptr=startOfData + (startClusNumber-2)*SecPerClus*BytsPerSec;
if (model == 3) {
if (stringEqualTail(path, operation)) {//表示已经到达目标目录内
dirNumber++;
char copyOperation[100];
strcpy(copyOperation, dirName);
init(file, data_ptr, 512 / 32, copypath, 3, dirName);//此处有问题
}
else {
init(file, data_ptr, 512 / 32, copypath, 3, operation);
}
}
else if (model == 1) {
if (!init(file, data_ptr, 512 / 32, copypath, 1, operation)) {//有内容就不打印,留待最后的时候将全路径打印出来
simplePrint(copypath);
printf("\n");
}
}
else if (model == 2) {
if (stringEqual(copypath, operation)==2) {
if (!init(file, data_ptr, 512 / 32, copypath, 1, operation)) {//有内容就不打印,留待最后的时候将全路径打印出来
simplePrint(copypath);
printf("\n");
}
}
else if (stringEqual(copypath, operation) == 1) {
init(file, data_ptr, 512 / 32, copypath, 2, operation);
}
}
}
}
if (model == 3&& stringEqualTail(path, operation)) {
simplePrint(operation);
simplePrint("dirNumber is ");
simplePrint(itoa(dirNumber));
simplePrint("\n");
simplePrint("fileNumber is ");
simplePrint(itoa(fileNumber));
simplePrint("\n");
}
return containsItem;
}`
这段代码是用来读取FAT12文件系统的,model是命令的一个参数,表示不同的模式,文件和目录都有三种模式下的对应处理方法,互相不干扰,主要是model=3时会出现问题,model=3是计数,operation是目录名,model=3的时候会把operation的目录第一级的子目录数和文件数打印,再对operation的子目录也进行同样的统计。很奇怪的是model=3的时候目录处理中递归的那一句会导致循环的i执行到i=4的时候就无法执行了,在for(i;i<endcout;i++)
的地方就写入冲突,感觉不明白,i是个局部变量啊,递归也不会对这个i造成影响啊,但是删了这句递归i 就能正常加了,求指点!