您好,欢迎访问本站博客!登录后台查看权限
  • 欢迎大神光临
  • 有朋自远方来 不亦悦乎

windows接口遍历文件夹的例子

码叔博客 dz2015 2017-11-11 304 次浏览 0个评论

下面是一个使用windows接口遍历文件夹的例子,但是特殊的文件夹路径会出现bug,比如D://$RECYCLE.BIN/S-1-5-18/*就不可遍历,未解决。

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

#ifdef _UNICODE
#define tstring wstring
#define tcout wcout
#else
#define tstring string
#define tcout cout
#endif

//可同时处理目录和文件:path可以是路径,也可以是文件名,或者文件通配符
void _find(tstring path) {
	//取路径名最后一个"//"之前的部分,包括"//"
	tstring prefix = path.substr(0, path.find_last_of(_T("/")) + 1);

	WIN32_FIND_DATA FindFileData;
	tcout << path << endl;
	HANDLE hFind = ::FindFirstFile(path.c_str(), &FindFileData);
	if (INVALID_HANDLE_VALUE == hFind)
	{
		tcout << _T("文件通配符错误") << endl;
		return;
	}
	while (TRUE)
	{
		//目录
		if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
		{
			tstring path = FindFileData.cFileName;
			tcout << _T("DIR>>") << prefix << FindFileData.cFileName << endl;
			//不是当前目录,也不是父目录
			if (path != _T(".") && path != _T(".."))
			{	
				//查找下一级目录
				_find(prefix + path + _T("/*"));
			}
		}
		//文件
		else
		{
			tcout << _T("FILE>>") << prefix << FindFileData.cFileName << endl;
		}
		if (!FindNextFile(hFind, &FindFileData))
			break;
	}
	FindClose(hFind);
}

void main() {
	_find(_T("C://RECYCLER/*"));
	//_find(_T("D://*"));
	tcout << _T("end.") << endl;
	system("pause");
}


已有 304 位网友参与,快来吐槽:

发表评论