有没有比简单地尝试打开文件更好的方法?
int exists(const char *fname) { FILE *file; if ((file = fopen(fname, "r"))) { fclose(file); return 1; } return 0; }
Graeme Perro.. 542
查找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(成功),因为该文件没有设置只读属性,但您仍然可能没有写入该文件的权限.
查找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(成功),因为该文件没有设置只读属性,但您仍然可能没有写入该文件的权限.
像这样使用stat:
bool file_exist (char *filename) { struct stat buffer; return (stat (filename, &buffer) == 0); }
并称之为:
if (file_exist ("myfile.txt")) { printf ("It exists\n"); }
通常,当您想要检查文件是否存在时,这是因为您希望创建该文件(如果不存在).Graeme Perrow的答案很好,如果您不想创建该文件,但如果您这样做,它很容易受到竞争条件的影响:另一个进程可以在您检查文件是否存在之间创建文件,并且实际打开它以写入文件.(不要笑...... 如果创建的文件是符号链接,这可能会带来严重的安全隐患!)
如果你想检查是否存在并创建文件(如果它不存在),原子级以便没有竞争条件,那么使用:
#include#include fd = open(pathname, O_CREAT | O_WRONLY | O_EXCL, S_IRUSR | S_IWUSR); if (fd < 0) { /* failure */ if (errno == EEXIST) { /* the file already existed */ ... } } else { /* now you can use the file */ }
是.使用stat().见链接.
如果文件不存在,Stat将失败,否则很可能成功.如果它确实存在,但您对它所在的目录没有读取权限,它也将失败,但在这种情况下,任何方法都将失败(如何根据访问权限检查您可能看不到的目录内容?简单地说,你不能).
哦,正如其他人提到的,你也可以使用access().但是我更喜欢stat(),就好像文件存在一样,它会立即为我提供大量有用的信息(上次更新时间,有多大,拥有该文件的所有者和/或组,访问权限等) .
FILE *file; if((file = fopen("sample.txt","r"))!=NULL) { // file exists fclose(file); } else { //File not found, no memory leak since 'file' == NULL //fclose(file) would cause an error }
从Visual C++的帮助,我倾向于使用
/* ACCESS.C: This example uses _access to check the * file named "ACCESS.C" to see if it exists and if * writing is allowed. */ #include#include #include void main( void ) { /* Check for existence */ if( (_access( "ACCESS.C", 0 )) != -1 ) { printf( "File ACCESS.C exists\n" ); /* Check for write permission */ if( (_access( "ACCESS.C", 2 )) != -1 ) printf( "File ACCESS.C has write permission\n" ); } }
还值得注意_accesss的模式值(const char*path,int mode)
00仅存在
02写权限
04阅读权限
06读写权限
因为你的fopen可能会在文件存在但无法按要求打开的情况下失败.
编辑:请阅读Mecki的帖子. stat()确实看起来像一个更简洁的方式.哼哼.