栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

linux,windows,C++列出路径下文件和文件夹

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

linux,windows,C++列出路径下文件和文件夹

linux,windows,C++列出路径下文件和文件夹
  • 开源程序说明
    • linux代码
    • windows代码

开源程序说明

本文包含两个C++函数,分别在linux、windows系统下读取指定路径下的文件夹与文件列表。
CSDN、gitee和github的下载路径:
https://download.csdn.net/download/m0_63669222/35866789
https://gitee.com/RaymondXing/print-dir
https://github.com/RaymondXing/printDir
linux程序使用g++编译,windows程序使用VisualStudio编译运行。
经测试,函数适用操作系统:win10,ubuntu 20.04,ubuntu 16.04,raspbian。其余操作系统未经过测试,若程序API使用不当或执行错误还望指教,谢谢。
代码风格是怎么短怎么写,如有需要应重写再加入到各个工程中。
代码仅供参考,需要用时总是忘了怎么写,发网上容易搜到,免得要用时找不到。

linux代码

linux读取程序如下:

//示例程序:输出当前目录下的文件
//编译(compile):g++ printDirLinux.cpp -o printDirLinux -O3 -std=c++11
//运行(execute):./printDirLinux
#include 
#include 
#include 
#include 

//输入文件夹路径dir_name,输出文件夹列表dir与文件列表file
int find_dir_file(std::string dir_name, std::vector& dir, std::vector& file)
{
	dir.clear();
	file.clear();
	DIR *dirp;
	struct dirent *dp;
	dirp = opendir(dir_name.c_str());
	if(dirp == NULL)
	{
		std::cout << "find_dir_file() error!n dir_name = " << dir_name << std::endl;
		return -1;
	}
	while ((dp = readdir(dirp)) != NULL)
	{
		if(std::string(dp->d_name) == std::string(".") || std::string(dp->d_name) == std::string(".."))
		{//当前路径或者父路径
			continue;
		}
		else if(dp->d_type == DT_REG)//文件
		{
			file.push_back(std::string(dp->d_name));
		}
		else if(dp->d_type == DT_DIR)//路径
		{
			dir.push_back(std::string(dp->d_name));
		}
	}
	(void) closedir(dirp);
	return 0;
}

int main(int argc, char** argv)
{
	std::vector dir, file;
	find_dir_file("./", dir, file);
	for (std::string strOut : dir)
		std::cout << "dir:t" + strOut << std::endl;
	for (std::string strOut : file)
		std::cout << "file:t" + strOut << std::endl;
}

其中dirent.d_type用来区分类型,定义在"dirent.h"文件内,ubuntu20.04 LTS系统总计包含9种类型:DT_UNKNOWN(0), DT_FIFO(1), DT_CHR(2), DT_DIR(4), DT_BLK(6), DT_REG(8), DT_LNK(10), DT_SOCK(12), DT_WHT(14)

windows代码

windows读取程序如下:

#include 
#include 
#include 
#include 

//注:VisualStudio需要在“配置属性-高级-高级属性-字符集”下设置“使用多字节字符集”而非“使用 Unicode 字符集”。
//注:两种字符集的编码方式和使用的FindFirstFile()函数不同。
//注:使用unicode字符集时需要将(LPCSTR)替换为(LPCWSTR)并将dir_name也转为wchar编码,否则会编译报错或找不到文件。
int find_dir_file(std::string dir_name, std::vector& dir, std::vector& file)//输入文件夹路径dir_name,输出文件夹列表dir与文件列表file
{
	dir.clear();
	file.clear();
	WIN32_FIND_DATA FindFileData;
	dir_name += "/*.*";
	HANDLE hFind = ::FindFirstFile((LPCSTR)dir_name.c_str(), &FindFileData);
	if (hFind == INVALID_HANDLE_VALUE)
	{
		std::cout << "find_dir_file() error! GetLastError() = " << ::GetLastError() << std::endl;
		std::cout << "dir_name = " << dir_name << std::endl;
		return -1;
	}
	while (1)
	{
		if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//directory
		{
			dir.push_back(std::string((char*)FindFileData.cFileName));
		}
		else if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)//file
		{
			file.push_back(std::string((char*)FindFileData.cFileName));
		}
		if (!FindNextFile(hFind, &FindFileData))
			break;
	}
	::FindClose(hFind);
	return 0;
}

int main(int argc, char** argv)
{
	std::vector dir, file;
	find_dir_file("./", dir, file);
	for (std::string strOut : dir)
		std::cout << "dir:t" + strOut << std::endl;
	for (std::string strOut : file)
		std::cout << "file:t" + strOut << std::endl;
}

为便于复制粘贴,将函数直接列出:
linux:
#include
#include
#include
#include

//输入文件夹路径dir_name,输出文件夹列表dir与文件列表file
int find_dir_file(std::string dir_name, std::vectorstd::string& dir, std::vectorstd::string& file)
{
dir.clear();
file.clear();
DIR *dirp;
struct dirent *dp;
dirp = opendir(dir_name.c_str());
if(dirp == NULL)
{
std::cout << “find_dir_file() error!n dir_name = " << dir_name << std::endl;
return -1;
}
while ((dp = readdir(dirp)) != NULL)
{
if(std::string(dp->d_name) == std::string(”.") || std::string(dp->d_name) == std::string("…"))
{//当前路径或者父路径
continue;
}
else if(dp->d_type == DT_REG)//文件
{
file.push_back(std::string(dp->d_name));
}
else if(dp->d_type == DT_DIR)//路径
{
dir.push_back(std::string(dp->d_name));
}
}
(void) closedir(dirp);
return 0;
}
windows:
#include
#include
#include
#include

//注:VisualStudio需要在“配置属性-高级-高级属性-字符集”下设置“使用多字节字符集”而非“使用 Unicode 字符集”。
//注:两种字符集的编码方式和使用的FindFirstFile()函数不同。
//注:使用unicode字符集时需要将(LPCSTR)替换为(LPCWSTR)并将dir_name也转为wchar编码,否则会编译报错或找不到文件。
int find_dir_file(std::string dir_name, std::vectorstd::string& dir, std::vectorstd::string& file)//输入文件夹路径dir_name,输出文件夹列表dir与文件列表file
{
dir.clear();
file.clear();
WIN32_FIND_DATA FindFileData;
dir_name += “/.”;
HANDLE hFind = ::FindFirstFile((LPCSTR)dir_name.c_str(), &FindFileData);
if (hFind == INVALID_HANDLE_VALUE)
{
std::cout << "find_dir_file() error! GetLastError() = " << ::GetLastError() << std::endl;
std::cout << "dir_name = " << dir_name << std::endl;
return -1;
}
while (1)
{
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//directory
{
dir.push_back(std::string((char*)FindFileData.cFileName));
}
else if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ARCHIVE)//file
{
file.push_back(std::string((char*)FindFileData.cFileName));
}
if (!FindNextFile(hFind, &FindFileData))
break;
}
::FindClose(hFind);
return 0;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/384254.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号