热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

windows下,c/c++实现磁盘扫描,结合配置文件,读取特定后缀文件目录代码

#include<windows.h>#include<iostream>#include<fstream>#include<locale.h>
#include 
#include
#include
#include
#include "stdio.h"
#include "OperatingIni.h"

using namespace std;

class ScanDisk //磁盘搜索类
{
public:

ScanDisk(TCHAR *Expansion,TCHAR *FileName);//构造函数
~ScanDisk();

TCHAR DriveString[MAX_PATH];// 驱动器列表
TCHAR Driver[MAX_PATH];//驱动器名
TCHAR Expansion[MAX_PATH];//后缀名
TCHAR FileName[MAX_PATH];//构造函数使用生成的文件名
TCHAR Name[MAX_PATH];//还未传送的文件路径
TCHAR ConfigName[MAX_PATH];//要使用的配置文件名
DWORD count;//文件个数
DWORD Transform_count;//已传送文件个数

CIniReader *Reader;
CIniWriter *Writer;
FILE *fp;//文件指针,创建路径文件
public:

TCHAR * GetFirstFile();//得到第一个文件路径
//void ModifyPath(TCHAR *path);//修改路径字符串
void SearchforAllDriver(); //搜索所有驱动器
void GetDriverList();//得到驱动器列表
bool Search(TCHAR *Path,TCHAR *File);//递归搜索
bool TcharMarch(TCHAR *fileName,TCHAR *Extension);//文件后缀名匹配
void SetExpansion(TCHAR *Expansion);//设置新的文件后缀
void SetConfigName(TCHAR *ConfigName);//设置需要操作的配置文件名
void InitOperateIni(TCHAR *ConfigName);//初始化配置信息类
void GetAllExpansion();//得到所有后缀名并且检索目录写入文件
};

ScanDisk::ScanDisk(TCHAR *Expansion,TCHAR *FileName)//初始化工作
{
memset(this->DriveString,0,sizeof(this->DriveString));
memset(this->Driver,0,sizeof(this->Driver));
memset(this->Expansion,0,sizeof(this->Expansion));
memset(this->FileName,0,sizeof(this->FileName));
memset(this->Name,0,sizeof(this->Name));
memset(this->ConfigName,0,sizeof(this->ConfigName));
this->count=0;//文件个数
this->Transform_count=0;//已传送文件个数为0

memcpy(this->Expansion,Expansion,wcslen(Expansion)*2);
memcpy(this->FileName,FileName,wcslen(FileName)*2);
//MessageBox(NULL,this->FileName,NULL,MB_OK);
//MessageBox(NULL,this->Expansion,NULL,MB_OK);

}

ScanDisk::~ScanDisk()
{
fclose(this->fp);

}

void ScanDisk::SetExpansion(TCHAR *Expansion)
{
memset(this->Expansion,0,sizeof(this->Expansion));
memcpy(this->Expansion,Expansion,wcslen(Expansion)*2);
}

void ScanDisk::SetConfigName(TCHAR *ConfigName)
{
memset(this->ConfigName,0,sizeof(this->ConfigName));
memcpy(this->ConfigName,ConfigName,wcslen(ConfigName)*2);
}

void ScanDisk::InitOperateIni(TCHAR *ConfigName)
{
memset(this->ConfigName,0,sizeof(this->ConfigName));
memcpy(this->ConfigName,ConfigName,wcslen(ConfigName)*2);
this->Writer=new CIniWriter(this->ConfigName);
this->Reader=new CIniReader(this->ConfigName);
(this->Writer)->WriteInteger(L"Setting",L"count",this->count);
(this->Writer)->WriteInteger(L"Setting",L"Transform_count",this->Transform_count);
}

