尝试读取目录中的文件,目录只会导致他自己并在他自己中循环

问题描述 投票:0回答:2

所以代码思路如下:我在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);
}
c
2个回答
3
投票

问题就在这里:

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 文件名(但这是一个很大的更改)。

我没有检查你的代码是否有其他问题。


3
投票

(dir->d_name) !=".."
不是 检查
dir->d_name
是否等于字符串
".."
的有效方法。 你需要使用
strcmp(dir->d_name, "..");

字符串文字

".."
指的是内存中包含3个字节
.
.
\0
的位置。
dir->d_name
也完全有可能包含这些相同的字节,但由于它位于不同的位置,因此
dir->d_name == ".."
将为 false。 但如果两个位置的内容相同,则
strcmp(dir->d_name, "..")
将计算为零。

© www.soinside.com 2019 - 2024. All rights reserved.