为啥我的 S_ISDIR 和 S_ISREG 不能返回正确的目录/文件名?

Posted

技术标签:

【中文标题】为啥我的 S_ISDIR 和 S_ISREG 不能返回正确的目录/文件名?【英文标题】:Why won't my S_ISDIR and S_ISREG return the correct directory/file name?为什么我的 S_ISDIR 和 S_ISREG 不能返回正确的目录/文件名? 【发布时间】:2017-03-02 21:43:21 【问题描述】:

为什么我的 S_ISDIR 和 S_ISREG 不能返回正确的目录/文件名?

当我使用我用其他 3 个目录和一个文本文件创建的测试目录运行我的程序时,只有 Dir 的 printf() 会执行。

#include "dirAssignment.h"

//Struct
typedef struct directories

directories;


//Method to look for directories and files:
void search(const char *fileName)
    struct stat dirInfo;
    struct dirent *dirp;
    DIR *dp;

    //Checks to see if there is an error with the fileName:
    if (lstat(fileName, &dirInfo) < 0)
        
        //Error:
        printf("Something went wrong!\n");
        printf("%s\n",strerror(errno));
    

    //Checks to see if file can be opened:
    if ((dp = opendir(fileName)) == NULL)
    
        printf("Cannot open file %s\n", fileName);
        printf("%s\n", strerror(errno));
    

    //If file can be opened, get all the files from the directory:
    while((dirp = readdir(dp)) != NULL)
       
        //Check for( and Ignore) parent and self:
        if (strcmp(dirp->d_name,".") == 0 || strcmp(dirp->d_name,"..") == 0)        
        
            continue;
        
        printf("%s:\t",dirp->d_name);


        if(S_ISDIR(dirInfo.st_mode))
        
            printf("Dir\n");
        
        else if(S_ISREG(dirInfo.st_mode))
        
            printf("File\n");
        
    /*
        else if(S_ISDIR(dirp->d_name, &dirInfo))
        
            //stat(fileName, &dirInfo);

            //Checks to see if the file is a directory:
            if (S_ISDIR(getcwd(dirp->d_name,512).st_mode))
            
                printf("directory in: %s\n", fileName);
            
            //Must be a file:
            else if (S_ISREG(getcwd(dirp->d_name,512).st_mode))
            
                printf("file in: %s\n", fileName);
            
            //No clue how you got here!
            else
            
                printf("Danger Will Robinson, Danger... Danger!!!\n");
            
        
        else
        
            printf("Danger Will Robinson, Danger... Danger!!!\n");
        
    */

     //End of while loop
//End of Search method

int main(int argc, char const *argv[])

    //Variables go here:
    int i = 0;
    char const *fileName = argv[1];


    //Prompt the user:
    printf("Enter starting fileName: %s\n",argv[1]);
    //Starting file:
    printf("Starting from file: %s\n...\n\n\n\n", fileName);

    //Lettuce(lol) find some files and directories!
    search(fileName);


    return 0;
//End of main method

【问题讨论】:

#include "dirAssignment.h" 抱歉,作业转储需要比这更伪装bit。欢迎来到堆栈溢出。请花时间写Minimal, Complete, and Verifiable Example。 我并没有试图隐瞒这是一个家庭作业的事实。只是想给任何可能有答案的人我所有的代码,因为也许我写错了导致我的问题。我唯一的问题是为什么我会打印出当我点击 if 语句时得到的打印结果。我不认为我是在要求任何人为我完成一个项目。感谢您的帮助! 为了清楚地了解运行时问题的根源,我们希望代码能够干净地编译。发布的代码包含一个“自制”头文件:dirAssignment.h 但该文件的内容丢失了。 在没有首先检查argc 以确保用户实际输入了命令行参数之前,永远不要访问argv[0] 以外的地方。如果未输入所需的命令行参数,则应执行类似:fprintf( stderr, "USAGE: %s &lt;inputFileName&gt;\n", argv[0] ); exit( EXIT_FAILURE ); 注意:exit()EXIT_FAILURE 位于 stdlib.hprintf() 中,fprintf() 位于 stdio.h 中跨度> 【参考方案1】:

很明显你使用了错误的变量。 dirInfo 是由这一行 if (lstat(fileName, &amp;dirInfo) &lt; 0) 初始化的。这就是为什么总是打印 Dir。

   if(S_ISDIR(dirInfo.st_mode))
    
        printf("Dir\n");
    
    else if(S_ISREG(dirInfo.st_mode))
    
        printf("File\n");
    

在 linux 上,也许你可以使用dirp-&gt;d_type 来获取类型。阅读this

如果要使用S_ISREG/S_ISDIR,只需调用lstat先获取文件状态。

【讨论】:

以上是关于为啥我的 S_ISDIR 和 S_ISREG 不能返回正确的目录/文件名?的主要内容,如果未能解决你的问题,请参考以下文章

区分 C 和 C++ 中的 unix 目录和文件

什么是`S_ISREG()`,它有什么作用?

如何在 Python 中通过 SFTP 检查 S_ISREG 以获取 Windows NTFS 文件?

S_ISREG等几个常见的宏(转)

为啥我的 PHP 会话会死掉?为啥我不能恢复它们?

为啥我的 public void Constructor 不能编译?