在C语言中检查文件是否存在

10

我正在尝试在C应用程序中打开一个文件。在尝试读取文件之前,我该如何检查该文件是否存在?


检查文件能否使用可移植的C语言打开 - Coren
6个回答

18
尝试打开它:
FILE * file;
file = fopen("file_name", "r");
if (file){
   //file exists and can be opened 
   //...
   // close file when you're done
   fclose(file);
}else{
   //file doesn't exists or cannot be opened (es. you don't have access permission)
}

1
“文件不存在” - 并不完全正确,它可能存在,但您没有权限打开它进行阅读。但是提问者可能确实需要知道他是否可以读取它,这就是这个信息告诉您的。 - Steve Jessop
1
当你完成文件操作时,也要记得使用 fclose(file) 关闭流(stream),如果它确实存在的话。当你只是想查看文件是否打开时,很容易忘记关闭流,但如果你不这样做,那么你的应用程序和其他应用程序都将无法打开该文件,直到你的应用程序退出等。这是为了防止多个程序同时对同一文件进行写操作,因为这样做没有任何意义。 - rsethc
1
第二行代码有一个多余的括号。 - colin-zhou

7
存在性:调用stat(),检查返回代码,它没有副作用。在UNIX上,也要调用access()
如果你只是想知道你所要求的文件是否存在,而不一定能否打开它,那么你可以这样做。例如,在UNIX中,一个具有仅执行权限的文件会打开失败,但仍然存在。
使用stat,你可以检查st_mode以进行访问。然而,由于你打算打开文件,fopenopen可能是你想要的。

1
状态?访问?打开?谁要求使用非标准的Unix函数?这个答案与主题无关。 - Lundin
4
他也没有要求非Unix标准的函数。这个答案很恰当。此外,它们在POSIX上都是标准函数,而POSIX本身就是一个标准。 - netcoder
1
@netcoder他做了。它被标记为C语言,因此我们必须假设OP正在寻求C语言函数。 C语言在ISO标准中定义,没有其他定义。 Posix是操作系统的标准,文件处理并不自动意味着涉及操作系统。 - Lundin
3
@Lundin:不要太过追求细节。你想得太多了。根据你的定义,那么很多标记为C的问题都不应该被标记,因为它们问的是“非C语言函数”,或者得到的是“非C语言函数”的答案。这太荒谬了。这个答案本身就是有用的。你好像并不完全理解投票权。 - netcoder
@Lundin:请把你的恶意评论带到别处。stat 并不是什么晦涩难懂的东西。Unix 不是 Stack Overflow 上首选的操作系统。但除非提问者要求特定操作系统,否则与最常用的操作系统(即 *NIX 和 Windows)相关的答案应该是很好的答案。 - netcoder

3
您可以像这样做:
bool file_exists(const char * filename) {
    if (FILE * file = fopen(filename, "r")) {
        fclose(file);
        return true;
    }
    return false;
}

基本上只需要打开文件并检查是否成功。

这样的函数存在的问题是,由于文件系统是一个全局可变资源,所以在关闭文件和返回之间出现错误的可能性。因此,当“在尝试从文件中读取之前检查文件是否存在”时,应尽可能使用与检查相同的文件句柄进行读取。存在一些情况,您的信息过时并不重要,在这种情况下,您也可以在可用时使用stat - Steve Jessop

2

您需要检查fopen的结果。

FILE *fp;

if (!(fp = fopen(name, "r"))) {
    perror("fopen");
    /* Handle error, return, exit, try again etc. */
}

/* Normal code goes on. */

如果fopen返回NULL,则文件由于某种原因不可访问。可能是缺失或者进程没有权限。

4
检查errno的值以了解fopen失败的原因;如果文件不存在,则为ENOENT - Fred Foo

1

测试文件是否存在并不太难。有许多方法可以做到这一点,但在阅读了相关资料后,我决定最好的方法是使用stat方法。我建议使用stat,因为我认为能够区分文件和目录非常重要。我建议在Windows和Unix上都使用。

这里提供了两个链接到MSDN和opengroup的文档。

Windows

Unix


0
你打开文件并检查fopen()open()的返回值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接