Qt遍歷資料夾

2021-07-04 08:29:06 字數 4608 閱讀 4348

關於qt操作資料夾、檔案的知識用途較多,比如遍歷下一層乃至所有子孫檔案、資料夾,獲取它們的一些資訊(大小、型別、最後更改時間等)。當然,也可以進行級聯刪除。

首先看簡單的:

一、qt遍歷資料夾下一層的檔案:

方式1:

void imagetree::

addfolderimages(qstring path)

dir.setfilter(qdir::files | qdir::nosymlinks);

qfileinfolist list = dir.entryinfolist();

int file_count = list.count();

if(file_count <= 0)  

qstringlist string_list;

for(int i=0; i  

} }分析:遍歷檔案的下一層,對於系統而言包括:資料夾、檔案、快捷方式,使用setfilter即可過濾。通過

entryinfolist則可以獲取過濾後所得到的資料夾下的檔案資訊列表,遍歷檔案通過操作qfileinfo可得到所需的檔案詳細資訊(大小、型別、字尾等)。

方式2:

void imagetree::addfolderimages(qstring path)

qstringlist filters;

filters<

dir.setfilter(qdir::files | qdir::nosymlinks); //設定型別過濾器,只為檔案格式

dir.setnamefilters(filters);  

//設定檔名稱過濾器,只為filters格式(字尾為.jpeg等格式)

int dir_count = dir.count();

if(dir_count <= 0)  

qstringlist string_list;

//獲取分隔符

//qchar separator = qdir::separator();

qchar separator = qchar('/');

if(!path.contains(separator))  

qchar last_char = path.at(path.length()-1);

if(last_char == separator)  

for(uint i=0; i  

//string_list 新增完成之後,就可以檢視list中的檔案路徑了 }

分析:setnamefilters顧名思義,就是過濾檔名稱的。如果只需要獲取指定路徑下的檔名,則可去掉「獲取分隔符」部分**(因為我是為了獲取檔案的全路徑)。

思考:qdir::separator()這是用於獲取分隔符的,除錯過程中發現path的分隔符為'/',奇怪的是獲取到的為'\\',剛好相反,所以我通過contains的方式獲取分隔符的(無非'/'與'\\')。

討論:如果設定filters後,那麼存在一定的問題。熟用windows的應該都知道,檔名是忽略大小寫的(包括副檔名),那麼若filters設定了「*.jpg」之後,則就不可新增擴充套件名為「.jpg」、「.jpg」等大小寫兼有的檔案了。

既然有問題,就有解決問題的方式。

1、問題**是由副檔名引起,那麼去掉setnamefilters(filters);

2、上述已經獲取檔案全路徑,那麼qfileinfo file_info(file_path)獲取檔案資訊的物件

3、通過file_info.suffix()或者completesuffix()來判定檔案的字尾、副檔名

4、獲取之後比較時忽略大小寫即可。如:qstring::compare(suffix, 

qstring("*.jpeg"), qt::caseinsensitive) == 0

二、級聯遍歷資料夾及其子孫資料夾中的檔案

方式1:

void imagetree::addsubfolderimages(qstring path)

//獲取所選檔案型別過濾器

qstringlist filters;

filters<

//定義迭代器並設定過濾器

qdiriterator dir_iterator(path,

filters,

qdir::files | qdir::nosymlinks,

qdiriterator::subdirectories);

qstringlist string_list;

while(dir_iterator.hasnext())  

} 分析:qdiriterator定義過程中可設定過濾器,包括:檔名稱、檔案型別等。dir_iterator.next()這句話很重要,如果缺少將會進入死迴圈!

方式2:

qstringlist string_list;

void imagetree::

addsubfolderimages(qstring path)

dir.setfilter(qdir::dirs | qdir::files 

| qdir::nosymlinks);

dir.setsorting(qdir::dirsfirst);

qfileinfolist list = dir.entryinfolist();

int i = 0;

bool is_dir;

do  

is_dir = 

file_info.isdir();

if(is_dir)  

else  

}i++;  }

while(i }

分析:此方式採用遞迴的思路解決,也是網上大多數人用的辦法,個人建議摒棄!遞迴的效率真心不敢接受,而且**看起來也費勁。

總結:通過以上兩種方式比較,關於遍歷子孫資料夾的方式,採用「方式1」較好。

關於qfileinfo獲取檔案資訊的方法可以檢視api

方法如下:

void setfile(const qstring &file);

void setfile(const qfile &file);

void setfile(const qdir &dir, const qstring &file);

bool exists() const;

void refresh();

qstring filepath() const;

qstring absolutefilepath() const;

qstring canonicalfilepath() const;

qstring filename() const;

qstring basename() const;

qstring completebasename() const;

qstring suffix() const;

qstring bundlename() const;

qstring completesuffix() const;

qstring path() const;

qstring absolutepath() const;

qstring canonicalpath() const;

qdir dir() const;

qdir absolutedir() const;

bool isreadable() const;

bool iswritable() const;

bool i***ecutable() const;

bool ishidden() const;

bool isnativepath() const;

bool isrelative() const;

inline bool isabsolute() const

bool makeabsolute();

bool isfile() const;

bool isdir() const;

bool issymlink() const;

bool isroot() const;

bool isbundle() const;

qstring readlink() const;

inline qstring symlinktarget() const

qstring owner() const;

uint ownerid() const;

qstring group() const;

uint groupid() const;

bool permission(qfile::permissions permissions) const;

qfile::permissions permissions() const;

qint64 size() const;

qdatetime created() const;

qdatetime lastmodified() const;

qdatetime lastread() const;

bool caching() const;

void setcaching(bool on);

更多關於獲取檔案圖示、型別的詳細資訊請檢視:

注:

╰☆奮鬥ing❤孩子`

原文:

QT 遍歷資料夾

qstring dir path e checked qdir dir dir path qfileinfolist fileinfolist dir.entryinfolist qdir files 設定過濾器 qdir files 得到該目錄下所有檔案 qdir dirs 得到該目錄下所有子資料...

Qt遞迴遍歷檔案和資料夾

遞迴遍歷資料夾,找到所有的檔案 filepath 要遍歷的資料夾的檔名 int findfile const qstring filepath 取到所有的檔案和檔名,但是去掉.和.的資料夾 這是qt預設有的 dir.setfilter qdir dirs qdir files qdir nodota...

遍歷資料夾

function search path string filename string ball boolean false string varsearchrec tsearchrec begin if findfirst path faanyfile,searchrec 0 then begin...