如何确定文件或目录是否存在?

时间:2010-08-22 20:26:45

标签: c file directory

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

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

编辑:对于所有建议使用stat()或类似功能的人,我已经研究过了,虽然它可能会回答我的第一个问题,但我可以'弄清楚它将如何回答第二个......

3 个答案:

答案 0 :(得分:6)

由于您正在查询命名管道/符号链接等,您可能在* 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(....) {
}

可以使用的S_ISXXX宏的文档here

答案 1 :(得分:2)

stat()功能可以为您提供所需的一切(或更具体地lstat(),因为stat()将在此链接之后。)

答案 2 :(得分:1)

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

NAME

stat - 获取文件状态

概要

#include <sys/stat.h>

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

说明

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

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

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