如何判断是文件?还是文件夹?

时间:2021-08-23 21:40:31
基于某些文件名是没有扩展名的,所以它的路径就与文件夹相同了。

于是想问:
有什么函数或方法可以直接判断它是文件?还是文件夹?

16 个解决方案

#1


BOOL PathIsDirectory(          LPCTSTR pszPath
);
Verifies that a path is a valid directory。

#2


贴个linux的.

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <time.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(int argc, char *argv[])
       {
           struct stat sb;

           if (argc != 2) {
               fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           if (stat(argv[1], &sb) == -1) {
               perror("stat");
               exit(EXIT_FAILURE);
           }

           printf("File type:                ");

           switch (sb.st_mode & S_IFMT) {
           case S_IFBLK:  printf("block device\n");            break;
           case S_IFCHR:  printf("character device\n");        break;
           case S_IFDIR:  printf("directory\n");               break;
           case S_IFIFO:  printf("FIFO/pipe\n");               break;
           case S_IFLNK:  printf("symlink\n");                 break;
           case S_IFREG:  printf("regular file\n");            break;
           case S_IFSOCK: printf("socket\n");                  break;
           default:       printf("unknown?\n");                break;
           }

          exit(EXIT_SUCCESS);
       }

#3


int stat(const char *restrict pathname, struct stat *restrict buf);

struct stat {

        mode_t     st_mode;       //文件对应的模式,文件,目录等

        ino_t      st_ino;       //inode节点号

        dev_t      st_dev;        //设备号码

        dev_t      st_rdev;       //特殊设备号码

        nlink_t    st_nlink;      //文件的连接数

        uid_t      st_uid;        //文件所有者

        gid_t      st_gid;        //文件所有者对应的组

        off_t      st_size;       //普通文件,对应的文件字节数

        time_t     st_atime;      //文件最后被访问的时间

        time_t     st_mtime;      //文件内容最后被修改的时间

        time_t     st_ctime;      //文件状态改变时间

        blksize_t st_blksize;    //文件内容对应的块大小

        blkcnt_t   st_blocks;     //伟建内容对应的块数量

      };

宏作用:

S_ISREG()测试是否为普通文件

S_ISDIR()测试是否为目录文件


例子:
#include <stdio.h>

  #include <stdlib.h>

  #include <sys/types.h>

  #include <sys/stat.h>

  #include <fcntl.h>

  #include <unistd.h>

 

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

       {

    int i;

    struct stat buf;

    char *ptr;

    for(i=1; i< argc; i++)

    {

        printf("%s: ", argv[i]);

      if(lstat(argv[i],&buf)<0)

      {

                     printf("lstat error.");

                     continue;

      }

      if(S_ISREG(buf.st_mode)) ptr = "regular";

      else if(S_ISDIR(buf.st_mode)) ptr = "directory";

      else if(S_ISCHR(buf.st_mode)) ptr = "char special";

      else if(S_ISBLK(buf.st_mode)) ptr = "block special";

      else if(S_ISFIFO(buf.st_mode)) ptr = "fifo";

      else ptr = "Others";

      printf(" %s\n",ptr );

    }

    return 0;

  }

#4


引用 1 楼 xin_wu_hen 的回复:
BOOL PathIsDirectory(          LPCTSTR pszPath
);
Verifies that a path is a valid directory。

++1,没试过!

#5


引用 1 楼 xin_wu_hen 的回复:
BOOL PathIsDirectory( LPCTSTR pszPath
);
Verifies that a path is a valid directory。

++
不过得加上这些
#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>

#6


system("dir /a-d /b /s c:\\*.* >d:\\allfiles.txt");
//d:\\allfiles.txt文件中内容为c:上所有文件名
system("dir /ad /b /s c:\\*.* >d:\\alldirs.txt");
//d:\\alldirs.txt文件中内容为c:上所有文件夹名

#7


我想用这个思路,是否可行?
有它们中,判断是否存在特有的属性,如:子目录
因为文件夹是具有子目录的,文件的话就没有“子目录”这个属性。
用这样区分开。

#8


除了子目录,还有修改时间等。

#9



shell 命令就很好判断啦 

#10


路过学习下~~

判断一个路径是否是文件。 
在文件夹路径存储的时候可以在最后加上"\",用来区别文件(没有拓展名)和文件夹路径的区别。
例如:"C:\Users\"这是个文件夹
          "C:\Users"这是个没有拓展名的文件

#11


引用 2 楼 zmlovelx 的回复:
贴个linux的.
C/C++ code

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <time.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(int argc, char……

如此:
用stat函数就比较好。

#12


引用 7 楼 mokson 的回复:
我想用这个思路,是否可行?
有它们中,判断是否存在特有的属性,如:子目录
因为文件夹是具有子目录的,文件的话就没有“子目录”这个属性。
用这样区分开。


当然可行,比如

The st_mode entry contains a set of flags describing the file. The flag definitions are also included in <sys/types.h>; we need only the part that deals with file type:
#define S_IFMT 0160000 /* type of file: */
#define S_IFDIR 0040000 /* directory */
#define S_IFCHR 0020000 /* character special */
#define S_IFBLK 0060000 /* block special */
#define S_IFREG 0010000 /* regular */
/* ... */

但这是unix 下的,别的os 的不一定一样

简单一点,利用 os 提供的 api 

#13


这样写貌似也可以……
当然,这是测试文件是否存在的代码……文件夹不是文件……

#include <stdio.h>
 
int main(int argc, char **argv)
{
FILE *fp = NULL;
const char name[] = "test";

/* 鉴于Windows下文件和文件夹不能同名,试试这段代码 */
if (NULL == (fp = fopen(name, "rb")))
{
printf("Not File!\n");
}
else
{
printf("Is FIle!");
fclose(fp);
}
return 0;
}

#14


引用 13 楼 icemornings 的回复:
这样写貌似也可以……
当然,这是测试文件是否存在的代码……文件夹不是文件……
C/C++ code

#include <stdio.h>
 
int main(int argc, char **argv)
{
    FILE *fp = NULL;
    const char name[] = "test";

    /* 鉴于Windows下文件和文件夹不能同名,试试这段代码 *……

这个方法比较简单.

#15


真的高手如云,非常石感谢大家的帮助。

#16


楼上的API不错。
如果纯C编程的话,可以试着当成文件打开,如果打不开就是文件夹,这是个笨办法。

#1


BOOL PathIsDirectory(          LPCTSTR pszPath
);
Verifies that a path is a valid directory。

#2


贴个linux的.

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <time.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(int argc, char *argv[])
       {
           struct stat sb;

           if (argc != 2) {
               fprintf(stderr, "Usage: %s <pathname>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           if (stat(argv[1], &sb) == -1) {
               perror("stat");
               exit(EXIT_FAILURE);
           }

           printf("File type:                ");

           switch (sb.st_mode & S_IFMT) {
           case S_IFBLK:  printf("block device\n");            break;
           case S_IFCHR:  printf("character device\n");        break;
           case S_IFDIR:  printf("directory\n");               break;
           case S_IFIFO:  printf("FIFO/pipe\n");               break;
           case S_IFLNK:  printf("symlink\n");                 break;
           case S_IFREG:  printf("regular file\n");            break;
           case S_IFSOCK: printf("socket\n");                  break;
           default:       printf("unknown?\n");                break;
           }

          exit(EXIT_SUCCESS);
       }

#3


int stat(const char *restrict pathname, struct stat *restrict buf);

struct stat {

        mode_t     st_mode;       //文件对应的模式,文件,目录等

        ino_t      st_ino;       //inode节点号

        dev_t      st_dev;        //设备号码

        dev_t      st_rdev;       //特殊设备号码

        nlink_t    st_nlink;      //文件的连接数

        uid_t      st_uid;        //文件所有者

        gid_t      st_gid;        //文件所有者对应的组

        off_t      st_size;       //普通文件,对应的文件字节数

        time_t     st_atime;      //文件最后被访问的时间

        time_t     st_mtime;      //文件内容最后被修改的时间

        time_t     st_ctime;      //文件状态改变时间

        blksize_t st_blksize;    //文件内容对应的块大小

        blkcnt_t   st_blocks;     //伟建内容对应的块数量

      };

宏作用:

S_ISREG()测试是否为普通文件

S_ISDIR()测试是否为目录文件


例子:
#include <stdio.h>

  #include <stdlib.h>

  #include <sys/types.h>

  #include <sys/stat.h>

  #include <fcntl.h>

  #include <unistd.h>

 

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

       {

    int i;

    struct stat buf;

    char *ptr;

    for(i=1; i< argc; i++)

    {

        printf("%s: ", argv[i]);

      if(lstat(argv[i],&buf)<0)

      {

                     printf("lstat error.");

                     continue;

      }

      if(S_ISREG(buf.st_mode)) ptr = "regular";

      else if(S_ISDIR(buf.st_mode)) ptr = "directory";

      else if(S_ISCHR(buf.st_mode)) ptr = "char special";

      else if(S_ISBLK(buf.st_mode)) ptr = "block special";

      else if(S_ISFIFO(buf.st_mode)) ptr = "fifo";

      else ptr = "Others";

      printf(" %s\n",ptr );

    }

    return 0;

  }

#4


引用 1 楼 xin_wu_hen 的回复:
BOOL PathIsDirectory(          LPCTSTR pszPath
);
Verifies that a path is a valid directory。

++1,没试过!

#5


引用 1 楼 xin_wu_hen 的回复:
BOOL PathIsDirectory( LPCTSTR pszPath
);
Verifies that a path is a valid directory。

++
不过得加上这些
#pragma comment(lib, "shlwapi.lib")
#include <shlwapi.h>

#6


system("dir /a-d /b /s c:\\*.* >d:\\allfiles.txt");
//d:\\allfiles.txt文件中内容为c:上所有文件名
system("dir /ad /b /s c:\\*.* >d:\\alldirs.txt");
//d:\\alldirs.txt文件中内容为c:上所有文件夹名

#7


我想用这个思路,是否可行?
有它们中,判断是否存在特有的属性,如:子目录
因为文件夹是具有子目录的,文件的话就没有“子目录”这个属性。
用这样区分开。

#8


除了子目录,还有修改时间等。

#9



shell 命令就很好判断啦 

#10


路过学习下~~

判断一个路径是否是文件。 
在文件夹路径存储的时候可以在最后加上"\",用来区别文件(没有拓展名)和文件夹路径的区别。
例如:"C:\Users\"这是个文件夹
          "C:\Users"这是个没有拓展名的文件

#11


引用 2 楼 zmlovelx 的回复:
贴个linux的.
C/C++ code

       #include <sys/types.h>
       #include <sys/stat.h>
       #include <time.h>
       #include <stdio.h>
       #include <stdlib.h>

       int
       main(int argc, char……

如此:
用stat函数就比较好。

#12


引用 7 楼 mokson 的回复:
我想用这个思路,是否可行?
有它们中,判断是否存在特有的属性,如:子目录
因为文件夹是具有子目录的,文件的话就没有“子目录”这个属性。
用这样区分开。


当然可行,比如

The st_mode entry contains a set of flags describing the file. The flag definitions are also included in <sys/types.h>; we need only the part that deals with file type:
#define S_IFMT 0160000 /* type of file: */
#define S_IFDIR 0040000 /* directory */
#define S_IFCHR 0020000 /* character special */
#define S_IFBLK 0060000 /* block special */
#define S_IFREG 0010000 /* regular */
/* ... */

但这是unix 下的,别的os 的不一定一样

简单一点,利用 os 提供的 api 

#13


这样写貌似也可以……
当然,这是测试文件是否存在的代码……文件夹不是文件……

#include <stdio.h>
 
int main(int argc, char **argv)
{
FILE *fp = NULL;
const char name[] = "test";

/* 鉴于Windows下文件和文件夹不能同名,试试这段代码 */
if (NULL == (fp = fopen(name, "rb")))
{
printf("Not File!\n");
}
else
{
printf("Is FIle!");
fclose(fp);
}
return 0;
}

#14


引用 13 楼 icemornings 的回复:
这样写貌似也可以……
当然,这是测试文件是否存在的代码……文件夹不是文件……
C/C++ code

#include <stdio.h>
 
int main(int argc, char **argv)
{
    FILE *fp = NULL;
    const char name[] = "test";

    /* 鉴于Windows下文件和文件夹不能同名,试试这段代码 *……

这个方法比较简单.

#15


真的高手如云,非常石感谢大家的帮助。

#16


楼上的API不错。
如果纯C编程的话,可以试着当成文件打开,如果打不开就是文件夹,这是个笨办法。