C/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
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
mode Value Checks File For 00 Existence only 02 Write permission 04 Read permission 06 Read and write permission
Example
/* 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 " ); /* Check for write permission */if( (_access( "ACCESS.C", 2 )) !=-1 ) printf( "File ACCESS.C has write permission " ); }}
Output
File ACCESS.C existsFile ACCESS.C has write permission
3.在windows平臺下用API函式FindFirstFile(...):
(1)檢查檔案是否存在:
#define _WIN32_WINNT 0x0400#include "windows.h"intmain(int argc, char*argv[]){ WIN32_FIND_DATA FindFileData; HANDLE hFind; printf ("Target file is %s. ", argv[1]); hFind = FindFirstFile(argv[1], &FindFileData); if (hFind == INVALID_HANDLE_VALUE) { printf ("Invalid File Handle. Get Last Error reports %d ", GetLastError ()); } else { printf ("The first file found is %s ", FindFileData.cFileName); FindClose(hFind); } return (0);}(2)檢查某一目錄是否存在:
///目錄是否存在的檢查:bool CheckFolderExist(conststring&strPath){ WIN32_FIND_DATA wfd; bool rValue =false; HANDLE hFind = FindFirstFile(strPath.c_str(), &wfd); if ((hFind != INVALID_HANDLE_VALUE) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) { rValue =true; } FindClose(hFind); return rValue;}4.使用boost的filesystem類庫的exists函式
#include <boost/filesystem/operations.hpp>#include <boost/filesystem/path.hpp>#include <boost/filesystem/convenience.hpp>int GetFilePath(std::string&strFilePath){ string strPath; int nRes =0; //指定路徑 strPath ="D:/myTest/Test1/Test2"; namespace fs = boost::filesystem; //路徑的可移植 fs::path full_path( fs::initial_path() ); full_path = fs::system_complete( fs::path(strPath, fs::native ) ); //判斷各級子目錄是否存在,不存在則需要建立if ( !fs::exists( full_path ) ) { // 建立多層子目錄bool bRet = fs::create_directories(full_path); if (false== bRet) { return-1; } } strFilePath = full_path.native_directory_string(); return0;}