void ScanDisk::GetAllExpansion()//读取配置文件中的每一个后缀名,遍历磁盘写入文件
{
TCHAR *expansion=(this->Reader)->ReadString(L"Setting", L"extension", L"");//此处设计不是很好
int length=lstrlen(expansion)+1;//没有斜杠零
int i=0;
TCHAR temp[MAX_PATH]={0};
for (int j=0;j{

if (((*expansion)!=L',')&&((*expansion)!=L'\0'))
{
memcpy(&temp[i],expansion,sizeof(TCHAR));
temp[i++];
expansion++;
}

if (((*expansion)==L',')||((*expansion)==L'\0'))
{

temp[i]=L'\0';
this->SetExpansion(temp);
this->SearchforAllDriver();
if ((*expansion)==L'\0')
{
break;
}
expansion++;
i=0;
memset(temp,0,sizeof(temp));

}

}




}


TCHAR * ScanDisk::GetFirstFile()
{
DWORD number=(this->Reader)->ReadInteger(L"Setting",L"Transform_count",this->Transform_count);//看看读到第几个文件了
this->fp=_wfopen(this->FileName,L"r"); //读的方式打开
if(!this->fp)
{
cout<}
else
{
cout<<"the file is opened !"<}
//TCHAR path[MAX_PATH]={0};
for (int i=0;i<=number;i++)
{
fgetws(this->Name,MAX_PATH,this->fp);//
}
//fgetws(this->Name,MAX_PATH,this->fp);//
this->Name[lstrlen(this->Name)-1]=0;//去掉文件最后的0A
wprintf(this->Name);
//MessageBox(NULL,this->Name,NULL,MB_OK);
this->Transform_count++;
(this->Writer)->WriteInteger(L"Setting",L"Transform_count",this->Transform_count);
fclose(this->fp);

return this->Name;

}

void ScanDisk::SearchforAllDriver()
{

memset(this->Driver,0,sizeof(this->Driver));

this->GetDriverList();
int driverCount=0;
TCHAR * pDrive= this->DriveString;
while( *pDrive )
{
pDrive += wcslen( pDrive ) + 1;
driverCount++;

}
//printf("%d\n",driverCount);//总共几个驱动器
pDrive= this->DriveString;

this->fp=_wfopen(this->FileName,L"a+"); //追加的方式打开
if(!this->fp)
{
cout<}
else
{
cout<<"the file is opened !"<}
//for (int i=0;i//{
while( * pDrive )
{
memcpy(this->Driver,pDrive,wcslen(this->DriveString)+1);//控制字符长度,和缓冲区
//MessageBox(NULL,this->Driver,NULL,MB_OK);
this->Search(this->Driver,this->Expansion);
fflush(this->fp);
pDrive=pDrive+wcslen(pDrive)+1;
}
//}
(this->Writer)->WriteInteger(L"Setting",L"count",this->count);

}

void ScanDisk::GetDriverList()
{
TCHARDriveString[MAX_PATH];
// 前一个字节为令牌,后面的52字节为驱动器跟相关属性
GetLogicalDriveStrings(sizeof(DriveString), DriveString);
memcpy(this->DriveString,DriveString,sizeof(this->DriveString));
}


bool ScanDisk::TcharMarch(TCHAR *fileName,TCHAR *Extension)//文件后缀名匹配
{
int length_of_ext=wcslen(Extension);
int length_of_name=wcslen(fileName);
int i=0;
while(i{
if (fileName[i+(length_of_name-length_of_ext)]!=Extension[i])
{
return false;
}
else
i++;
}
return true;

}

bool ScanDisk::Search(TCHAR *Path,TCHAR *File)
{
HANDLE hFind;
WIN32_FIND_DATA wfd;

ZeroMemory(&wfd,sizeof(WIN32_FIND_DATA));
TCHAR PathTemp[MAX_PATH];
memset(PathTemp,0,sizeof(PathTemp));

swprintf(PathTemp,L"%s\\*.*",Path);
hFind=FindFirstFile(PathTemp,&wfd);

if(INVALID_HANDLE_VALUE==hFind)
{
//MessageBox(NULL,L"INVALID_HANDLE_VALUE",L"FindFirstFile",MB_OK);
return false;
}

do
{
if('.'==wfd.cFileName[0])
{
continue;
}

if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
swprintf(PathTemp,L"%s\\%s",Path,wfd.cFileName);
//MessageBox(NULL,PathTemp,"Directory",MB_OK);
//wprintf(PathTemp);
//printf("\n");
Search(PathTemp,File);
fflush(this->fp);
}
else
{

if (TcharMarch(wfd.cFileName,File))
{

swprintf(PathTemp,L"%s\\%s",Path,wfd.cFileName);
//MessageBox(NULL,L"Found",PathTemp,MB_OK);
//printf(PathTemp);
//wprintf(PathTemp);
//printf("\n");
///////////////////////////////////////////////////////////////////////////////////
//TCHAR temp[MAX_PATH];
//memcpy(temp," ",sizeof(temp));
//temp[MAX_PATH-2]=L'\0';
//memcpy(temp,PathTemp,lstrlen(PathTemp)*2);
//////////////////////////////////////////////////////////////////////////////////
fwprintf(this->fp,L"%s",PathTemp);

fwprintf(this->fp,L"\n");
this->count++;//文件个数加1

}
}

}while(FindNextFile(hFind,&wfd));

FindClose(hFind);

return true;

}


这个代码必须在unicode工程下使用,支持中文路径,
"OperatingIni.h"//这个头文件,如下所示

 

 

#include 
#include
#include

class CIniReader
{
public:
CIniReader(TCHAR * szFileName);
int ReadInteger(TCHAR* szSection, TCHAR* szKey, int iDefaultValue);
//float ReadFloat(TCHAR* szSection, TCHAR* szKey, float fltDefaultValue);
bool ReadBoolean(TCHAR* szSection, TCHAR* szKey, bool bolDefaultValue);
TCHAR* ReadString(TCHAR* szSection, TCHAR* szKey, const TCHAR* szDefaultValue);
private:
TCHAR m_szFileName[MAX_PATH];
};

class CIniWriter
{
public:
CIniWriter(TCHAR* szFileName);
void WriteInteger(TCHAR* szSection, TCHAR* szKey, int iValue);
//void WriteFloat(TCHAR* szSection, TCHAR* szKey, float fltValue);
void WriteBoolean(TCHAR* szSection, TCHAR* szKey, bool bolValue);
void WriteString(TCHAR* szSection, TCHAR* szKey, TCHAR* szValue);
void DeleteString(TCHAR* szSection, TCHAR* szKey);
private:
TCHAR m_szFileName[MAX_PATH];
};


CIniReader::CIniReader(TCHAR* szFileName)
{
memset(m_szFileName, 0x00, MAX_PATH);
memcpy(m_szFileName, szFileName, wcslen(szFileName)*2);//注意此处
}

int CIniReader::ReadInteger(TCHAR* szSection, TCHAR* szKey, int iDefaultValue)
{
int iResult = GetPrivateProfileInt(szSection, szKey, iDefaultValue, m_szFileName);
return iResult;
}

//float CIniReader::ReadFloat(TCHAR* szSection, TCHAR* szKey, float fltDefaultValue)
//{
//TCHAR szResult[255];
//TCHAR szDefault[255];
//float fltResult;
//swprintf(szDefault, L"%f",fltDefaultValue);
//GetPrivateProfileString(szSection, szKey, szDefault, szResult, 255, m_szFileName);
//fltResult = atof(szResult);
//return fltResult;
//}

bool CIniReader::ReadBoolean(TCHAR* szSection, TCHAR* szKey, bool bolDefaultValue)
{
TCHAR szResult[MAX_PATH];
TCHAR szDefault[MAX_PATH];
bool bolResult;
swprintf(szDefault, L"%s", bolDefaultValue? L"True" : L"False");
GetPrivateProfileString(szSection, szKey, szDefault, szResult, 255, m_szFileName);
bolResult = (wcscmp(szResult, L"True") == 0 ||
wcscmp(szResult, L"true") == 0) ? true : false;
return bolResult;
}

TCHAR* CIniReader::ReadString(TCHAR* szSection, TCHAR* szKey, const TCHAR* szDefaultValue)
{
TCHAR* szResult = new TCHAR[MAX_PATH];
memset(szResult, 0x00, MAX_PATH);
GetPrivateProfileString(szSection, szKey,
szDefaultValue, szResult, MAX_PATH, m_szFileName);
return szResult;
}

CIniWriter::CIniWriter(TCHAR* szFileName)
{
memset(m_szFileName, 0x00, MAX_PATH);
memcpy(m_szFileName, szFileName, wcslen(szFileName)*2);
}

void CIniWriter::WriteInteger(TCHAR* szSection, TCHAR* szKey, int iValue)
{
TCHAR szValue[MAX_PATH];
swprintf(szValue, L"%d", iValue);
WritePrivateProfileString(szSection, szKey, szValue, m_szFileName);
}

//void CIniWriter::WriteFloat(TCHAR* szSection, TCHAR* szKey, float fltValue)
//{
//TCHAR szValue[255];
//swprintf(szValue,L"%f", fltValue);
//WritePrivateProfileString(szSection, szKey, szValue, m_szFileName);
//}

void CIniWriter::WriteBoolean(TCHAR* szSection, TCHAR* szKey, bool bolValue)
{
TCHAR szValue[MAX_PATH];
swprintf(szValue, L"%s", bolValue ? L"True" : L"False");
WritePrivateProfileString(szSection, szKey, szValue, m_szFileName);
}

void CIniWriter::WriteString(TCHAR* szSection, TCHAR* szKey, TCHAR* szValue)
{
WritePrivateProfileString(szSection, szKey, szValue, m_szFileName);
}

void CIniWriter::DeleteString(TCHAR* szSection, TCHAR* szKey)
{
WritePrivateProfileString(szSection,szKey,NULL,m_szFileName);
}


主函数可以这么写:

#include "ScanDisk.h"
//#include "OperatingIni.h"

int main()
{
//_wsetlocale设置中文语言环境
_wsetlocale(LC_ALL,L"chs");




//*/
//_wsetlocale设置中文语言环境
//_wsetlocale(LC_ALL,L"chs");

CIniWriter iniWriter(L".//Log.ini");
iniWriter.WriteString(L"Setting",L"extension", L".txt");
//iniWriter.WriteInteger(L"Setting", L"count", 2);
////iniWriter.WriteFloat(L"Setting", L"Height", 1.82f);
//iniWriter.WriteBoolean(L"Setting", L"Marriage", false);
//iniWriter.WriteBoolean(L"Setting", L"Marriage", NULL);
//iniWriter.DeleteString(L"Setting",L"Marriage");
//iniWriter.WriteString("ff", "Name", "jia");
//iniWriter.WriteInteger("ff", "Age", 8);
//iniWriter.WriteFloat("ff", "Height", 1.82f);
//iniWriter.WriteBoolean("ff", "Marriage", false);

CIniReader iniReader(L".//Log.ini");

TCHAR *szName = iniReader.ReadString(L"Setting", L"extension", L"");
//int iAge = iniReader.ReadInteger(L"Setting", L"Age", 0);
//float fltHieght = iniReader.ReadFloat(L"Setting", L"Height", 1.80f);
//bool bMarriage = iniReader.ReadBoolean(L"Setting", L"Marriage", true);

//std::cout<//<//<//<//wprintf(szName);
//wprintf(L"\n");
//wprintf(L"%d\n",iAge);
_wremove(L"Logger.log");//删除ini文件
TCHAR *file= L"Logger.log";
TCHAR *ext=szName;
ScanDisk sd(ext,file);
sd.InitOperateIni(L".//Log.ini");
sd.GetAllExpansion();
sd.SearchforAllDriver();
sd.GetFirstFile();
sd.GetFirstFile();
//sd.SetExpansion(L".dsp");
//sd.SearchforAllDriver();
//sd.GetFirstFile();
//MessageBox(NULL,sd.GetFirstFile(),NULL,MB_OK);




//fclose(fp);
//fclose(sd.fp);
system("pause");
return 0;
}

 

 

 

配置文件:

 

部分搜索结果:

资源下载:

 

http://download.csdn.net/detail/wangyaninglm/8301303

 


推荐阅读
  • 题目解析给定 n 个人和 n 种书籍,每个人都有一个包含自己喜好的书籍列表。目标是计算出满足以下条件的分配方案数量:1. 每个人都必须获得他们喜欢的书籍;2. 每本书只能分配给一个人。通过使用深度优先搜索算法,可以系统地探索所有可能的分配组合,确保每个分配方案都符合上述条件。该方法能够有效地处理这类组合优化问题,找到所有可行的解。 ... [详细]
  • 开发笔记:实现1353表达式中的括号匹配(栈的应用) ... [详细]
  • 本文详细解析了 Android 系统启动过程中的核心文件 `init.c`,探讨了其在系统初始化阶段的关键作用。通过对 `init.c` 的源代码进行深入分析,揭示了其如何管理进程、解析配置文件以及执行系统启动脚本。此外,文章还介绍了 `init` 进程的生命周期及其与内核的交互方式,为开发者提供了深入了解 Android 启动机制的宝贵资料。 ... [详细]
  • Spring框架中枚举参数的正确使用方法与技巧
    本文详细阐述了在Spring Boot框架中正确使用枚举参数的方法与技巧,旨在帮助开发者更高效地掌握和应用枚举类型的数据传递,适合对Spring Boot感兴趣的读者深入学习。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • 题目要求维护一个数列,并支持两种操作:一是查询操作,语法为QL,用于查询数列末尾L个数中的最大值;二是更新操作,用于修改数列中的某个元素。本文通过ST表(Sparse Table)优化查询效率,确保在O(1)时间内完成查询,同时保持较低的预处理时间复杂度。 ... [详细]
  • PHP预处理常量详解:如何定义与使用常量 ... [详细]
  • 本文探讨了如何利用Java代码获取当前本地操作系统中正在运行的进程列表及其详细信息。通过引入必要的包和类,开发者可以轻松地实现这一功能,为系统监控和管理提供有力支持。示例代码展示了具体实现方法,适用于需要了解系统进程状态的开发人员。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文介绍了如何利用 Delphi 中的 IdTCPServer 和 IdTCPClient 控件实现高效的文件传输。这些控件在默认情况下采用阻塞模式,并且服务器端已经集成了多线程处理,能够支持任意大小的文件传输,无需担心数据包大小的限制。与传统的 ClientSocket 相比,Indy 控件提供了更为简洁和可靠的解决方案,特别适用于开发高性能的网络文件传输应用程序。 ... [详细]
  • 在C#编程中,数值结果的格式化展示是提高代码可读性和用户体验的重要手段。本文探讨了多种格式化方法和技巧,如使用格式说明符、自定义格式字符串等,以实现对数值结果的精确控制。通过实例演示,展示了如何灵活运用这些技术来满足不同的展示需求。 ... [详细]
  • MSP430F5438 ADC12模块应用与学习心得
    在最近的实践中,我深入研究了MSP430F5438的ADC12模块。尽管该模块的功能相对简单,但通过实际操作,我对MSP430F5438A和MSP430F5438之间的差异有了更深刻的理解。本文将分享这些学习心得,并探讨如何更好地利用ADC12模块进行数据采集和处理。 ... [详细]
  • 深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案
    深入剖析Java中SimpleDateFormat在多线程环境下的潜在风险与解决方案 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
author-avatar
乀人生如梦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有