文件存在吗?

进行文件读取的时候,经常要判断文件是否存在。
以下代码实现了 Visual C++,GCC 不同编译器的处理。 
当然,如果有更多不同平台的代码,为了能更好的维护,将程序放到不同的文件里,然后预编译(precompile)。 
除了打开、关闭、读写文件,关于文件的其他操作(新建文件夹、移动、创建软链接等),C++ 还没有纳入标准,不知道C++17 会不会加入。想要跨平台的话,可以使用 boost::filesystem。这里是 std::experimental::filesystem,很多东西是从 boost 借鉴学来的。这里 http://en.cppreference.com/w/cpp/experimental/fs/exists 是判断文件是否存在的函数。

Windows 上判断一个文件是否存在,只要看 FILE 是否能以 read 方式打开。打开再关闭,效率低下。
Linux 上有所不同,因为存在 Readable | Writable | eXcutable 权限的问题。如果 FILE 存在但没有可读权限,以上面方式判断是错误的。Windows 上的文件在 Linux 里全是可读可写可执行的,这时,需要使用 access 函数了,该函数需要 #include <unistd.h>,access 函数的介绍在这里

C code snippet 如下:

#include <stdio.h>

#ifdef __GNUC__
#include <unistd.h>

bool exist(char* filename)
{
if(access(filename,F_OK)==0)
return true; // file exists!
return false;
}

#elif defined _WIN32

bool exist(char* filename)
{
FILE* pf=fopen(filename,"r");
if(!pf)
{
fclose(pf);
return true;
}
else
return false;
}

#else
#error Unknown compiler!

#endif


int main(int argc,char* argv[])
{
if(argc!=2)
  {
    printf("Implimentation: To judge whether the list file exists.\n")
    return 0;
  } 
    if(exist(argv[1]))
printf("File <%s> exists!\n",argv[1]);
else
printf("File <%s> doesn't exist!\n",argv[1]);

return 0;
}



posted @ 2011-12-17 20:59  KAlO2  阅读(1369)  评论(0编辑  收藏  举报