检查C中是否存在文件的最佳方法是什么?

检查C中是否存在文件的最佳方法是什么?

有比简单地打开文件更好的方法吗?

int exists(const char *fname){
    FILE *file;
    if ((file = fopen(fname, "r")))
    {
        fclose(file);
        return 1;
    }
    return 0;}


慕仙森
浏览 1056回答 3
3回答

炎炎设计

查找access()功能,在unistd.h..您可以用if( access( fname, F_OK ) != -1 ) {     // file exists} else {     // file doesn't exist}您也可以使用R_OK, W_OK,和X_OK代替F_OK要检查读取权限、写权限和执行权限(分别),而不是是否存在,您可以同时检查其中的任何一个(即检查这两个读取权限)。和使用R_OK|W_OK)更新:请注意,在Windows上,您不能使用W_OK为了可靠地测试写权限,因为访问函数不考虑DACL。access( fname, W_OK )可能返回0(成功),因为该文件没有只读属性集,但您可能仍然没有写入该文件的权限。

慕尼黑8549860

这样使用STAT:int file_exist (char *filename){   struct stat   buffer;      return (stat (filename, &buffer) == 0);}就这样叫它:if (file_exist ("myfile.txt")){   printf ("It exists\n");}

回首忆惘然

通常,当您想要检查文件是否存在时,这是因为您想创造如果不是的话,那份文件。格雷姆·珀罗的答案是好的,如果你别想要创建该文件,但如果要创建该文件,则很容易受到竞争条件的影响:另一个进程可以在您之间创建该文件,检查它是否存在,然后实际打开该文件以便将其写入该文件。(别笑.这可能是坏的如果创建的文件是一个符号链接,则会产生安全问题!)如果你想确认是否存在和如果该文件不存在,则创建该文件,原子化这样就没有比赛条件,然后使用以下方法:#include&nbsp;<fcntl.h>#include&nbsp;<errno.h>fd&nbsp;=&nbsp;open(pathname,&nbsp;O_CREAT&nbsp;|&nbsp;O_WRONLY&nbsp;|&nbsp;O_EXCL,&nbsp;S_IRUSR&nbsp;|&nbsp;S_IWUSR);if&nbsp;(fd&nbsp;<&nbsp;0)&nbsp;{ &nbsp;&nbsp;/*&nbsp;failure&nbsp;*/ &nbsp;&nbsp;if&nbsp;(errno&nbsp;==&nbsp;EEXIST)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;/*&nbsp;the&nbsp;file&nbsp;already&nbsp;existed&nbsp;*/ &nbsp;&nbsp;&nbsp;&nbsp;... &nbsp;&nbsp;}}&nbsp;else&nbsp;{ &nbsp;&nbsp;/*&nbsp;now&nbsp;you&nbsp;can&nbsp;use&nbsp;the&nbsp;file&nbsp;*/}
打开App,查看更多内容
随时随地看视频慕课网APP