所以代码思路如下:我在main中选择一个路径,进入其中,如果遇到文件,则将其名称和修改日期保存在.txt文件中,否则应该打开刚刚找到的目录,进入并重新执行此目录的过程。
该过程的其余部分工作得很好,直到我取消注释递归部分,我认为它将继续进入自身(Path.),然后循环到该状态(转到 Path..、Path... 等) ),让这个东西完全没用,只是一个无限循环
有什么想法吗?
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/stat.h>
#include <sys/types.h>
void ecrire(char * s);
void ecrire_add(char * s);
void regarder(char * loc);
int main(void) {
char localisation[10000]="Path example";
ecrire("");
regarder(localisation);
return(0);
}
void ecrire_add(char * s){
FILE * fichiertexte;
fichiertexte = fopen(".\\liste.txt","a");
fputs(s,fichiertexte);
fclose(fichiertexte);
}
void ecrire(char * s){
FILE * fichiertexte;
fichiertexte = fopen(".\\liste.txt","w");
fprintf(fichiertexte,s);
fclose(fichiertexte);
}
void regarder(char * loc){
DIR *d;
struct dirent *dir;
char contenu[100];
char position[100];
char modification[20];
struct stat attrib;
d = opendir(loc);
strcpy(position, loc);
if (d) {
while ((dir = readdir(d)) != NULL) {
if((dir->d_name) !="$WinREAgent" && (dir->d_name) !=".." && (dir->d_name) !="." && (dir->d_name) !="\\."){
strcpy(contenu,dir->d_name);
strcat(position,"\\");
strcat(position,contenu);
stat(position,&attrib);
strftime(modification, 20, "%H:%M:%S %d-%m-%y", localtime(&(attrib.st_mtime)));
//where i think the problem starts
//this is the part i comment to check if the rest is functional
if((S_ISDIR(attrib.st_mode)) && (dir->d_name) !=loc){
printf("rentre doss %s \n", position);
regarder(position);
}
//where i think it ends
printf("%s \n", position);
strcat(position,"\n");
strcat(position,modification);
strcat(position,"\n \n");
ecrire_add(position);
strcpy(position,loc);
strcpy(modification,"");
}
}
}
closedir(d);
}
问题就在这里:
if((dir->d_name) !="$WinREAgent" && (dir->d_name) !=".." && (dir->d_name) !="." && (dir->d_name) !="\\.")
在 C 语言中,用
==
或 !=
比较字符串会比较两个字符串的 addresses,而不是它们的内容。 由于字符串文字位于程序的静态数据区域中,并且 d_name
指向已分配的内存或 DIR
对象内的暂存缓冲区,因此这些比较将始终为 false。 您必须使用 strcmp
来代替。 另外,特殊目录条目 .
的名称只是 .
,而不是 \.
。 因此:
if (!strcmp(dir->d_name, "$WinREAgent") ||
!strcmp(dir->d_name, "..") ||
!strcmp(dir->d_name, ".")) {
continue;
}
// what you had inside your if statement goes here
请注意,我翻转了
if
的含义。 这只是为了避免另一级缩进。
由于您似乎使用的是 Windows,因此您可能需要使用
strcasecmp
进行第一个比较。 您可能还想使用本机 Windows API 来扫描目录 (FindFirstFileW/FindNextFileW),而不是 Unix 兼容层,以便更好地支持非 ASCII 文件名(但这是一个很大的更改)。
我没有检查你的代码是否有其他问题。
(dir->d_name) !=".."
不是 检查 dir->d_name
是否等于字符串 ".."
的有效方法。 你需要使用strcmp(dir->d_name, "..");
字符串文字
".."
指的是内存中包含3个字节.
、.
和\0
的位置。 dir->d_name
也完全有可能包含这些相同的字节,但由于它位于不同的位置,因此 dir->d_name == ".."
将为 false。 但如果两个位置的内容相同,则 strcmp(dir->d_name, "..")
将计算为零。