關於C++中如何判斷檔案、目錄存在的若干方法
在我們平時的程式設計中,經常需要判斷檔案或者目錄是否存在,相對來說判斷檔案存在比較簡單,判斷目錄存在則比較複雜。
下面就詳細的介紹幾種方法。
首先,關於判斷檔案存在的方法:
一、ifstream輸入流
在C++中,可以利用ifstream檔案輸入流,當我們直接使用ifstream來建立檔案輸入流的時候,如果檔案不存在則流建立失敗。
ifstream fin("hello.txt");if (!fin)
{
std::cout <<"can not open this file"<< endl;
}
這是c++中最常用的方式,這種方式在windows平臺和linux平臺都是可行的。
二、File檔案控制代碼
C中也是同樣道理,我們可使用File的相關操作。
File* fh = fopen("hello","r");if(fh == NULL)
{
printf("%s","can not open the file");
}
這是方式在c++中也是常用的,這種方式在windows平臺和linux平臺都是可行的。
三、直接呼叫c的函式庫
3.1 _access函式: 在windows平臺,直接呼叫c函式庫中的_access函式。
就是函式 int _access(const char* path,int mode);
或者 int _waccess(const char* path,int mode);
_waccess是_access的寬字元版本,_waccess的引數path為寬字元的字串,其他與_access相同。
這個函式的功能十分強大,其標頭檔案為#include <io.h>。
引數含義:path表示檔案或目錄的路徑;mode表示訪問許可權。返回值:如果檔案具有指定的訪問許可權,則函式返回0;如果檔案不存在,或者沒有訪問指定的許可權,則返回-1。
備註:當path為檔案時,_access函式判斷檔案是否存在,並判斷檔案是否可以用mode值指定的模式進行訪問。當path為目錄時,_access只判斷指定的目錄是否存在,在WindowsNT和Windows2000中,所有的目錄都有讀寫許可權。mode的值和含義如下表所示:
mode值 |
檢查檔案 |
00 |
只檢查檔案是否存在 |
02 |
寫許可權 |
04 |
讀許可權 |
06 |
讀寫許可權 |
可以看看msdn的詳細介紹。
#include <io.h>#include <stdio.h>
#include <stdlib.h>int main( void )
{
// Check for existence.if( (_access( "crt_ACCESS.C", 0 )) !=-1 )
{
printf_s( "File crt_ACCESS.C exists.\n" );
// Check for write permission.
// Assume file is read-only.if( (_access( "crt_ACCESS.C", 2 )) ==-1 )
printf_s( "File crt_ACCESS.C does not have write permission.\n" );
}
}
3.2 access()函式:在linux平臺,直接呼叫c函式庫中的access函式。
#include
<unistd.h>
#include <fcntl.h>
int access(const char *pathname, int mode);
引數:
pathname: 需要測試的檔案路徑名或目錄名稱。
mode: 需要測試的操作模式,可能值是一個或多個R_OK(可讀?)、W_OK(可寫?)、X_OK(可執行?) 或 F_OK(檔案存在?)組合體。
返回說明:
成功執行時,返回0。失敗返回-1,errno被設為以下的某個值:
EINVAL: 模式值無效
EACCES: 檔案或路徑名中包含的目錄不可訪問
ELOOP : 解釋路徑名過程中存在太多的符號連線
ENAMETOOLONG:路徑名太長
ENOENT: 路徑名中的目錄不存在或是無效的符號連線
ENOTDIR: 路徑名中當作目錄的元件並非目錄
EROFS: 檔案系統只讀
EFAULT: 路徑名指向可訪問的空間外
EIO: 輸入輸出錯誤
ENOMEM: 不能獲取足夠的核心記憶體
ETXTBSY:對程式寫入出錯
示例程式碼:
#include<unistd.h>
int main()
{
if
(access(“/etc/passwd”,R_OK) = =0)
printf(“/etc/passwd
can be read\n”);
}
這三種方式算是判斷檔案存在比較簡單快捷的方法了。
然後,關於判斷目錄存在的方法:
一、在windows平臺上判斷目錄存在的方法
1.1 FindFirstFile 函式
在C++中可以呼叫系統的一些函式,但這種方法稍微顯得複雜一些。
WIN32_FIND_DATA wfd;bool rValue =false;
HANDLE hFind = FindFirstFile(strPath.c_str(), &wfd);
if ((hFind != INVALID_HANDLE_VALUE) && (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
{
std::cout <<"this file exists"<< endl;
}
FindClose(hFind);
1.2 _stat() 函式
現在介紹一個輕量級的方法:在windows中可以使用_stat() 函式。
宣告:int _stat(const char* path, struct _stat* buffer);
這個函式使用起來非常方便,如下:
struct _stat fileStat;if ((_stat(dir.c_str(), &fileStat) ==0) && (fileStat.st_mode & _S_IFDIR))
{
isExist =true;
}
_S_IFDIR 是一個標誌位,如果是目錄的話,該位就會被系統設定。
1.3 _access()
函式
見關於判斷檔案存在的方法之3.1節。
二、在linux平臺上判斷目錄存在的方法
2.1 函式stat()
使用方法與windows平臺下基本相同:
struct stat fileStat;if ((stat(dir.c_str(), &fileStat) ==0) && S_ISDIR(fileStat.st_mode))
{
isExist =true;
}
唯一不同的地方我使用了一個macro, S_ISDIR來判斷檔案是否存在,原理實際都一樣的。
2.2 access()函式
見關於判斷檔案存在的方法之3.1節。
上面就是自己使用過的幾種判斷檔案和目錄存在性的一些經驗了,希望對大家有所幫助。