使用C++遍歷資料夾/目錄
編寫程式遍歷資料夾及其子資料夾下所有檔案,並輸出到標準輸出流或者檔案流。
- 先考慮在單層目錄下,遍歷所有檔案。以C:\WINDOWS為例:
用到資料結構_finddata_t,檔案資訊結構體的指標。
struct _finddata_t
{
unsigned attrib; //檔案屬性
time_t time_create; //檔案建立時間
time_t time_access; //檔案上一次訪問時間
time_t time_write; //檔案上一次修改時間
_fsize_t size; //檔案位元組數
char name[_MAX_FNAME]; //檔名
};
檔案屬性是無符號整數,取值為相應的巨集:_A_ARCH(存檔),_A_SUBDIR(資料夾),_A_HIDDEN(隱藏),_A_SYSTEM(系統),_A_NORMAL(正常),_A_RDONLY(只讀)。容易看出,通過這個結構體,我們可以得到關於該檔案的很多資訊。結合以下函式,我們可以將檔案資訊儲存到這個結構體中:
//按FileName命名規則匹配當前目錄第一個檔案
_findfirst(_In_ const char * FileName, _Out_ struct _finddata64i32_t * _FindData);
//按FileName命名規則匹配當前目錄下一個檔案
_findnext(_In_ intptr_t _FindHandle, _Out_ struct _finddata64i32_t * _FindData);
//關閉_findfirst返回的檔案控制代碼
_findclose(_In_ intptr_t _FindHandle);
_findfirst 函式返回的是匹配到檔案的控制代碼,資料型別為long。遍歷過程可以指定檔案型別,這通過FileName的賦值來實現,例如要遍歷C:\WINDOWS下的所有.exe檔案
bool transfer(string fileName = "C:\\Windows\\*.exe", int exeNum = 0)
{
_finddata_t fileInfo;
long handle = _findfirst(fileName.c_str(), &fileInfo);
if (handle == -1L)
{
cerr << "failed to transfer files" << endl;
return false;
}
do
{
exeNum ++;
cout << fileInfo.name <<endl;
} while (_findnext(handle, &fileInfo) == 0);
cout << " .exe files' number: " << exeNum << endl;
return true;
}
- 遍歷資料夾及其子資料夾下所有檔案。作業系統中資料夾目錄是樹狀結構,使用深度搜索策略遍歷所有檔案。用到_A_SUBDIR屬性,可執行程式如下:
void dfsFolder(string folderPath, ofstream &fout)
{
_finddata_t FileInfo;
string strfind = folderPath + "\\*";
long Handle = _findfirst(strfind.c_str(), &FileInfo);
if (Handle == -1L)
{
cerr << "can not match the folder path" << endl;
exit(-1);
}
do{
//判斷是否有子目錄
if (FileInfo.attrib & _A_SUBDIR)
{
//這個語句很重要
if( (strcmp(FileInfo.name,".") != 0 ) &&(strcmp(FileInfo.name,"..") != 0))
{
string newPath = folderPath + "\\" + FileInfo.name;
dfsFolder(newPath, fout);
}
}
else
{
fout << folderPath << "\\" << FileInfo.name << " ";
}
}while (_findnext(Handle, &FileInfo) == 0);
_findclose(Handle);
fout.close();
}
在判斷有無子目錄的if分支中,由於系統在進入一個子目錄時,匹配到的頭兩個檔案(夾)是”.”(當前目錄),”..”(上一層目錄)。需要忽略掉這兩種情況。當需要對遍歷到的檔案做處理時,在else分支中新增相應的程式碼就好.
函式簡介:
函式名稱:_findfirst
函式功能:搜尋與指定的檔名稱匹配的第一個例項,若成功則返回第一個例項的控制代碼,否則返回-1L
- 函式原型:long _findfirst( char *filespec, struct _finddata_t *fileinfo );
- 標頭檔案:io.h
程式舉例:
#include<io.h>
#include<stdio.h>
int main()
{
long Handle;
struct _finddata_t FileInfo;
if((Handle=_findfirst("D:\\*.txt",&FileInfo))==-1L)
printf("沒有找到匹配的專案\n");
else
{
printf("%s\n",FileInfo.name);
while( _findnext(Handle,&FileInfo)==0)
printf("%s\n",FileInfo.name);
_findclose(Handle);
}
return 0;
}
Linux下的FindFirst
在linux作業系統下,編譯器用FindFirst(),而不是_findfirst().
相關推薦
使用C++遍歷資料夾/目錄
編寫程式遍歷資料夾及其子資料夾下所有檔案,並輸出到標準輸出流或者檔案流。 先考慮在單層目錄下,遍歷所有檔案。以C:\WINDOWS為例: 用到資料結構_finddata_t,檔案資訊結構體的指標。 struct _finddata_t {
c#遍歷資料夾獲得所有檔案
c#遍歷資料夾獲得所有檔案 在c#中,想要獲得一個資料夾下的所有子目錄以及檔案十分簡單。 首先,獲取目錄的情況下,DirectoryInfo.GetDirectories():獲取目錄(不包含子目錄)的子目錄,返回型別為DirectoryInfo[],支援萬用字元查詢; 其次,獲取檔案的
【python高階程式設計】一、遍歷資料夾目錄
前言 如何遍歷查找出某個資料夾內所有的子檔案呢?並且找出某個字尾的所有檔案 walk功能簡介 1.os.walk() 方法用於通過在目錄樹種遊走輸出在目錄中的檔名,向上或者向下。 2.walk()方法語法格式如下: os.walk(top,topdown=True,onerr
【筆記】window下 使用c++遍歷資料夾及其子資料夾和檔案,並列印檔案路徑及各檔案內容
這兩天一直在學習如何使用c++遍歷資料夾、讀取檔案內容和寫入檔案。 話不多說,直接上程式碼 /** 檔案功能:遞迴遍歷資料夾,遍歷資料夾及其子資料夾和檔案.列印資料夾名稱、檔名稱和檔案數目*** 參考:https://www.cnblogs.com/collectionne/p/679230
WIN32 C++ 遍歷資料夾
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
C++遍歷資料夾下所有的wav檔案(支援windows和Linux)
直接上程式碼: #include <iostream> #include <string> #include <vector> #include <fstream> #include <string.h> #includ
C/C++遍歷資料夾和檔案
庫函式 包含標頭檔案 #include 用到資料結構_finddata_t,檔案資訊結構體的指標。 struct _finddata_t { unsigned attrib; //檔案屬性 time_t time_c
C++遍歷資料夾中的檔案並把結果儲存到csv中
StaDir.h檔案 #pragma once #include "browsedir.h" class CStaDir : public CBrowseDir { public: CStaDir(void); ~CStaDir(void); int m_nFileCount;
c++遍歷資料夾內所有檔案
#include<vector> #include<string> #include<io.h> #include<iostream> using namespace std; char * filePath = "D:\\JPEGImages
遍歷資料夾目錄,以一定條件刪除指定型別檔案
背景: 刪除 bmp格式檔案 (建立日期超過當天的時間) 示例程式碼如下: #include<iostream> #include<io.h> #include<time.h> #include<string> #inclu
C#遍歷資料夾下子檔案
public class ChooseMove { //遍歷資料夾 public List<string> FindFile
C++遍歷資料夾(包含子資料夾中的檔案)
<span style="font-size:24px;">最近因為跟著老師做專案,需要遍歷指定資料夾下的指定檔案,故在此記錄學習情況,以便以後複習使用。</span> 找了幾種方法,最後決定使用資料結構_finddata_t ,網上有太多一樣的資
win10 下 c++遍歷資料夾
主要使用#include <io.h>庫下的函式 如果 路勁控制代碼定義為long型別,_findnext函式會報 訪問異常,解決方法參考:http://blog.csdn.net/kelvin_yan/article/details/53997840 例項
C++ 遍歷資料夾以及子資料夾下所有檔案
CFileFind 所提供的方法進行資料夾以及子資料夾遍歷時,經過測試會出現如果當前遍歷的路徑為碟符,且碟符中僅包含一箇中文資料夾(資料夾名以漢字開頭),此時遍歷不到該資料夾。 所以採用以下方法(需要新增頭#include "io.h" ) void GetAllFile
C++遍歷資料夾下的所有資料夾及檔案
問題: 給定一個資料夾,獲取資料夾下的所有檔案,並將檔案的路徑進行儲存 解決方法: 採用遞迴的思想,在遞迴過程中對每一層進行遍歷。若為資料夾,繼續向下遍歷。若為檔案,將路徑儲存。 實現程
c++ 遍歷資料夾下的所有檔案
同樣的程式碼在VS2010中可以得到正常結果,但是VS2013中卻不行,實在想不通.. 沒有找到解決VS2013中遍歷問題的解決辦法,只好另外想辦法.然後想起C++中應該也有能夠實現資料夾遍歷的方法. 在VS2013中實踐一下: #include <s
C# 遍歷資料夾 刪除過期圖片
/// <summary> /// 刪除過期的儲存圖片 /// </summary> public void DeleteOTIm
php之遍歷資料夾目錄
<?php function dirList($dir){ $arr = scandir($dir); foreach ($arr as $v) { if($v != "." && $v != ".."){ $path = $dir.
C#遍歷資料夾,只需一句話
一個函式搞定,都不用去考慮遞迴(以前居然不知道),太強大了。 string[] files = System.IO.Directory.GetFiles(_dir, "*.*", System.IO.SearchOption.AllDirectories); System.
檔案目錄,遍歷資料夾檔案及屬性
目錄檔案: 1、建立目錄: 注:目錄需要執行的許可權,建立資料夾mode& ~umask &nbs