C/C++中判断某一文件或目录是否存在

时间:2021-12-01 18:37:37
 1 //1.C++很简单的一种办法:
2 #include <iostream>
3 #include <fstream>
4 using namespace std;
5 #define FILENAME "stat.dat"
6 int main()
7 {
8 fstream _file;
9 _file.open(FILENAME,ios::in);
10 if(!_file)
11 {
12 cout<<FILENAME<<"没有被创建";
13 }
14 else
15 {
16 cout<<FILENAME<<"已经存在";
17 }
18 return 0;
19 }
2.利用 c 语言的库的办法: 
函数名: access
功 能: 确定文件的访问权限
用 法:
int access(const char *filename, int amode);
以前一直没用过这个函数,今天调试程序发现了这个函数,感觉挺好用,尤其是判断一个文件或文件夹是否存在的时候,用不着再find了,文件的话还可以检测读写权限,文件夹的话则只能判断是否存在,下面摘自MSDN:

int _access( const char *path, int mode );

Return Value

Each of these functions returns
0 if the file has the given mode. The function returns –1 if the named file does not exist or is not accessible in the given mode; in this case, errno is set as follows:

EACCES

Access denied: file’s permission setting does not allow specified access.

ENOENT

Filename or path not found.

Parameters

path

File or directory path

mode

Permission setting

Remarks

When used with files, the _access function determines whether the specified file exists and can be accessed
as specified by the value of mode. When used with directories, _access determines only whether the specified directory exists; in Windows NT, all directories have read and write access.

mode Value Checks File For
00 Existence only
02 Write permission
04 Read permission
06 Read and write permission
 1 //Example
2 /* ACCESS.C: This example uses _access to check the * file named "ACCESS.C" to see if it exists and if * writing is allowed. */
3 #include <io.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 void main( void )
7 {
8 /* Check for existence */
9 if( (_access( "ACCESS.C", 0 )) != -1 )
10 { printf( "File ACCESS.C exists " );
11 /* Check for write permission */
12 if( (_access( "ACCESS.C", 2 )) != -1 )
13 printf( "File ACCESS.C has write permission " );
14 }
15 }
16
17 /*
18 Output
19 File ACCESS.C existsFile ACCESS.C has write permission
20 */
 1 //3.在windows平台下用API函数FindFirstFile(...):
2
3 //(1)检查文件是否存在:
4 #define _WIN32_WINNT 0x0400
5
6 #include "windows.h"
7
8 int main(int argc, char *argv[])
9 {
10 WIN32_FIND_DATA FindFileData;
11 HANDLE hFind;
12
13 printf ("Target file is %s. ", argv[1]);
14
15 hFind = FindFirstFile(argv[1], &FindFileData);
16
17 if (hFind == INVALID_HANDLE_VALUE) {
18 printf ("Invalid File Handle. Get Last Error reports %d ", GetLastError ());
19 } else {
20 printf ("The first file found is %s ", FindFileData.cFileName);
21 FindClose(hFind);
22 }
23
24 return (0);
25 }
 1 ///2目录是否存在的检查:
2 bool CheckFolderExist(const string &strPath)
3 {
4 WIN32_FIND_DATA wfd;
5 bool rValue = false;
6 HANDLE hFind = FindFirstFile(strPath.c_str(), &wfd);
7 if ((hFind != INVALID_HANDLE_VALUE) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
8 {
9 rValue = true;
10 }
11 FindClose(hFind);
12 return rValue;
13 }
 1 //4.使用boost的filesystem类库的exists函数
2 #include <boost/filesystem/operations.hpp>
3 #include <boost/filesystem/path.hpp>
4 #include <boost/filesystem/convenience.hpp>
5
6 int GetFilePath(std::string &strFilePath)
7 {
8 string strPath;
9 int nRes = 0;
10
11 //指定路径
12 strPath = "D:/myTest/Test1/Test2";
13 namespace fs = boost::filesystem;
14
15 //路径的可移植
16 fs::path full_path( fs::initial_path() );
17 full_path = fs::system_complete( fs::path(strPath, fs::native ) );
18 //判断各级子目录是否存在,不存在则需要创建
19 if ( !fs::exists( full_path ) )
20 {
21 // 创建多层子目录
22 bool bRet = fs::create_directories(full_path);
23 if (false == bRet)
24 {
25 return -1;
26 }
27
28 }
29 strFilePath = full_path.native_directory_string();
30
31 return 0;
32 }