windows下文件夹遍历

  文件夹的操作,是我们在编程中经常遇到的问题,在linux上和windows上经常会有文件夹操作的需求,典型的例子如遍历文件夹中的所有文件,在这两个系统中文件夹操作所提供的API也有所不同。
  最近我老婆向我提了一个需求,便于她管理文件夹:开发一个exe,将exe放入一个目录下,点击该exe,生成这个目录下所有文件的清单,文件夹用“【】”括起来,同时根据文件级别进行缩进。

  这个需求实现起来不难,用到的知识就是文件夹的遍历,在windows上使用的是windows相关的API函数,主要有用到FindFirstFile、FindNextFile、FindClose三个函数,存储文件或文件夹信息的结构体为WIN32_FIND_DATA,里面存储了文件类型(文件或文件夹)、文件名、文件大小、访问时间等信息。

  在此记录此程序,方便后面查阅。

  需求在windows下实现如下:

  

void GenerateList(FILE *file, const char *szDirPath, int nLevel)
{
	BOOL bFind = TRUE;
	WIN32_FIND_DATA fileData;
	char szOldCurDir[MAX_PATH];
	GetCurrentDirectory(sizeof(szOldCurDir), szOldCurDir);/* 获取当前工作目录,用于后面还原工作目录 */
	SetCurrentDirectory(szDirPath);/* 设置当前工作目录 */
	HANDLE hFind = FindFirstFile("*", &fileData);
	if (hFind == INVALID_HANDLE_VALUE){
		SetCurrentDirectory(szOldCurDir);/* 还原工作目录 */
		return;
	}
	while (bFind){
		if (fileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY){/* 表示是文件夹 */
			if (strcmp(fileData.cFileName, ".") == 0
				|| strcmp(fileData.cFileName, "..") == 0){/* 找到当前文件夹或者上一级文件夹 */
				bFind = FindNextFile(hFind, &fileData);
			}
			else{
				fprintf(file, "%*s【%s】\r\n", 4 * nLevel, "", fileData.cFileName);
				GenerateList(file, fileData.cFileName, nLevel + 1);
			}
		}
		else {/* 普通文件 */
			fprintf(file, "%*s%s\r\n", 4 * nLevel, "", fileData.cFileName);
		}
		bFind = FindNextFile(hFind, &fileData);
	}
	SetCurrentDirectory(szOldCurDir);/* 还原工作目录 */
	FindClose(hFind);
}

int _tmain(int argc, _TCHAR* argv[])
{
	FILE *file;
	fopen_s(&file, "文件清单.txt", "wb");
	if (file == NULL){
		return -1;
	}
	GenerateList(file, ".", 0);
	fclose(file);
	return 0;
}

  生成的文件清单:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值