有没有比简单地尝试打开文件更好的方法?
int exists(const char *fname)
{
FILE *file;
if ((file = fopen(fname, "r")))
{
fclose(file);
return 1;
}
return 0;
}
答案 0 :(得分:515)
查找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(成功),因为该文件没有设置只读属性,但您仍然没有权限写入该文件。
答案 1 :(得分:102)
使用这样的数据:
int file_exist (char *filename)
{
struct stat buffer;
return (stat (filename, &buffer) == 0);
}
并将其称为:
if (file_exist ("myfile.txt"))
{
printf ("It exists\n");
}
答案 2 :(得分:74)
通常,当您想要检查文件是否存在时,这是因为您希望创建该文件(如果不存在)。 Graeme Perrow的答案很好,如果你不想要创建该文件,但是如果你这样做,它很容易受到竞争条件的影响:另一个进程可以在你检查它是否存在之间创建文件,而你实际打开它写入它。 (不要笑......如果创建的文件是符号链接,这可能会导致错误安全隐患!)
如果你想检查是否存在和创建文件,如果它不存在,原子,以便没有竞争条件,那么使用:
#include <fcntl.h>
#include <errno.h>
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 */
}
答案 3 :(得分:28)
是。使用stat()。请参阅link。
如果文件不存在,Stat将失败,否则很可能成功。如果它确实存在,但您对它所在的目录没有读取权限,它也将失败,但在这种情况下,任何方法都将失败(如何根据访问权限检查您可能看不到的目录内容?简单来说,你不能)。
哦,正如其他人提到的,你也可以使用access()。但是我更喜欢stat(),就好像文件存在一样,它会立即为我提供大量有用的信息(上次更新时间,有多大,拥有该文件的所有者和/或组,访问权限等)
答案 4 :(得分:8)
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
}
答案 5 :(得分:5)
从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 <io.h>
#include <stdio.h>
#include <stdlib.h>
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()确实看起来更简洁。哼哼。
答案 6 :(得分:3)
我认为unistd.h
中的access()函数是Linux
的不错选择(您也可以使用stat)。
你可以像这样使用它:
#include <stdio.h>
#include <stdlib.h>
#include<unistd.h>
void fileCheck(const char *fileName);
int main (void) {
char *fileName = "/etc/sudoers";
fileCheck(fileName);
return 0;
}
void fileCheck(const char *fileName){
if(!access(fileName, F_OK )){
printf("The File %s\t was Found\n",fileName);
}else{
printf("The File %s\t not Found\n",fileName);
}
if(!access(fileName, R_OK )){
printf("The File %s\t can be read\n",fileName);
}else{
printf("The File %s\t cannot be read\n",fileName);
}
if(!access( fileName, W_OK )){
printf("The File %s\t it can be Edited\n",fileName);
}else{
printf("The File %s\t it cannot be Edited\n",fileName);
}
if(!access( fileName, X_OK )){
printf("The File %s\t is an Executable\n",fileName);
}else{
printf("The File %s\t is not an Executable\n",fileName);
}
}
您将获得以下输出:
The File /etc/sudoers was Found
The File /etc/sudoers cannot be read
The File /etc/sudoers it cannot be Edited
The File /etc/sudoers is not an Executable
答案 7 :(得分:3)
您可以使用realpath()函数。
resolved_file = realpath(file_path, NULL);
if (!resolved_keyfile) {
/*File dosn't exists*/
perror(keyfile);
return -1;
}
答案 8 :(得分:0)
我不记得从作业中得到的信息(我通常将粘贴的URL复制到我发现的位置,以一种简单的引用形式),而且我无法解读结尾的Acompany-jobforprocess-cancel-null
是什么。尽管我最好的猜测是将对文件的任何引用都设置为0是多余的。
(file) = 0
#define fclose(file) ((file) ? fclose(file) : 0, (file) = 0)
(如果指针声明为:
file
答案 9 :(得分:-1)
对于Windows,请检查以下功能: 处理FindFirstFile(...);