// bb.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdlib.h"
#include "direct.h"
#include "string.h"
#include "io.h"
#include "stdio.h"
#include <iostream>
using namespace std;
class CBrowseDir
{
protected:
//存放初始目录的绝对路径,以'\'结尾
char m_szInitDir[_MAX_PATH];
public:
//缺省构造器
CBrowseDir();
//设置初始目录为dir,如果返回false,表示目录不可用
bool SetInitDir(const char *dir);
//开始遍历初始目录及其子目录下由filespec指定类型的文件
//filespec可以使用通配符 * ?,不能包含路径。
//如果返回false,表示遍历过程被用户中止
bool BeginBrowse(const char *filespec);
protected:
//遍历目录dir下由filespec指定的文件
//对于子目录,采用迭代的方法
//如果返回false,表示中止遍历文件
bool BrowseDir(const char *dir,const char *filespec);
//函数BrowseDir每找到一个文件,就调用ProcessFile
//并把文件名作为参数传递过去
//如果返回false,表示中止遍历文件
//用户可以覆写该函数,加入自己的处理代码
virtual bool ProcessFile(const char *filename);
//函数BrowseDir每进入一个目录,就调用ProcessDir
//并把正在处理的目录名及上一级目录名作为参数传递过去
//如果正在处理的是初始目录,则parentdir=NULL
//用户可以覆写该函数,加入自己的处理代码
//比如用户可以在这里统计子目录的个数
virtual void ProcessDir(const char *currentdir,const char *parentdir);
};
CBrowseDir::CBrowseDir()
{
//用当前目录初始化m_szInitDir
getcwd(m_szInitDir,_MAX_PATH);
//如果目录的最后一个字母不是'\',则在最后加上一个'\'
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
}
bool CBrowseDir::SetInitDir(const char *dir)
{
//先把dir转换为绝对路径
if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
return false;
//判断目录是否存在
if (_chdir(m_szInitDir) != 0)
return false;
//如果目录的最后一个字母不是'\',则在最后加上一个'\'
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
return true;
}
bool CBrowseDir::BeginBrowse(const char *filespec)
{
ProcessDir(m_szInitDir,NULL);
return BrowseDir(m_szInitDir,filespec);
}
bool CBrowseDir::BrowseDir(const char *dir,const char *filespec)
{
_chdir(dir);
//首先查找dir中符合要求的文件
long hFile;
_finddata_t fileinfo;
if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
{
do
{
//检查是不是目录
//如果不是,则进行处理
if (!(fileinfo.attrib & _A_SUBDIR))
{
char filename[_MAX_PATH];
strcpy(filename,dir);
strcat(filename,fileinfo.name);
cout << filename << endl;
if (!ProcessFile(filename))
return false;
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
//查找dir中的子目录
//因为在处理dir中的文件时,派生类的ProcessFile有可能改变了
//当前目录,因此还要重新设置当前目录为dir。
//执行过_findfirst后,可能系统记录下了相关信息,因此改变目录
//对_findnext没有影响。
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
{
do
{
//检查是不是目录
//如果是,再检查是不是 . 或 ..
//如果不是,进行迭代
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name,".") != 0 && strcmp
(fileinfo.name,"..") != 0)
{
char subdir[_MAX_PATH];
strcpy(subdir,dir);
strcat(subdir,fileinfo.name);
strcat(subdir,"\\");
ProcessDir(subdir,dir);
if (!BrowseDir(subdir,filespec))
return false;
}
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
return true;
}
bool CBrowseDir::ProcessFile(const char *filename)
{
return true;
}
void CBrowseDir::ProcessDir(const char
*currentdir,const char *parentdir)
{
}
//从CBrowseDir派生出的子类,用来统计目录中的文件及子目录个数
class CStatDir:public CBrowseDir
{
protected:
int m_nFileCount; //保存文件个数
int m_nSubdirCount; //保存子目录个数
public:
//缺省构造器
CStatDir()
{
//初始化数据成员m_nFileCount和m_nSubdirCount
m_nFileCount=m_nSubdirCount=0;
}
//返回文件个数
int GetFileCount()
{
return m_nFileCount;
}
//返回子目录个数
int GetSubdirCount()
{
//因为进入初始目录时,也会调用函数ProcessDir,
//所以减1后才是真正的子目录个数。
return m_nSubdirCount-1;
}
protected:
//覆写虚函数ProcessFile,每调用一次,文件个数加1
virtual bool ProcessFile(const char *filename)
{
m_nFileCount++;
return CBrowseDir::ProcessFile(filename);
}
//覆写虚函数ProcessDir,每调用一次,子目录个数加1
virtual void ProcessDir
(const char *currentdir,const char *parentdir)
{
m_nSubdirCount++;
CBrowseDir::ProcessDir(currentdir,parentdir);
}
};
void main()
{
//获取目录名
char buf[256];
printf("请输入要统计的目录名:");
gets(buf);
freopen("output.txt","w",stdout);
//构造类对象
CStatDir statdir;
//设置要遍历的目录
if (!statdir.SetInitDir(buf))
{
puts("目录不存在。");
return;
}
//开始遍历
statdir.BeginBrowse("*.*");
// printf("文件总数: %d\n子目录总数:%d\n",statdir.GetFileCount(),statdir.GetSubdirCount());
}
}
转载来自:http://blog.sina.com.cn/s/blog_62466e480100qqi6.html
ps:我的新博客地址:http://www.xinghaixu.com
相关推荐
C++遍历指定文件夹中的所有文件 遍历方法
C++遍历指定文件夹下的所有文
Linux 刚刚开始学,挺实用的。Linux-C++-遍历指定文件夹路径下的文件列表并将路径写到txt文件。 如果没有积分,请私信我留下邮箱,我会尽快发过去
环境 VS 2013,c++ 32位控制台程序,遍历目录下的全文件,并返回一个文件名vector,然后打印文件名和其后缀
遍历指定路径下的所有图像,并保存绝对路径!c++干净代码,可自行根据需要修改~
地三个参数为可选的输入参数,输入扩展名信息,扩展名格式为(.cpp, *.cpp, cpp)三者都可,大小写不区分,如果为空则输出目录下的所以文件,默认是输出所有文件 第四个参数为可选的输入参数,表明是否递归,如果为...
linux及win跟目录递归遍历文件和文件夹及子文件夹 自己用的,
这是一个用于获取指定目录下所有文件的信息的C++代码, 是用于linux系统的
这个是比较全面的,用来对文件进行删除!包括图片、文件夹、视频等等!
指定一个文件夹路径,设置替换信息,点击“替换”按钮则开始替换,还有导入导出替换信息。
VS2010下小项目,把*txt改为别的后缀可以遍历别的类型文件,path指定要遍历的文件夹
window下用于目录遍历的文件,只需指定根目录即循环遍历
内容索引:VC/C++源码,文件操作,遍历,目录树,FileTree 生成目录树结构的一个好范例,自动读取指定文件夹的内容,并遍历文件夹下的目录,最后生成TREE目录树结构。在XP下测试通过。
VC 文件目录遍历生成树菜菜单,生成目录树的VC 源码范例,自动读取指定文件夹下的所有目录和文件,并生成Tree目录树结构。PS注:示例程序读取的是“成绩表”文件夹下的目录和文件,因此在测试时候要把生成的exe从...
一个用于检查指定文件夹下面,指定类型文件的小函数。
文件浏览器,遍历指定目录下的所有文件并记录文件夹数和文件数
编写的初衷是因为用vc编译后留下了大量“没用”的其它格式的文件,太占用硬盘了,本人想找一个简便的方法删除之,就写了这个程序,应该说这个程序跟自己的想法还是有出入的,希望有志之士继续完善吧
使用VS2010编写, 功能:可以用来比较指定文件夹里文件的改变,包括文件增加、访问时间变化、大小变化等。 内容:文件遍历,odbc数据库操作,使用access作为数据库。
实例096 如何搜索指定目录下的隐藏文件 实例097 如何搜索文本文件中的字符串 实例098 如何替换文本文件中的字符串 实例099 如何将长文件名转换为短文件名 实例100 如何在文件打开对话框中选择多个文件 实例101 ...
2. 程序支持文件夹递归遍历,可以将所有叶子节点的路径提取出来统计,因此统计代码行的时候只需要指定项目文件根目录即可,不再需要将待统计的代码拷贝到指定目录下; 3. 程序采用分层的设计方案,模型层和视图层...