【问题标题】:How to find out if a file or directory exists?如何判断文件或目录是否存在?
【发布时间】:2010-08-22 20:26:45
【问题描述】:

我正在尝试制作一个处理文件和目录的简单程序,但我有两个主要问题:

  • 如何检查文件或目录是否存在,以及
  • 我如何知道它是文件、目录、符号链接、设备、命名管道等?目前主要是文件和目录,但我也想知道其他的。

编辑: 太多人建议使用stat() 或类似功能,我已经研究过了,虽然它可能会回答我的第一个问题,但我想不通看看它会如何回答第二个......

【问题讨论】:

  • 可以使用dirent.h头文件的findfirst()函数。如果返回 0 则存在,否则不存在 (-1)。

标签: c file directory


【解决方案1】:

由于您正在查询命名管道/符号链接等,您可能在 *nix 上,所以使用 lstat()函数

struct stat info;

if(lstat(name,&info) != 0) {
  if(errno == ENOENT) {
   //  doesn't exist
   } else if(errno == EACCES) {
    // we don't have permission to know if 
   //  the path/file exists.. impossible to tell
   } else {
      //general error handling
   }
  return;
}
//so, it exists.

if(S_ISDIR(info.st_mode)) {
  //it's a directory
} else if(S_ISFIFO(info.st_mode)) {
  //it's a named pipe 
} else if(....) {
}

请参阅文档here,了解您可以使用的 S_ISXXX 宏。

【讨论】:

    【解决方案2】:

    stat() 函数应该为您提供您正在寻找的一切(或者更具体地说,lstat(),因为stat() 将跟随链接)。

    【讨论】:

      【解决方案3】:

      使用stat(或者如果您希望获取有关符号链接的信息,而不是跟随它并获取有关目的地的信息,lstat)

      名字

      stat - 获取文件状态

      概要

      #include <sys/stat.h>
      
      int stat(const char *restrict path, struct stat *restrict buf);
      

      描述

      stat() 函数应获取有关命名文件的信息并将其写入 buf 参数指向的区域。 path 参数指向命名文件的路径名。不需要指定文件的读、写或执行权限。在实现定义的条件下,提供附加或替代文件访问控制机制的实现可能会导致 stat() 失败。特别是,系统可能会拒绝路径指定的文件的存在。

      如果命名文件是符号链接,则 stat() 函数应使用符号链接的内容继续进行路径名解析,如果文件存在,则应返回与结果文件有关的信息。

      buf 参数是一个指向 stat 结构的指针,如标头中定义的那样,其中放置有关文件的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-14
        • 1970-01-01
        • 1970-01-01
        • 2014-04-12
        • 1970-01-01
        • 2015-11-15
        相关资源
        最近更新 更多