C/C++遍曆目錄下的所有檔案(Windows/Linux篇,超詳細)

來源:互聯網
上載者:User

標籤:pre   wchar_t   否則   utc   子目錄   info   傳回值   api   長度   

前面的一篇文章我們講了用Windows API遍曆一個目錄下的所有檔案,這次我們講用一種Windows/Linux通用的方法遍曆一個目錄下的所有檔案。

 

Windows/Linux的IDE都會提供一個標頭檔——<io.h>。看名字,似乎是關於I/O的,但是實際上它還提供了類似於WIN32_FIND_DATA、FindFirstFile()、FindNextFile()和FindClose()的尋找檔案的功能。

 

_finddata_t結構

 

_finddata_t結構用來記錄尋找到的檔案的資訊。實際上有_finddata32_t、_finddata32i64_t、_finddata64i32_t、_finddata64_t、_wfinddata32_t、_wfinddata32i64_t、_wfinddata64i32_t、_wfinddata64_t八個結構,但都只是在32位/64位整數和字元類型上有所區別,但整體上相同。大致定義如下(MSDN):

 

struct _finddata_t{    unsigned attrib;    size_t time_create;    size_t time_access;    size_t time_write;    _fsize_t size;    char name[_MAX_PATH];};

 

對於不同的_finddata_t結構,time_create、time_access和time_write的類型為_time32_t或_time64_t,size的類型為_fsize_t或__int64,name為char[_MAX_PATH]或wchar_t[_MAX_PATH]。

 

attrib

 

unsigned類型,檔案屬性。

 

time_create

 

_time32_t/_time64_t類型,檔案建立時間(FAT檔案系統為-1)。以UTC格式儲存,如果需要轉換成當地時間,使用localtime_s()。

 

time_access

 

_time32_t/_time64_t類型,檔案最後一次被訪問的時間(FAT檔案系統為-1)。以UTC格式儲存,如果需要轉換成當地時間,使用localtime_s()。

 

time_write

 

_time32_t/_time64_t類型,檔案最後一次被寫入的時間。以UTC格式儲存,如果需要轉換成當地時間,使用localtime_s()。

 

size

 

_fsize_t/__int64類型,檔案的長度(以位元組為單位)。

 

name

 

char[_MAX_PATH]/wchar_t[_MAX_PATH]類型,檔案/目錄名,不包含路徑。

 

對於不支援檔案建立時間、檔案上一次訪問時間的檔案系統,time_create和time_access為-1。

 

_MAX_PATH在stdlib.h中被定義為260。

 

一般_finddata_t被定義為_finddata32_t/_finddata64i32_t,_wfinddata_t被定義為_wfinddata32_t/_wfinddata64i32_t。為方便,下文中將_finddata_t和_wfinddata_t統稱為_finddata_t。

 

檔案屬性常量

 

一個檔案/目錄可以有多種屬性,每種屬性可以是下面列出的屬性之一。

 

_A_ARCH

 

檔案。檔案被BACKUP指令改變或清除時被設定。值:0x20。

 

_A_HIDDEN

 

隱藏。使用DIR指令一般看不到,除非使用/AH選項。值:0x02。

 

_A_NORMAL

 

普通。檔案沒有更多屬性被設定,可以沒有限制地被讀或寫。值:0x00。

 

_A_RDONLY

 

唯讀。不能以“寫”為目的開啟該檔案,並且不能建立同名的檔案。值:0x01。

 

_A_SUBDIR

 

子目錄。值:0x10。

 

_A_SYSTEM

 

系統檔案。使用DIR指令一般看不見,除非使用/A或/A:S選項。值:0x04。

 

要檢查x是否含有某個屬性a,可以用x & a進行檢查。指定多個屬性可以使用按位or運算子,例如_A_SYSTEM |  _A_RDONLY | _A_HIDDEN。

 

萬用字元(wildcards)

 

遍曆檔案目錄時需要使用萬用字元,詳見<psg>。

 

_findfirst()/_findnext()/_findclose()函數

 

_findfirst()函數

 

intptr_t _findfirst(    const char * filespec,    struct _finddata_t *fileinfo);

 

實際上_findfirst()有10個版本,這裡只列出一個。

 

filespec

 

const char */const wchar_t *類型,目標檔案說明(可包含萬用字元)。

 

fileinfo

 

_finddata_t *類型,函數將會填入檔案/目錄資訊。

 

傳回值

 

如果成功,返回一個唯一的搜尋控制代碼標識一個或一組和filespec說明匹配的檔案,可以用於接下來的_findnext()和_findclose()函數。否則_findfirst()返回-1。注意,intptr_t並不是指標類型,只是int或__int64的typedef。

 

_findnext()函數

 

int _findnext(    intptr_t handle,    struct _finddata_t *fileinfo);

 

handle

 

intptr_t類型,搜尋控制代碼。

 

fileinfo

 

_finddata_t *類型,函數將會填入檔案/目錄資訊。

 

傳回值

 

如果成功,返回0,否則返回-1。如果沒有更多能夠找到的檔案了,也會導致失敗。

 

程式碼

 

C/C++遍曆目錄下的所有檔案(Windows/Linux篇,超詳細)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.