c++ windows文件夹的遍历

先看例子,该例子功能是将指定的文件夹内的文件移动到新的文件里

#include <io.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <direct.h>
#include <sys/stat.h>
#include <string>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <map>
using namespace std;

static map<string,string> file;

int isdir(const char* s)
{
struct stat mstat;
stat(s,&mstat);
if(mstat.st_mode & S_IFDIR)
{
return 1;
}
else
{
return 0;
}


}

int opend(const char* s)
{
string s1 = s;
string::size_type pos = s1.find_last_of("/"); 
s1 = s1.substr(0,pos);
_finddata_t mdata;

int filesign = _findfirst(s,&mdata);


if(filesign == -1)
{
return 0;
}
while(strcmp(mdata.name,".")==0 || strcmp(mdata.name,"..")==0)
{
if(-1 == _findnext(filesign,&mdata))
return 0;
}
do
{
string s3 = s1+ "/"+string(mdata.name);
if(1==isdir(s3.c_str()))
{
string s2=s3+"/*";
opend(s2.c_str());
}
else
{
file.insert(pair<string,string>(s3,string("e:/code/")+string(mdata.name)));
}
}while(_findnext(filesign,&mdata) == 0);
}

void copyfile()
{
/* char c;
map<string,string>::iterator it = file.begin();
for(;it!=file.end();++it)
{
FILE* fp = fopen(it->first.c_str(),"r");
FILE* fp1 = fopen(it->second.c_str(),"w");
while(1)
{
c = fgetc(fp);
if(c == EOF)
{
break;
}
else
{
fputc(c,fp1);
}


}
fclose(fp);
fclose(fp1);
}
*/
char* sss = (char*)malloc(500);
map<string,string>::iterator it = file.begin();
for(;it!=file.end();++it)
{
ofstream fout(it->second.c_str(),ios::out);
ifstream fin(it->first.c_str(),ios::in);


while(fin.peek()!= EOF)
{
fin.getline(sss,500);
fout<<sss<<"\n";
}
fout.close();
fin.close();
}
}

int main(int argc,char*argv[])
{
FILE* fp = fopen("e:/abc.txt","r");
char* filename = (char*)malloc(200);
memset(filename,0,200);
fgets(filename,100,fp);
string fullname = string(filename)+string("/*");

fclose(fp);
_mkdir("e:/code");
opend(fullname.c_str());

copyfile();

free(filename);


return 0;
}


函数说明:

struct _finddata_t 是用来存储文件各种信息的 结构体。定义如下:
struct _finddata_t
{
unsigned attrib;
time_t time_create;
time_t time_access;
time_t time_write;
_fsize_t size;
char name[_MAX_FNAME];
};
其中各 成员变量的含义如下:
unsigned attrib:
文件属性的存储位置。它存储一个 unsigned单元,用于表示文件的属性。
文件属性是用位表示的,主要有以下一些:
_A_ARCH(存档)
_A_HIDDEN(隐藏)
_A_NORMAL(正常)
_A_RDONLY(只读)
_A_SUBDIR(文件夹)
_A_SYSTEM(系统)
这些都是在头文件中定义的宏,可以直接使用,而本身的意义其实是一个无符号 整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY | _A_SYSTEM 。
time_t time_create:
这里的time_t是一个变量类型( 长整型?相当于long int?),用来存储时间的,我们暂时不用理它,只要知道,这个time_create变量是用来存储文件创建时间的就可以了。
time_t time_access:文件最后一次被访问的时间。
time_t time_write:文件最后一次被修改的时间。
_fsize_t size:文件的大小。这里的_fsize_t应该可以相当于unsigned 整型,表示文件的字节数。
char name[_MAX_FNAME]:文件的文件名。这里的_MAX_FNAME是一个 常量宏,它在头文件中被定义,表示的是文件名的最大长度。
头文件引用: #include "io.h"
int _findfirst(const char* s,struct _finddata_t* mode);
获取该文件夹里的第一个实例,存放在mode里,成功返回实例的句柄,失败返回-1.
int _findnext( intptr_t handle, struct _finddata_t *mode );
从_findfirst里返回的句柄里获取下一个实例,将信息存放在mode里。
结构体stat
struct stat {
dev_t         st_dev;       //文件的设备编号
    ino_t         st_ino;       //节点
    mode_t        st_mode;      //文件的类型和存取的权限
    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1
    uid_t         st_uid;       //用户ID
    gid_t         st_gid;       //组ID
    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号
    off_t         st_size;      //文件字节数(文件大小)
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小)
    unsigned long st_blocks;    //块数
    time_t        st_atime;     //最后一次访问时间
    time_t        st_mtime;     //最后一次修改时间
    time_t        st_ctime;     //最后一次改变时间(指属性)
};
int stat(const char * file_name, struct stat *buf);
获取文件及文件夹的信息,放在buf里。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值