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;
}

生成的文件清单:

时间: 2024-10-25 17:30:51

windows下文件夹遍历的相关文章

Windows下文件夹扩展名

回收站.{645ff040-5081-101b-9f08-00aa002f954e} 拨号网络.{992CFFA0-F557-101A-88EC-00DD010CCC48} 打印机.{2227a280-3aea-1069-a2de-08002b30309d} 控制面板.{21ec2020-3aea-1069-a2dd-08002b30309d} 网上邻居.{208D2C60-3AEA-1069-A2D7-08002B30309D}图标clsid=windowsmedia 文件名.{00020c0

linux下 文件夹和文件的字符集编码方式转换

网站有一些课件资源,课件资源是从windows传到Linux服务器,在windows下文件夹编码方式为GBK,而浏览器默认的编码模式为UTF-8(服务器默认编码也为UTF-8),如此,便导致了类似http://xxxx//Resources/北师大/初中语文/八年级上/本册综合/绿.ppt  这样的域名的无法访问,提示找不到资源.解决办法:用convmv工具将Resources目录下的所有文件的名称使用utf-8重新编码下载convmv:wget  https://www.j3e.de/linu

windows编程之文件夹遍历

利用windows的API,FindFirstFile和FileNextFile,采用递归遍历指定文件夹中的所有文件及文件夹,第一次windows编程,代码写的很臃肿难看,请大家多多包涵! <pre name="code" class="cpp">#include<cstdio> #include<cstring> #include<iostream> #include<windows.h> #define

计算沙盒下文件夹内容大小 清空沙盒 文件 目录

1 +(float)fileSizeForDir:(NSString*)path//计算文件夹下文件的总大小 2 3 { 4 5 NSFileManager *fileManager = [[NSFileManager alloc] init]; 6 7 float size =0; 8 9 NSArray* array = [fileManager contentsOfDirectoryAtPath:path error:nil]; 10 11 for(int i = 0; i<[array

centos6.4 *64 Linux挂载windows下共享文件夹

centos6.4 *64 Linux挂载windows下共享文件夹 mount //192.168.1.21 /mnt/pub 结果无法正常挂载,提示以下错误,开始以为是因为windows下共享文件夹是ntfs格式的问题,下了一个ntfs-3g,依旧无效,后来发现是少了组件包cifs-utils [[email protected] ~]# mount //192.168.1.25/pub /mnt/pubmount: wrong fs type, bad option, bad superb

使用cwRsync实现windows下文件定时同步【转】

1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1台Client.其架构如下图所示: 虽然叫法不同,但是他们的安装文件和配置文件是完全一样的.并且大多数情况下,也建议这些服务器上面的配置文件保持一致,这样只需要维护一个版本的config即可,不需要个性化定义每台服务器上面的config文件.由此也带来了一个新的问题,每当我在一台机器上面修改了配置文

使用cwRsync实现windows下文件定时同步

1.参考文献: 使用cwRsync实现windows下文件定时同步(备份) 文件同步工具CwRsync的使用方法及常用命令详解 2.背景: 当前的SCADA架构中,有1台Server,5台FE,还有1台Client.其架构如下图所示: 虽然叫法不同,但是他们的安装文件和配置文件是完全一样的.并且大多数情况下,也建议这些服务器上面的配置文件保持一致,这样只需要维护一个版本的config即可,不需要个性化定义每台服务器上面的config文件.由此也带来了一个新的问题,每当我在一台机器上面修改了配置文

Windows之文件夹中打开PowerShell

Windows之文件夹中打开PowerShell 为了解决Windows中在某个路径下使用PowerShell,而不是使用传统的cd命令切换过去,具体做法如下: 打开文件夹 在文件夹的内容区按下Shift+右击 点击在此处打开PowerShell即可. 结果: 原文地址:https://www.cnblogs.com/ZN-225/p/10269504.html

windows 下文件上传到fastdfs

php.ini 配置 [fastdfs]; the base pathfastdfs_client.base_path = D:/tmp; connect timeout in seconds; default value is 30sfastdfs_client.connect_timeout = 2; network timeout in seconds; default value is 30sfastdfs_client.network_timeout = 60 ; standard l