Qt之遍歷資料夾(經典詳解)

2021-06-29 07:40:44 字數 4451 閱讀 3546

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

} }

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);

原文:

Qt之遍歷資料夾(經典詳解)

關於qt操作資料夾 檔案的知識用途較多,比如遍歷下一層乃至所有子孫檔案 資料夾,獲取它們的一些資訊 大小 型別 最後更改時間等 當然,也可以進行級聯刪除。首先看簡單的 一 qt遍歷資料夾下一層的檔案 方式1 void imagetree addfolderimages qstring path di...

Qt遍歷資料夾

關於qt操作資料夾 檔案的知識用途較多,比如遍歷下一層乃至所有子孫檔案 資料夾,獲取它們的一些資訊 大小 型別 最後更改時間等 當然,也可以進行級聯刪除。首先看簡單的 一 qt遍歷資料夾下一層的檔案 方式1 void imagetree addfolderimages qstring path di...

QT 遍歷資料夾

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