Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Checking if a file is a directory or just a file [duplicate]

Tags:

c

posix

I'm writing a program to check if something is a file or is a directory. Is there a better way to do it than this?

#include <stdio.h>  #include <sys/types.h> #include <dirent.h> #include <errno.h>  int isFile(const char* name) {     DIR* directory = opendir(name);      if(directory != NULL)     {      closedir(directory);      return 0;     }      if(errno == ENOTDIR)     {      return 1;     }      return -1; }  int main(void) {     const char* file = "./testFile";     const char* directory = "./";      printf("Is %s a file? %s.\n", file,      ((isFile(file) == 1) ? "Yes" : "No"));      printf("Is %s a directory? %s.\n", directory,      ((isFile(directory) == 0) ? "Yes" : "No"));      return 0; } 
like image 324
Jookia Avatar asked Dec 29 '10 09:12

Jookia


People also ask

How do you know if a file is a directory?

isDirectory() checks whether a file with the specified abstract path name is a directory or not. This method returns true if the file specified by the abstract path name is a directory and false otherwise.

How can you tell the difference between a directory and a file?

difference between directory and File : A file is any kind of computer document and a directory is a computer document folder or filing cabinet.


1 Answers

You can call the stat() function and use the S_ISREG() macro on the st_mode field of the stat structure in order to determine if your path points to a regular file:

#include <sys/types.h> #include <sys/stat.h> #include <unistd.h>  int is_regular_file(const char *path) {     struct stat path_stat;     stat(path, &path_stat);     return S_ISREG(path_stat.st_mode); } 

Note that there are other file types besides regular and directory, like devices, pipes, symbolic links, sockets, etc. You might want to take those into account.

like image 66
Frédéric Hamidi Avatar answered Sep 25 '22 21:09

Frédéric Hamidi