1. 程式人生 > >關於C++中如何判斷檔案、目錄存在的若干方法

關於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節。

上面就是自己使用過的幾種判斷檔案和目錄存在性的一些經驗了,希望對大家有所幫助。