程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了试图读取目录中的文件,目录只是指向自己并在自己中循环大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决试图读取目录中的文件,目录只是指向自己并在自己中循环?

开发过程中遇到试图读取目录中的文件,目录只是指向自己并在自己中循环的问题如何解决?下面主要结合日常开发的经验,给出你关于试图读取目录中的文件,目录只是指向自己并在自己中循环的解决方法建议,希望对你解决试图读取目录中的文件,目录只是指向自己并在自己中循环有所启发或帮助;

所以代码思路是这样的:我在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 个字节 ..\0dir->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 文件名(但这是一个很大的改变)。

我没有检查您的代码是否存在其他问题。

@H_674_84@

大佬总结

以上是大佬教程为你收集整理的试图读取目录中的文件,目录只是指向自己并在自己中循环全部内容,希望文章能够帮你解决试图读取目录中的文件,目录只是指向自己并在自己中循环所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。