windows编程之目录遍历

Posted wgwyanfs

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了windows编程之目录遍历相关的知识,希望对你有一定的参考价值。

利用windows的API,FindFirstFile和FileNextFile,採用递归遍历指定目录中的全部文件及目录,第一次windows编程。代码写的非常臃肿难看。请大家多多包涵!

#include<cstdio>
#include<cstring>
#include<iostream>
#include<windows.h>

#define MAXN 100005

using namespace std;

void surf(WIN32_FIND_DATA myData)
{
	cout<<myData.ftCreationTime.dwLowDateTime<<endl;
	cout<<myData.ftLastAccessTime.dwLowDateTime<<endl;
	cout<<myData.ftLastWriteTime.dwLowDateTime<<endl;
	SYSTEMTIME ctime , atime , wtime;
	FileTimeToSystemTime(&myData.ftCreationTime , &ctime);
	FileTimeToSystemTime(&myData.ftLastAccessTime , &atime);
	FileTimeToSystemTime(&myData.ftLastWriteTime , &wtime);
	printf("%d年%d月%d日%d时%d分%d秒\n"
		 , ctime.wYear , ctime.wMonth , ctime.wDay , ctime.wHour , ctime.wMinute , ctime.wSecond);
	printf("%d年%d月%d日%d时%d分%d秒\n"
		 , atime.wYear , atime.wMonth , atime.wDay , atime.wHour , atime.wMinute , atime.wSecond);
	printf("%d年%d月%d日%d时%d分%d秒\n"
		 , wtime.wYear , wtime.wMonth , wtime.wDay , wtime.wHour , wtime.wMinute , wtime.wSecond);
	cout<<endl<<endl;
}

void traverse(char *Str)
{
	WIN32_FIND_DATA myData;
	HANDLE hFind = INVALID_HANDLE_VALUE;
	char str[MAX_PATH] = {0};
	strcpy(str , Str);
	strcat(str , "/*");		//使用通配符进行匹配 
	hFind = FindFirstFile(str , &myData);
	if(INVALID_HANDLE_VALUE == hFind)
		return ;
	while(FindNextFile(hFind , &myData))
	{
		if(myData.cFileName[0] != ‘.‘)		//非返回文件夹时进行下一步 
		{
			cout<<"========="<<myData.cFileName<<"=========="<<endl; 
			surf(myData);
			if(myData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)		//推断是否为文件夹 
			{
				char dir[MAX_PATH] = {0};
				snprintf(dir , MAX_PATH, "%s/%s" , Str , myData.cFileName);	//构造路径 
				traverse(dir);
			}
		}
	}
	FindClose(hFind);	//关闭句柄 
}

int main()
{
	char *str = "./test";
	traverse(str);
}





我的当前目录下的test目录有“haha”目录以及test.1 , test , 2 , test , 3三个文件,"haha"目录里又含有“ai”目录以及haha.1 , haha.2 , haha.3三个文件。“ai”目录里又含有“wo”目录以及ai.1 , ai.2 , ai.3三个文件,"wo"目录里有wo.1 , wo.2 , wo.3三个文件。。


程序输出结果:

=========haha==========
1556376338
2156419021
2156419021
2014年5月31日10时16分18秒
2014年5月31日10时24分27秒
2014年5月31日10时24分27秒


=========ai==========
2147248496
772195107
772195107
2014年5月31日10时24分27秒
2014年5月31日11时26分34秒
2014年5月31日11时26分34秒


=========ai.1==========
2197291359
2197291359
2197291359
2014年5月31日10时24分32秒
2014年5月31日10时24分32秒
2014年5月31日10时24分32秒


=========ai.2==========
2197291359
2328198846
2328198846
2014年5月31日10时24分32秒
2014年5月31日10时24分45秒
2014年5月31日10时24分45秒


=========ai.3==========
2197291359
2387262224
2387262224
2014年5月31日10时24分32秒
2014年5月31日10时24分51秒
2014年5月31日10时24分51秒


=========wo==========
752914004
2835575798
2835575798
2014年5月31日11时26分33秒
2014年5月31日15时40分33秒
2014年5月31日15时40分33秒


=========wo.1==========
806557072
806557072
806557072
2014年5月31日11时26分38秒
2014年5月31日11时26分38秒
2014年5月31日11时26分38秒


=========wo.2==========
870010701
870010701
870010701
2014年5月31日11时26分44秒
2014年5月31日11时26分44秒
2014年5月31日11时26分44秒


=========wo.3==========
870010701
923383754
923383754
2014年5月31日11时26分44秒
2014年5月31日11时26分50秒
2014年5月31日11时26分50秒


=========haha.1==========
1601118898
1601118898
1601118898
2014年5月31日10时16分22秒
2014年5月31日10时16分22秒
2014年5月31日10时16分22秒


=========haha.2==========
1601118898
1678113301
1678113301
2014年5月31日10时16分22秒
2014年5月31日10时16分30秒
2014年5月31日10时16分30秒


=========haha.3==========
1601118898
1742136963
1742136963
2014年5月31日10时16分22秒
2014年5月31日10时16分36秒
2014年5月31日10时16分36秒


=========test.1==========
1835930690
1835930690
1601118898
2014年5月31日10时23分55秒
2014年5月31日10时23分55秒
2014年5月31日10时16分22秒


=========test.2==========
1924505756
1924505756
1678113301
2014年5月31日10时24分4秒
2014年5月31日10时24分4秒
2014年5月31日10时16分30秒


=========test.3==========
1924535758
1924535758
1742136963
2014年5月31日10时24分4秒
2014年5月31日10时24分4秒
2014年5月31日10时16分36秒



以上是关于windows编程之目录遍历的主要内容,如果未能解决你的问题,请参考以下文章

python GUI编程tkinter示例之目录树遍历工具

JUC并发编程 共享模式之工具 JUC CountdownLatch(倒计时锁) -- CountdownLatch应用(等待多个线程准备完毕( 可以覆盖上次的打印内)等待多个远程调用结束)(代码片段

windows内核代码之进程操作

python之模块和包

scrapy主动退出爬虫的代码片段(python3)

如何在android中以编程方式在片段之间导航?