C 獲取資料夾中所有檔案

2022-08-04 09:54:10 字數 3127 閱讀 6175

獲取資料夾中的檔案,用到過很多次,每次用的時候都要去查下,很煩,所以想自己寫下,當然,借鑑了很多其他大佬的部落格

主要實現的函式,如下:

1

void getfiles( string path, vector&files ) 2

19else

20

23 }while(_findnext(hfile, &fileinfo) == 0

);

24_findclose(hfile);

25}

26 }

那麼到底如何查詢檔案呢?我們需要乙個結構體和幾個大家可能不太熟悉的函式。這些函式和結構體在的標頭檔案中,結構體為struct _finddata_t ,函式為_findfirst、_findnext和_fineclose。具體如何使用,我會慢慢講來~

首先講這個結構體吧~ struct _finddata_t ,這個結構體是用來儲存檔案各種資訊的。說實話,這個結構體的具體定義**,我沒有找到,不過還好,文件裡面在_find裡有比較詳細的成員變數介紹。我基本上就把文件翻譯過來講吧:

unsigned atrrib:檔案屬性的儲存位置。它儲存乙個unsigned單元,用於表示檔案的屬性。檔案屬性是用位表示的,主要有以下一些:_a_arch(存檔)、_a_hidden(隱藏)、_a_normal(正常)、_a_rdonly(唯讀)、_a_subdir(資料夾)、_a_system(系統)。

這些都是在中定義的巨集,可以直接使用,而本身的意義其實是乙個無符號整型(只不過這個整型應該是2的幾次冪,從而保證只有一位為1,而其他位為0)。既然是位表示,那麼當乙個檔案有多個屬性時,它往往是通過位或的方式,來得到幾個屬性的綜合。例如唯讀+隱藏+系統屬性,應該為:_a_hidden | _a_rdonly | _a_system 。

time_t time_create:這裡的time_t是乙個變數型別(長整型?相當於long int?),用來儲存時間的,我們暫時不用理它,只要知道,這個time_create變數是用來儲存檔案建立時間的就可以了。

time_t time_access:檔案最後一次被訪問的時間。

time_t time_write:檔案最後一次被修改的時間。

_fsize_t size:檔案的大小。這裡的_fsize_t應該可以相當於unsigned整型,表示檔案的位元組數。

char name[_max_fname]:檔案的檔名。這裡的_max_fname是乙個常量巨集,它在標頭檔案中被定義,表示的是檔名的最大長度。

以此,我們可以推測出,struct _finddata_t ,大概的定義如下

1

struct

_finddata32_t

2;

前面也說了,這個結構體是用來儲存檔案資訊的,那麼如何把乙個硬碟檔案的檔案資訊「存到」這個結構體所表示的記憶體空間裡去呢?這就要靠_findfirst、_findnext和_fineclose三個函式的搭配使用了。

首先還是對這三個函式一一介紹一番吧……

long _findfirst( char *filespec, struct _finddata_t *fileinfo );

返回值:如果查詢成功的話,將返回乙個long型的唯一的查詢用的控制代碼(就是乙個唯一編號)。這個控制代碼將在_findnext函式中被使用。若失敗,則返回-1。

引數:filespec:標明檔案的字串,可支援萬用字元。比如:*.c,則表示當前資料夾下的所有字尾為c的檔案。

fileinfo:這裡就是用來存放檔案資訊的結構體的指標。這個結構體必須在呼叫此函式前宣告,不過不用初始化,只要分配了記憶體空間就可以了。函式成功後,函式會把找到的檔案的資訊放入這個結構體中。

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

返回值:若成功返回0,否則返回-1。

引數:handle:即由_findfirst函式返回回來的控制代碼。

fileinfo:檔案資訊結構體的指標。找到檔案後,函式將該檔案資訊放入此結構體中。

int _findclose( long handle );

返回值:成功返回0,失敗返回-1。

引數:handle :_findfirst函式返回回來的控制代碼。

大家看到這裡,估計都能猜到個大概了吧?先用_findfirst查詢第乙個檔案,若成功則用返回的控制代碼呼叫_findnext函式查詢其他的檔案,當查詢完畢後用,用_findclose函式結束查詢。恩,對,這就是正確思路。

參考:下面來實現我想要的功能:

功能:上述getfiles()函式中求出的是檔案的全部路徑,而我想要的是從某個目錄(比如a/)之後的路徑

起初,感覺不就是現將a目錄儲存起來,再將後面的檔名拼接到一塊,但思路就是這麼明確,感覺這也沒什麼問題,卻去實現的時候,都是坑,最大的就是,將a/儲存起來,會將後面的檔案進行累加(如:第一次:a/1.jpg,第二次:a/1.jpg/2.jpg...),諸如此類,分析得到這是由於遞迴引起的,所以不能在遞迴中簡單的進行儲存操作。

也是經高人指點,產生如下**:

1

//lpath 用於儲存所在資料夾的名字

2void getfiles(string path, vector &files, string

lpath)325

}26else

2731 } while (_findnext(hfile, &fileinfo) == 0

);32

_findclose(hfile);33}

3435 }

一直覺的上述方法讀取方法太麻煩,偶然的機會發現了可以借助opencv可以更簡單的實現這一功能

python下遍歷資料夾中所有檔案

python下遍歷某個路徑所有檔案是很常用的事,一直對其有所困擾,今天想明白了之後記錄下來,供以後查閱。首先,資料夾是這樣的 a,b,c是各包含一張jpg的資料夾,其餘是4張jpg。遍歷資料夾的方法首先需要呼叫os庫,即 import os 然後使用 os.walk path path是指想遍歷資料...

定時複製遠端資料夾中所有檔案(Python)

import os,shutil,sys import threading import configparser import datetime 複製檔案 def remote copy src path,dst path start time datetime.datetime.now prin...

刪除資料夾及其子資料夾中所有tmp字尾的檔案

option explicit const window handle 0 const options 0 const file type tmp if vartype objfolder vbstring then dim fso set fso createobject scripting.fi...