如何测试文件的存在'无法访问的内容?

时间:2015-06-16 20:11:07

标签: c file

我在char full_path[1000]中存储了完整路径,并且我想知道该位置是否存在任何

(我的代码在检查之后要做的下一件事就是在该位置创建一些东西,但是如果已经存在某些东西而不是使用等效的rm -rf清除该位置,我希望将其视为错误)

该位置可能被文件或目录占用,或者甚至是某些不再存在的目标的链接,例如:

lrwxrwxrwx 1 user grp 4 Jun 16 20:02 a-link -> non-existent-thing

如果链接无效,access(full_path, F_OK)会告诉我无法访问full_path,这可能是因为(1)此处不存在或因为(2)链接无效

鉴于此,确定full_path是否存在任何内容的最佳方式是什么?

2 个答案:

答案 0 :(得分:1)

你根本无法以跨平台的方式做到这一点。 stat()fopen()不起作用。但是,您可以使用OS API,例如,在Windows上,您可以使用WinAPI和示例代码:

int doesFileExist(TCHAR* path)
{
   WIN32_FIND_DATA FindFileData;
   HANDLE handle = FindFirstFile(path, &FindFileData) ;
   int found = (handle != INVALID_HANDLE_VALUE);
   if(found) 
   {
       FindClose(handle);
   }
   return found;
}

如果您只想检查是否存在任何内容,找到任何文件(同样,使用Windows API)也可以工作,您可以按目录逐行检查是否存在,如果没有 - 返回错误。继续前进,直到你到达目录,然后按照上面提到的方式检查某个文件。

假设您有C:/Dir1/Dir2/Dir3/file.txt,那么您首先转到C:,然后检查Dir1是否存在,如果存在,请转到它,如果它不存在的话。 t返回错误。同样适用于Dir2等等,直到您到达最后一个目录并检查文件,或者如果您没有检查某个文件和任何项目 - 只需尝试使用{{中提到的功能1}}用于查找第一个文件或第一个目录。

答案 1 :(得分:1)

由于我们计划做的下一件事是在那个位置创建一些东西,并且因为如果那里已经存在某些东西我们想把它当作一个错误,那么让我们不要费心去检查。如果失败,只需尝试创建并退出错误。创建步骤使用symlink,因此如果失败,我们可以使用strerror(errno)来解释任何失败。

要创建一般文件(仅针对符号链接),EOF会在注释中指出open(path, O_CREAT|O_EXCL, mode)如果文件已存在则返回失败(-1),否则创建文件。这是原子的和安全的(与尝试stat不同)并保证在POSIX上原子工作(可能除了NFS)。