必须先创建目录./Files, 不然程序会崩溃。
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <cstdio>
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <time.h>
using namespace std;
//全局变量
static int g_iFileCount; //文件个数
static std::vector<std::string> g_vsFileList; //文件列表
static std::string g_sFileDirectory("./Files/"); //文件目录
/*
为文件名编号
@param sFileName 文件名
@return 编号
@note 标准文件名格式:“2018-11-15 14-58-53.txt” ,编号:20181115145853
@note 特殊文件名格式:“.” 编号:0
@note 特殊文件名格式:“..” 编号:1
@note 其它文件名格式: 编号:2
*/
size_t GetFileNameID(std::string sFileName)
{
if(sFileName == ".")
return 0;
else if(sFileName == "..")
return 1;
else if(sFileName.size() != std::string("2018-11-15 14-58-53.txt").size())
return 2;
size_t ulID = 0;
int iNum;
char cFiltration;
std::vector<int> viData;
std::stringstream ssStream(sFileName);
for(int i = 0; i != 6; ++i)
{
ssStream >> iNum; //读出数据
if(i != 2)
{
ssStream >> cFiltration; //读取数据后面跟着的符号
// cout << "iNum:" << iNum << " " << "cFiltration:" << cFiltration << endl;
if((cFiltration != '-' && cFiltration != ' ' && cFiltration != '.') || (ssStream.fail()))
return 2;
}
viData.push_back(iNum);
}
ulID += viData[0] * 10000000000;
ulID += viData[1] * 100000000;
ulID += viData[2] * 1000000;
ulID += viData[3] * 10000;
ulID += viData[4] * 100;
ulID += viData[5];
return ulID;
}
/*
遍历目录
@param path 路径
@param files 保存路径下的文件名
@return 无
*/
void ScanDir(const std::string path, std::vector<std::string> &files)
{
DIR *dir;
struct dirent *ptr;
dir = opendir(path.c_str()); //打开目录
files.clear(); //清空文件列表
while((ptr = readdir(dir)) != NULL) //读取目录下文件
{
files.push_back(ptr->d_name);
}
closedir(dir);
g_iFileCount = files.size() - 2; //保存文件数量,减2是减去目录中的 “.” “..”
std::vector<size_t> vulFileID;
for(auto i = files.cbegin(); i != files.cend(); ++i) //文件名编号
{
vulFileID.push_back(GetFileNameID(*i));
}
for(int i = 0; i < vulFileID.size() - 1; ++i) //冒泡排序
{
for(int j = 0; j < vulFileID.size() - 1 - i; ++j)
{
if(vulFileID[j] > vulFileID[j + 1])
{
size_t ulTemp = vulFileID[j];
vulFileID[j] = vulFileID[j + 1];
vulFileID[j + 1] = ulTemp;
std::string sTemp = files[j];
files[j] = files[j + 1];
files[j + 1] = sTemp;
}
}
}
}
/*
打印目录下的文件
@param files 保存路径下的文件
@return 无
*/
void PrintFiles(const std::vector<std::string> &files)
{
if(g_iFileCount)
std::cout << "当前目录下有" << g_iFileCount << "个文件,它们是:" << std::endl;
else
std::cout << "当前目录下没有文件!" << std::endl;
for(auto i = files.cbegin(); i != files.cend(); ++i)
{
if((*i != ".") && (*i != ".."))
std::cout << *i << std::endl;
}
}
/*
获取系统当前时间
@param 无
@return 时间
*/
std::string GetSystemTime()
{
time_t timep;
time (&timep);
char tmp[64];
strftime(tmp, sizeof(tmp), "%Y-%m-%d %H-%M-%S",localtime(&timep) );
return tmp;
}
/*
检查目录中文件数量是否达到最大数量,如果达到则删除一个文件
@param iMaxFileCount 最大文件数量
@return 无
*/
void CheckFileCount(int iMaxFileCount)
{
ScanDir(g_sFileDirectory, g_vsFileList); //扫描目录,填充文件列表
if(g_iFileCount >= iMaxFileCount) //检查数量
{
for(auto i = g_vsFileList.begin(); i != g_vsFileList.end(); ++i)
{
if((*i != ".") && (*i != ".."))
{
std::string sFile(g_sFileDirectory);
sFile += *i;
if(!remove(sFile.c_str()))
{
std::cout << "删除文件" << sFile << "成功!" << std::endl;
}
else
{
std::cout << "删除文件" << sFile << "失败!" << std::endl;
}
break;
}
}
}
}
/*
创建文件
@param 无
@return 0 成功
@return 1 失败
*/
int CreateNewFile()
{
std::string sFileNmae(g_sFileDirectory);
sFileNmae += std::string(GetSystemTime()) + ".txt";
ofstream fsStream(sFileNmae);
if(fsStream.is_open())
{
fsStream.close();
std::cout << "创建文件" << sFileNmae << "成功!" << std::endl;
return 0;
}
else
{
std::cout << "创建文件" << sFileNmae << "失败!" << std::endl;
return 1;
}
}
/*
main
@param argc 命令个数
@param argv 命令内容
@return 0
*/
int main(int argc, char **argv)
{
CheckFileCount(5); //检测目录中是否达到5个文件,达到了则删除一个文件
CreateNewFile(); //创建一个新文件
ScanDir(g_sFileDirectory, g_vsFileList);
PrintFiles(g_vsFileList); //打印文件目录
return 0;
}