检查文件是否存在的最快方法
这个问题在这里已经有了答案:
在Windows上,有PathFileExists()。
在POSIX系统上,你有stat()或access()。
也就是说,如果您检查文件是否存在,因为您的代码需要该文件,这是错误的方法 - 文件系统超出了您的程序控制范围,所以这将是竞争条件,唯一正确的方法是正确在打开文件时处理错误。
你正在以错误的方式思考问题。 你不应该“检查一个文件是否已经存在”,因为它有一个固有的TOCTOU竞争 - 在你检查文件是否存在以及你对这些信息采取行动的时间之间,另一个进程可能会出现并改变该文件存在,使检查无效。
你做什么取决于你想知道的原因。 一种非常常见的情况是您只想创建文件(如果文件尚不存在),在这种情况下,您可以在O_EXCL
模式下使用较低级别的open
函数:
int fd = open("whatever", O_WRONLY|O_CREAT|O_EXCL, 0666);
if (fd == -1 && errno == EEXIST) {
/* the file already exists */
} else if (fd == -1) {
/* report that some other error happened */
} else {
FILE *fp = fdopen(fd, "w");
/* write data to fp here */
}
另一个非常常见的情况是,如果文件不存在,您想要创建该文件,或者如果该文件存在,则将新数据附加到该文件; 这可以通过"a"
模式来fopen
或O_APPEND
标志open
。