为啥我的 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 <inputFileName>\n", argv[0] ); exit( EXIT_FAILURE );
注意:exit()
和 EXIT_FAILURE
位于 stdlib.h
和 printf()
中,fprintf()
位于 stdio.h
中跨度>
【参考方案1】:
很明显你使用了错误的变量。 dirInfo
是由这一行 if (lstat(fileName, &dirInfo) < 0)
初始化的。这就是为什么总是打印 Dir。
if(S_ISDIR(dirInfo.st_mode))
printf("Dir\n");
else if(S_ISREG(dirInfo.st_mode))
printf("File\n");
在 linux 上,也许你可以使用dirp->d_type
来获取类型。阅读this
如果要使用S_ISREG/S_ISDIR,只需调用lstat
先获取文件状态。
【讨论】:
以上是关于为啥我的 S_ISDIR 和 S_ISREG 不能返回正确的目录/文件名?的主要内容,如果未能解决你的问题,请参考以下文章