大佬教程收集整理的这篇文章主要介绍了试图读取目录中的文件,目录只是指向自己并在自己中循环,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
所以代码思路是这样的:我在main里面选一个路径,进去,如果遇到一个文件,只要把它的名字和修改日期保存在.txt文件中,否则它应该打开它刚才的目录找到,进入并重新执行此目录的过程
该过程的其余部分工作得很好,直到我取消对递归部分的注释,我认为它将继续前进(路径。),然后循环到该状态(转到路径..,路径...等),使这件事完全没用,只是一个无限循环
有什么想法吗?
#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 functionnal
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);
}
(dir->d_Name) !=".."
不是检查 dir->d_name
是否等于字符串 ".."
的有效方法。您需要使用 strcmp(dir->d_name,"..");
字符串文字 ".."
指的是内存中的一个位置,其中包含 3 个字节 .
、.
和 \0
。 dir->d_name
也完全有可能包含这些相同的字节,但由于它位于不同的位置,因此 dir->d_name == ".."
将是假的。但是,如果两个位置的内容相同,strcmp(dir->d_name,"..")
的计算结果将为零。
问题出在这里:
if((dir->d_Name) !="$WinREAgent" && (dir->d_Name) !=".." && (dir->d_Name) !="." && (dir->d_Name) !="\\.")
在 C 中,用 ==
或 !=
比较字符串是比较两个字符串的地址,而不是它们的内容。由于字符串文字位于程序的静态数据区域中,并且 d_name
指向 malloced 内存或 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 文件名(但这是一个很大的改变)。
我没有检查您的代码是否存在其他问题。
以上是大佬教程为你收集整理的试图读取目录中的文件,目录只是指向自己并在自己中循环全部内容,希望文章能够帮你解决试图读取目录中的文件,目录只是指向自己并在自己中循环所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。