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

#include <windows.h>
#include <iostream>
#include <fstream>
#include <locale.h>
#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<length;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<<L"Can not open the .txt file"<<endl;
	}
	else
	{
		cout<<"the file is opened !"<<endl;
	}
	//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<<L"Can not open the .txt file"<<endl;
	}
	else
	{
		cout<<"the file is opened !"<<endl;
	}
	//for (int i=0;i<driverCount;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()
{
	TCHAR	DriveString[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<length_of_ext)
	{
		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 <tchar.h>
#include <iostream>
#include <Windows.h>

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<<L"Name:"<<szName<<std::endl
	//	<<L"Age:"<<iAge<<std::endl
	//<<L"Height:"<<fltHieght<<std::endl
	//<<L"Marriage:"<<bMarriage<<std::endl;
	//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

 

时间: 2024-10-26 02:50:35

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

Linux下配置文件读取操作流程及其C代码实现

一.概述 Linux具有免费.可靠.安全.稳定.多平台等特点,因此深受广大程序员的欢迎. 为了体现软件产品的灵活性,可添加配置文件存放某些重要的参数,在部署的时候根据实际的安装环境对每个配置项的值进行设置.这就要求程序能够准确读取到各个配置项的值. 本文详细介绍了Linux下配置文件的读取方法及读取操作的C代码实现,为相关的软件开发工作的开展提供了有益的参考. 二.配置文件介绍 为了便于程序处理,对配置文件的命名及内容格式有一些约定,具体如下: 第一,配置文件的后缀为ini,如本文中使用到的配置

windows下c语言获取程序当前的执行目录,读文件的代码片

代码如下: #include "stdafx.h" #include "stdlib.h" #include <direct.h> #include <string.h> int _tmain(int argc, char* argv[]) { char* buffer; // Get the current working directory: if( (buffer = _getcwd( NULL, 0 )) == NULL ) perr

汉化Windows XP/2003的磁盘扫描工具

用过Windows XP的用户都知道,Windows XP的磁盘扫描只能在开机时进行,可是面对满屏的英文,你是否一筹莫展?其实,Windows 2000/XP/2003的磁盘扫描完全可以显示中文. 1. 只扫描不修复 我们在资源管理器中右击任意驱动器名称,选择"属性",进入"工具"选项卡,单击"开始检查"按钮,可打开如图所示的对话框.如果不勾选任何修复选项,即使是对系统分区的扫描也可以在Windows环境中进行,出现的也都是中文提示.这相当于在&

windows-如何用Java扫描Windows下的文件夹?

问题描述 如何用Java扫描Windows下的文件夹? 如何用Java扫描Windows下的文件夹以及文件夹下面的文件 解决方案 import java.io.File;/** * *自动扫描文件夹下的文件 *用途:自动扫描脚本输入路径,输出要执行的sql导入数据库: */public class OutSql { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method

Windows Server 2008下利用Diskpart管理磁盘

Windows Server 2008的一个特性在于,操作系统的许多方面的功能都可以通过命令行方式进行管理.如果我们在一台带GUI界面的电脑上正好需要定义一个RAID阵列,通常是比较容易实现,在磁盘管理控制台程序重点击几下鼠标即可完成安装操作. 如果需要对多台机器进行同样的RAID操作,采用脚本的方式效率会更高一些.同样,如果我们正在进行Server Core的安装,那就没有其它选择,只能从命令提示符下管理自己的磁盘子系统.本文中,将介绍如何采用命令行方式实现上面提到的功能. 1.Diskpar

编程-【求教】windows下如何提高WiFi扫描的频率,关于WlanScan函数的使用

问题描述 [求教]windows下如何提高WiFi扫描的频率,关于WlanScan函数的使用 在windows下编程控制无线网卡对AP进行扫描,该扫描频率应该如何提高,比如我想几十ms完成一次扫描:在windows的Native WiFi API文档中[wlanscan文档地址(https://msdn.microsoft.com/en-us/library/ms706783%28v=vs.85%29.aspx)],给出格式: DWORD WINAPI WlanScan(In HANDLE hC

虚拟磁盘-windows下如何将网络共享目录映射为本地磁盘(显示在计算机硬盘节点下面)

问题描述 windows下如何将网络共享目录映射为本地磁盘(显示在计算机硬盘节点下面) window 7下面有net use可以将linux下samba共享的文件显示在网络节点下面,我想怎么样编程实现将这个节点显示为本地磁盘,或者将共享文件夹直接挂载成本地盘. 有个思路是,写个虚拟磁盘,然后在底层驱动层处理磁盘文件读写,磁盘状态等,不知可行不,有没有什么更好的方法?

计算机科学-windows下的api磁盘的读写

问题描述 windows下的api磁盘的读写 要有windows.h文件.文件能运行 必须有creatfile devicectrlo readfile writefilepoint 要源代码.希望大神帮忙 解决方案 Windwos 下是不允许直接操作硬件的,但可以通过 IOCTRL 来控制驱动实现对硬件的操作.你是想要通过 IOCTRL 函数来直接对磁盘进行读写吗?如果是,则不仅仅需要这些 API 函数,还需要驱动的支持. 解决方案二: 不知道你的目的是什么,要达到什么效果,它有一些标准的 I

调用-求大神帮忙windows下磁盘的直接读写

问题描述 求大神帮忙windows下磁盘的直接读写 不知道怎么调用api ,网上下载的都是缺少windows.h 文件,不知道是什么东西,这里有一个资源,可是不懂下载,求大神帮忙.http://download.csdn.net/download/dadi26833/3077521下好了可以发这个邮箱710263384qq.com