您的位置:首页 > 其它

按照文件修改时间遍历文件夹,进行文本连接

2012-04-24 15:57 369 查看
有一次在处理文本的时候,遇到一个尴尬的事,有几十个txt文本,是程序生成的log日志,现在领导需要审查log,哎,我当时傻得很,把这几十个txt一个一个的连接到一个文件中,当时同事打岔还差点弄错了。。。

我之前写过一篇C++中读入一个文件夹下多个文件的数据操作(文件夹遍历)
的文章,主要是介绍遍历一个文件夹下面的文件的,可是当时这方法不能按照理想的修改时间来操作文本,于是上网找了一些资料,未果。。。就自己琢磨了一下,我首先看了一下window API中的一些文件的操作,现在先给大家简单介绍一下吧,首先是_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];   
};

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是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。

以上出自百度百科

之后先介绍一下基本的文件夹遍历的方法吧,还是可以参考之前写的文章C++中读入一个文件夹下多个文件的数据操作(文件夹遍历)

#include <iostream>
#include <string>
#include <fstream>
#include <io.h>
using namespace std;

//传入文件路径及文件名,按行输出文件中内容
void GetLineAndPrint(string in_name)
{
ifstream fin(in_name);
if(!fin)
{
cerr<<"open file error"<<endl;
exit(-1);
}
string str;
while(getline(fin,str))
{
cout<<str<<endl;
}
}

int main()
{
struct _finddata_t fileinfo;
string in_path;
string in_name;
cin>>in_path;
string curr = in_path+"\\*.txt";
long handle;
if((handle=_findfirst(curr.c_str(),&fileinfo))==-1L)
{
cout<<"没有找到匹配文件!"<<endl;
return 0;
}
else
{
in_name = in_path + "\\" + fileinfo.name ;
GetLineAndPrint(in_name);
while(!(_findnext(handle,&fileinfo)))
{
in_name = in_path + "\\" +fileinfo.name;
GetLineAndPrint(in_name);
}
_findclose(handle);
}

}


之后我想了想,既然可以获取文件夹下文件的名字,又看了一下_finddata_t这个结构体,发现也可以获取文件的修改时间,那么我就想着把修改时间先排序一下,再做文件夹的遍历就可以操作文件了,恩,很聪明!相信也有许多朋友都想到了!

我用到的方法是将文件名和文件的修改时间捆绑在一起做排序操作,之后进行文件的操作,话不多说了,上传代码:

#include <iostream>
#include <string>
#include <fstream>
#include <io.h>

using namespace std;

ofstream result("out.txt",ios::app);//定义全局变量,连续写文件

void WriteFile(string in_file) //写文件
{
ifstream fin(in_file);
string str;
while(getline(fin,str))
{
result<<str<<endl;
}
}
//将文件夹下文件名和文件修改时间捆绑在一起做冒泡排序
void Bubble_Sort(long time_write_array[], string in_file_array[], int len)
{
int i,j;
long temp;
string str;
for(i=0;i<len-1;i++)
{
for(j=0;j<len-i-1;j++)
{
if(time_write_array[j]>time_write_array[j+1])
{
temp = time_write_array[j];
str = in_file_array[j];
time_write_array[j] = time_write_array[j+1];
in_file_array[j] = in_file_array[j+1];
time_write_array[j+1] = temp;
in_file_array[j+1] = str;
}
}
}
}

int main()
{
struct _finddata_t fileinfo;
char cin_path[100];//输入文件路径
cout<<"请输入要处理的文件夹路径: "<<endl;
cin>>cin_path;
string in_path = cin_path;
string curr = in_path+"\\*.txt";
long handle;
int i = 0;
int j = 0;
string in_file_array[1000]; //存储输入文件的绝对路径
long time_write_array[1000];  //存储文件的修改时间

//遍历文件夹
if((handle=_findfirst(curr.c_str(),&fileinfo))==-1L)
{
cout<<"没有找到匹配文件!请检查配置文件路径设置,以及该路径下是否有待处理文件."<<endl;
system("PAUSE");
return 0;
}
else
{
string in_file = in_path + "\\" + fileinfo.name ;
in_file_array[i++] = in_file;
time_write_array[j++] = fileinfo.time_write;
while(!(_findnext(handle,&fileinfo)))
{
in_file = in_path + "\\" +fileinfo.name;
in_file_array[i++] = in_file;
time_write_array[j++] = fileinfo.time_write;
}
_findclose(handle);

}
Bubble_Sort(time_write_array,in_file_array,i);
cout<<"\n连接的文件按先后顺利列出如下:"<<endl;
//将排序好的文件进行连接操作
for(int k=0;k<i;k++)
{
cout<<in_file_array[k]<<endl;
WriteFile(in_file_array[k]);
}
system("pause");
return 0;

}


以上是我做的一个文本连接工具,是按照文本修改的先后顺序进行连接的!

如果大家有什么意见或者建议请留言,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: