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

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

当前回答

从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" );
   }
}

同样值得注意的是_access的模式值(const char *path,int模式):

00:只存在 02:写权限 04:读权限 06:读写权限

因为在文件存在但无法按要求打开的情况下,fopen可能会失败。

编辑:看看Mecki的帖子就知道了。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  <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" );
   }
}

同样值得注意的是_access的模式值(const char *path,int模式):

00:只存在 02:写权限 04:读权限 06:读写权限

因为在文件存在但无法按要求打开的情况下,fopen可能会失败。

编辑:看看Mecki的帖子就知道了。Stat()看起来确实是一种更整洁的方式。何鸿燊的嗡嗡声。

您可以使用realpath()函数。

resolved_file = realpath(file_path, NULL);
if (!resolved_keyfile) {
   /*File dosn't exists*/
   perror(keyfile);
   return -1;
}

是的。使用stat()。请参阅forstat(2)的手册页。

如果文件不存在,Stat()将失败,否则很可能成功。如果它确实存在,但是您对它所在的目录没有读访问权,那么它也会失败,但在这种情况下,任何方法都将失败(您如何根据访问权限检查可能看不到的目录的内容?很简单,你不能)。

哦,正如其他人提到的,您还可以使用access()。然而,我更喜欢stat(),因为如果文件存在,它会立即为我提供许多有用的信息(它最后一次更新是什么时候,它有多大,拥有文件的所有者和/或组,访问权限,等等)。

我认为在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