0

处理将打开目录、读取其内容并打印出每个文件的信息的代码。它检查命令行,如果没有提供参数,将打印出指定目录或当前目录的内容。下面的代码与用于打印当前目录的代码几乎完全相同。唯一的区别是在第一个 if 语句而不是 argv[1] 中有“.”。下面的代码命中了while循环中的第一个if语句(我设置结果等于当前文件之后的那个),然后对目录中的每个文件说

加载 statBuffer 时出错: : 没有这样的文件或目录
加载 statBuffer 时出错: : 没有这样的文件或目录
加载 statBuffer 时出错: : 没有这样的文件或目录
加载 statBuffer 时出错: : 没有这样的文件或目录
加载 statBuffer 时出错: :没有这样的文件或目录
。thaddueus thaddueus 4096 2013 年 5 月 1 日星期三 18:34:42

加载 statBuffer 时出错: : 没有这样的文件或目录

这是我使用的代码。

else if(argc > 1){
    if((dir = opendir(argv[1])) == NULL){
    perror("opendir() error");
}else{
    while((entry = readdir(dir)) != NULL){
    result = stat(entry->d_name, &statBuf);
    if(result == -1)perror("Error while loading statBuffer: ");
        else{
            /*Line of code I added directly below this based upon David's suggestion*/
             snprint(pathname, sizeof(pathname), "%s/%s", argv[1], entry->d_name);
            /*Addition cause Segmentation fault core dumped*/
    if(strncmp(entry->d_name, "..",100) == 0 ||strncmp(entry->d_name, ".",100))
        continue;
    errno = 0;
    pws = getpwuid(statBuf.st_uid);
    if(errno != 0)
    perror("Error while retriving username: ");         
    errno = 0;
    grp = getgrgid(statBuf.st_gid);
    if(errno != 0) perror("Error while retriving groupname: ");                 
    /*Prints the filename*/
    printf("%s", entry->d_name);
        /*Prints the username*/
    printf("\t%s", pws->pw_name);
    /*Prints the groupname*/
    printf("\t%s", grp->gr_name);
    /*Prints the file size*/
    printf("\t%ld", (long)statBuf.st_size);
    /*Prints the last modification time*/
    printf("\t%s\n", ctime(&(statBuf.st_mtime)));
    }   
}
closedir(dir);
}
}

编辑:那个

. thaddueus thaddueus 4096 2013 年 5 月 1 日星期三 18:34:42

是一个隐藏文件。不确定何时会打印而其他人不会。

EDIT1:对不起。忘了补充说它正在获取文件名。

EDIT2:当我删除错误语句时,它会停止打印错误语句并只打印隐藏文件。

4

1 回答 1

1

您似乎正在打开目录 ( dir = opendir(argv[1])) 并阅读它 ( entry = readdir(dir)),但我没有看到您将其设为当前目录。

entry->d_name 中包含的文件名不是完整的路径名,它只是目录中文件的名称。你要么需要建立一个路径名(dir/filename),要么创建你正在查看的目录(chdir)。

编辑您可以使用以下内容构建路径名:

char pathname[1024]; // must be large enough for dirname+filename
snprintf(pathname, sizeof(pathname), "%s/%s", argv[1], entry->d_name);

请注意,您需要小心 (a) 定义一个足够大的变量以容纳最大长度的目录名 + 文件名,以及 (b) 使用snprintf允许您指定最大长度的函数 ( ,在这种情况下)复制到该变量中长度,以确保您永远不会写超出变量的末尾,无论如何。

附言。你提到那个

下面的代码和打印当前目录的代码几乎一模一样

您可能想考虑是否有一种方法可以对当前目录和指定目录使用相同的代码,而不是复制它。

于 2013-05-02T02:04:20.173 回答