user-0 提问: c++遍历目录下所有指定格式的文件

回复:
user: user-1
content: system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。

user: user-2
content: 引用 5 楼 liu15073458538 的回复:   大神，我用VS10好像不行诶！ 将UNICODE改为多字节, 或者将char改为TCHAR

user: user-3
content: 引用 3 楼 ForestDB 的回复:find /path/to/directory -name '*.off' >output.txt 这个是在windows下使用的吗？

user: user-0
content: 大神，我用VS10好像不行诶！

user: user-4
content: 用cmd多省事 if exist paths.txt (del paths.txt) for /r %i in (*.off) do @echo %~fi >> paths.txt

user: user-5
content: find /path/to/directory -name '*.off' >output.txt

user: user-2
content: DirectoryTraverser.h #pragma once #include <windows.h>  #ifndef __in #define __in #endif  #ifndef __out #define __out #endif  typedef void(*TraverseCallback)(const LPWIN32_FIND_DATAA, void*); class CDirectoryTraverser { public: 	CDirectoryTraverser(__in TraverseCallback callback); 	~CDirectoryTraverser();  private: 	bool IsDirectory(__in const char*); 	void RecurringTraverse(__in const char*); 	TraverseCallback fTraverseCallback_; 	void* p_user_data_; 	char c_str_type_[MAX_PATH];  public: 	bool Traverse(__in const char*, __in void* p_user_data); 	void SetType(__in const char*); }; DirectoryTraverser.cpp #include "DirectoryTraverser.h" #include <iostream>  CDirectoryTraverser::CDirectoryTraverser(__in TraverseCallback callback) 	: fTraverseCallback_(callback) 	, p_user_data_(NULL) { 	memset(c_str_type_, 0, MAX_PATH); }  CDirectoryTraverser::~CDirectoryTraverser() { }  bool CDirectoryTraverser::Traverse(__in const char* c_str_path, __in void* p_user_data) { 	p_user_data_ = p_user_data; 	if (!IsDirectory(c_str_path)) 		return false; 	RecurringTraverse(c_str_path); 	return true; }   bool CDirectoryTraverser::IsDirectory(__in const char* c_str_path) { 	HANDLE hFind = INVALID_HANDLE_VALUE; 	WIN32_FIND_DATAA wfd = { 0 };  	hFind = FindFirstFile(c_str_path, &wfd); 	if (INVALID_HANDLE_VALUE == hFind) 		return false;  	if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 		return true; 	else 		return false; }   void CDirectoryTraverser::RecurringTraverse(__in const char* c_str_path) { 	if (c_str_path == NULL) 		return;  	HANDLE hFind = INVALID_HANDLE_VALUE; 	WIN32_FIND_DATAA wfd = { 0 }; 	char c_str_path_buf[MAX_PATH] = { 0 }; 	if (c_str_type_[0] == 0) 		sprintf_s(c_str_path_buf, MAX_PATH, "%s\\*", c_str_path); 	else 		sprintf_s(c_str_path_buf, MAX_PATH, "%s\\*.%s", c_str_path, c_str_type_);  	hFind = FindFirstFile(c_str_path_buf, &wfd); 	if (INVALID_HANDLE_VALUE == hFind) 		return;  	do 	{ 		if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) 		{ 			if (strcmp(wfd.cFileName, ".") != 0 				&& strcmp(wfd.cFileName, "..") != 0) 				RecurringTraverse(wfd.cFileName); 		} 		else if (fTraverseCallback_) 			fTraverseCallback_(&wfd, p_user_data_); 		else 			break; 	} while (FindNextFile(hFind, &wfd) != 0);  	FindClose(hFind); }  void CDirectoryTraverser::SetType(__in const char* str_type) { 	strcpy_s(c_str_type_, MAX_PATH, str_type); }  test.cpp #include "DirectoryTraverser.h"  static void TraverserDirectoryCallback(LPWIN32_FIND_DATAA p_wfd, void* p_user_data) { 	printf(_T("%s\r\n"), p_wfd->cFileName); }  int _tmain(int argc, _TCHAR* argv[]) { 	CDirectoryTraverser dt(TraverserDirectoryCallback); 	dt.SetType("otf"); 	bool b_result = dt.Traverse("C:\\Windows\\Fonts", NULL); 	if (b_result) 		printf(_T("Traverse Successful\r\n")); 	else 		printf(_T("Traverse Failed\r\n"));  	system("pause"); 	return 0; }

user: user-6
content: 给个例子参考，我这里是遍历C:\test目录及其子目录下所有的.txt文件，然后将txt文件的路径保存在C:\fileinfo.txt文件中 #define _AFXDLL #include <afx.h> #include <fstream> using namespace std;  void MyFindFile(CString strPath,CString strType,fstream& fs) { 	CFileFind fd; 	CString strDir=strPath+"\\*.*"; 	bool bRet=true; 	bRet=fd.FindFile(strDir,0); 	while(bRet) 	{ 		bRet=fd.FindNextFile(); 		if(fd.IsDots()) 		{ 			continue; 		} 		if(fd.IsDirectory()) 		{ 			MyFindFile(fd.GetFilePath(),strType,fs); 		} 		else 		{ 			CString strTemp=fd.GetFilePath(); 			char buf[1024]={0}; 			strcpy(buf,strTemp.GetBuffer()); 			strTemp.ReleaseBuffer(); 			if(strTemp.Right(strType.GetLength()).Compare(strType)==0) 			{ 				fs<<buf<<endl; 			} 		} 	}  	fd.Close(); } void main() { 	CString strPath="C:\\test"; 	CString strType=".txt"; 	fstream fs("C:\\fileinfo.txt",fstream::out); 	if(fs) 	{ 		MyFindFile(strPath,strType,fs); 		fs.close(); 	} }