1. 程式人生 > >使用C++遍歷資料夾/目錄

使用C++遍歷資料夾/目錄

編寫程式遍歷資料夾及其子資料夾下所有檔案,並輸出到標準輸出流或者檔案流。

  1. 先考慮在單層目錄下,遍歷所有檔案。以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; }
  1. 遍歷資料夾及其子資料夾下所有檔案。作業系統中資料夾目錄是樹狀結構,使用深度搜索策略遍歷所有檔案。用到_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