C 如何检测文件是否存在?

C 如何检测文件是否存在?,c,windows,filesystems,C,Windows,Filesystems,我正在用C语言编程,并试图编写可移植代码 我的问题是,如何判断文件是否存在并且可读 我目前正在使用代码: f = fopen(filename, "r"); if (f) printf("File exists!"); 在我的程序中,filename是由用户设置的,应该被视为不可信的输入(例如,filename可能被恶意创建) 我的问题是上面的代码不够健壮。例如,在文件名为“PRN”的windows上使用时,即使文件系统中不存在这样的文件,也会打印“文件存在!” 我知道我可以过滤掉

我正在用C语言编程,并试图编写可移植代码

我的问题是,如何判断文件是否存在并且可读

我目前正在使用代码:

   f = fopen(filename, "r");
   if (f) printf("File exists!");
在我的程序中,
filename
是由用户设置的,应该被视为不可信的输入(例如,
filename
可能被恶意创建)

我的问题是上面的代码不够健壮。例如,在文件名为“PRN”的windows上使用时,即使文件系统中不存在这样的文件,也会打印“文件存在!”

我知道我可以过滤掉Windows上保留的文件名,因为只有十几个,但这感觉像是黑客攻击。而且,我只知道我知道的。也许还有其他我不知道的“保留”或“特殊”的名字

是否有任何简单且可移植的方法来确定文件是否存在于C中


或者,如果我必须使用OS API,我应该使用哪个函数?

仅供参考:可移植代码是一个神话。有些应用程序移植成功,但实际上没有所谓的通用可移植性。尝试打开文件是查看文件是否可以打开的最可靠和可移植的方法之一。它通常不受诸如使用
access()
stat()
lstat()
等替代方法容易受到的TOCTOU(检查时间、使用时间)攻击的影响。这些替代方案是特定于POSIX的,这可能会限制它们对您的用处。您可能需要一个,也可能是
GetFileAttributes*
系列中的一个。@jim不,当文件不存在时,fopen不会神奇地成功。要么文件存在(尝试使用绝对路径),要么代码是brken(然后显示MCVE)。@Tom's你读过问题了吗?Windows具有保留的文件名。如果您在Windows上使用
fopen(“COM1.jpg”,“r”)
,它将打开一条通向串行端口的管道。文件
COM1.jpg
不(实际上不允许)作为实际文件存在。