用C++遍歷一個文件夾下面所有的文件

 
October 15

用C++遍歷一個文件夾下面所有的文件 Zz

對指定的文件夾,遍歷其內部所有的文件;
 
比較簡單的辦法就是在main()裏面
system("dir c://WT2G// /B >filelist.txt");
 
下面這種方法也不錯,需要在VC7.1及其以後編譯;
 
  // findinfile.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <iostream>
#include <algorithm>
using namespace std;
 
#pragma once

// 使用UNICODE字符集
#ifndef UNICODE
#define UNICODE
#endif

// 如果不使用Unicode可以解鎖下面的:
//#undef UNICODE
//#undef _UNICODE

#include <windows.h>

#include <string>
#include <vector>

// 版本控制
// 因爲我不知道VC7.1以前的版本是否有tchar.h
#if _MSC_VER < 1310
#error "注意,請您使用VC7.1或者以上版本編譯此程序"
#endif

#include <tchar.h>
#pragma message("請注意:如果您的文件夾下面有中文文件名的文件的話,最好使用UNICODE字符集")

// 提供字符串的定義有中文的時候最好使用wstring
#ifdef UNICODE

typedef std::wstring String;

#else

typedef std::string String;

#endif

// 定義文件名的定義
typedef std::vector<String> FilesVec;

// 查找當前目錄下的所有文件返回所有文件的文件名請以FilesVec的引用的方式傳遞

// pathName 爲路徑名
void FindFiles( const TCHAR * pathName ,FilesVec &files )
{
   WIN32_FIND_DATA FindFileData;
   HANDLE hFind = INVALID_HANDLE_VALUE;
   TCHAR PathBuffer[ _MAX_PATH ];
  
   _tcscpy_s( PathBuffer,_MAX_PATH, pathName );
   _tcscat_s( PathBuffer,_MAX_PATH, _T("//*") );
  
   hFind = FindFirstFile( PathBuffer ,&FindFileData );
   if( INVALID_HANDLE_VALUE == hFind )      // 如果出現了某種異常就直接拋出便可
   {
      char buffer[56];
      sprintf_s( buffer,"Invalid File Handle.Error is %u/n",GetLastError() );
      throw std::exception( buffer );
   }
   else // 然後再接着查找下去
   {
      files.push_back( String(FindFileData.cFileName) );  
     
      while( 0 != FindNextFile( hFind,&FindFileData ) )
      {
         files.push_back( String(FindFileData.cFileName) );
      }

      FindClose( hFind );
   }
}
 
int main()
{
FilesVec files;
try
{
   FindFiles( _T("C://Program Files//") , files );
}
catch( exception &e )
{
   cout<<"查找過程中發生了異常"<<endl;
   cout<<e.what()<<endl;
   return -1;
}
#ifdef UNICODE
locale loc("chs");
wcout.imbue( loc );
copy( files.begin(), files.end(), ostream_iterator< String,TCHAR >( wcout, _T("/n") ) );
#else
copy( files.begin(), files.end(), ostream_iterator< String,TCHAR >( cout, _T("/n") ) );
#endif

system("pause");
return 0;
}
 
 
 
 

1、簡介

  文件查找在很多場合會被派上用場,類ffsco將文件查找操作簡單封裝,使用只需要傳遞參數查找路徑和文件匹配格式(可以繼承該類的 match 方法實現自己的匹配算法)到find方法,查詢結果(文件/目錄等)被保存到類內部的vector容器,以後想怎麼用都行。

要求:

系統支持標準 C++/vector/string 使用者瞭解 vector/string     

2、說明

使用WIN32提供的函數FindFirstFile/FindNextFile實現。子目錄查找用遞歸方法。      3、使用方法

將文件ffsco.h/ffsco.cpp加入,在使用的地方包含文件ffsco.h,e.g.

#include "ffsco.h"

加入名字空間使用聲明:

using namespace helper_coffs;

定義ffsco類對象:

ffsco o;

設置是否查找子目錄:

//o.dirs(1);	//--查找子目錄

設置查找結果個數上限(默認65536/最大1048576當然可以自己修改限制):

//o.limit(100);	//--最多查找100個

開始查找(返回結果個數):

int count = o.find(path, fext);
//int count = o.find("c://winnt");
//int count = o.find("c://winnt", "*.exe; *.dll; *.ini");
//int count = o.find("c://winnt//", "*.exe; *.dll; *.ini");

取結果:

ffsco::typeT coo;
coo = o.co();	//--文件目錄混合
coo = o.co_dir();	//--全部目錄
coo = o.co_file();	//--全部文件

使用結果:

for (ffsco::typeT::iterator it = coo.begin(); coo.end() != it; it ++)
{
	cout << *it << endl;
	//想怎麼用???
}

就是這麼簡單:)

更多使用請參考ffsco類提供的test()...    

 
發佈了53 篇原創文章 · 獲贊 4 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章