您的位置:首页 > 运维架构 > Linux

Linux生成以当前时间年/月/日命名的文件夹并向相应目录文件中写数据例程

2016-03-07 18:11 806 查看
功能需求:在linux下一切皆文件,由于需要向SD卡里面写数据,并且在相应的目录下要一天一个TXT文档。比如当前时间 2016年3月7日,则要生成一个以年为目录名的文件夹2016,然后在2016这个目录下在生成一个以月为目录名的文件夹03,然后在03这个目录下以当前日期命名的每天一个TXT文档。及每当年月日发生变化时,都会有新的文件夹和TXT文件同步生成。当时网上查了一下,这方面的资料不是很多,基本没找到例程,可能是比较简单,自己写了一个测试的小例程。

代码示例:

#include<stdio.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<time.h>
#include<string.h>
#include<stdlib.h>
#include<unistd.h>
#include <fcntl.h>

static int Syear = 0;
static int Smon = 0;
static int Sday = 0;

//把a和b拼接起来 拼接后放a中
void mystrcat(char a[],char b[])
{
int i=0,j=0;
while(a[i++]!='\0');

i--;

while(b[j]!='\0')
{
a[i++]=b[j++];
}

a[i]='\0';
}

//写数据
int Write_MinDate(char *paddr)
{
int ret = -1;
int fd;

fd = open(paddr, O_RDWR|O_CREAT,777);

lseek(fd,-2,SEEK_END);

ret = write(fd,"1234",sizeof("1234"));

write(fd,"\r\n", 4);
lseek(fd,-2,SEEK_END);
close(fd);

return ret;
}

int dir_init()//只初始化一次
{
char* IPath = "/home/";

int ret ;
int Iyear = 0;
int Imon = 0;
int Iday = 0;

char str[30] ={'\0'};
char str_Y[5] = {'\0'};
char str_M[5] = {'\0'};

time_t now;
struct  tm *Idatetime = NULL;

time(&now);
Idatetime = localtime(&now);

Iday = Idatetime->tm_mday;
Imon = Idatetime->tm_mon + 1;
Iyear = Idatetime->tm_year + 1900;

Syear = Iyear;
Smon = Imon;
Sday = Iday;

//printf("year:%d ,mon: %d, day: %d\n", Iyear, Imon, Iday);

sprintf(str_Y,"%02d",Iyear);//转化为字符串类型
sprintf(str_M,"%02d",Imon);

printf("year:%s ,mon: %s\n", str_Y, str_M);

mystrcat(str,IPath);
mystrcat(str,str_Y);

//首先创建一个年份目录
ret = mkdir(str,0755);//第一次初始化或者断电重启年份时间取当前年份

if(0 == ret)
{
printf("successful1!!!\n");
}

else
{
printf("fail1!!!\n");
}

mystrcat(str,"/");
mystrcat(str,str_M);

printf("Path: %s\n", str);

ret = mkdir(str,0755);//第一次初始化或者断电重启月份时间应该取当前月份

if(0 == ret)
{
printf("successful2!!!\n");
}

else
{
printf("fail2!!!\n");
}

}

int make_dir(struct tm* Mdatetime)
{
int ret;
int Myear = 0, Mmon = 0, Mday = 0;
char* MPath = "/home/";

char str_Year[5] = {'\0'};
char str_Mon[5] = {'\0'};
char str_Day[5] = {'\0'};
char MYstr[30] = {'\0'};//存储年路径
char MMstr[30] = {'\0'};//存储年/月路径
char MDstr[40] = {'\0'};//存储年/月/文件路径
char Mstr[30] = {'\0'};
int i = 0;

Mday = Mdatetime->tm_mday;
Mmon = Mdatetime->tm_mon + 1;
Myear = Mdatetime->tm_year + 1900;

sprintf(str_Year,"%d",Myear);//转化为字符串类型
sprintf(str_Mon,"%02d",Mmon);//两位数 不够补0
sprintf(str_Day,"%02d",Mday);

mystrcat(Mstr,MPath);
mystrcat(Mstr,str_Year);
memcpy(MYstr,Mstr, sizeof(Mstr));//将年份目录路径放入缓存

mystrcat(Mstr,"/");
mystrcat(Mstr,str_Mon);
memcpy(MMstr,Mstr, sizeof(Mstr));//将年/月份目录路径放入缓存

mystrcat(Mstr,"/");
mystrcat(Mstr,str_Day);
mystrcat(Mstr,".txt");
memcpy(MDstr,Mstr, sizeof(Mstr));//将年/月/日.txt目录路径放入缓存

printf("MYstr: %s\n", MYstr);
printf("MMstr: %s\n", MMstr);
printf("MDstr: %s\n", MDstr);

if(Syear == Myear)//当前时间年内
{
if(Smon == Mmon)
{
if(Sday == Mday)
{
//可以向里面写数据
Write_MinDate(MDstr);
}
else
{
Sday = Mday;
//新建TXT文件写数据
Write_MinDate(MDstr);
}
}

else
{
Smon = Mmon;//更新缓存里的月份
ret = mkdir(MMstr,0755);

if(Sday == Mday)
{
//可以向里面写数据
Write_MinDate(MDstr);
}
else
{
Sday = Mday;
//新建TXT文件写数据
Write_MinDate(MDstr);
}

for(i = 0; i < 30; i++)
{
Mstr[i] = '\0';
}
}
}

else //新的一年来到的情况
{
Syear = Myear;
ret = mkdir(MYstr,0755);//首先创建一个年份目录

if(Smon != Mmon)
{
Smon = Mmon;//更新缓存里的月份
ret = mkdir(MMstr,0755);//首先创建一个月份目录

if(Sday == Mday)
{
//可以向里面写数据
Write_MinDate(MDstr);
}
else
{
Sday = Mday;
//新建TXT文件写数据
Write_MinDate(MDstr);
}

for(i = 0; i < 30; i++)
{
Mstr[i] = '\0';
}
}

else//这种情况 正常下是不可能出现
{
ret = mkdir(MMstr,0755);//首先创建一个月份目录

if(Sday == Mday)
{
//可以向里面写数据
Write_MinDate(MDstr);
}
else
{
Sday = Mday;
//新建TXT文件写数据
Write_MinDate(MDstr);
}

for(i = 0; i < 30; i++)
{
Mstr[i] = '\0';
}
}
}
return 0;
}

void main()
{
int ret = -2;

time_t now;
struct  tm *datetime = NULL;

dir_init( );

while(1)
{
time(&now);
datetime = localtime(&now);

if(datetime->tm_sec == 0)
{
make_dir(datetime);
printf("Min:%d\n", datetime->tm_min);
}

usleep(800000);
}
}


代码稍微有点长,功能测试用,仅供参考,代码写的不是很紧凑!

gcc mkdir.c -o mkdir //编译生成目标文件

切换到root用户: su root

设置系统时间:

例程的目标是在home目录下生成/home/2016/12/31.txt,

date -s "2016-12-31 23:58:00"

两分钟后查看home目录是否有/home/2017/01/01.txt文件

提示:程序也要切换到root下运行,或者更改home目录权限



运行效果图:



home目录下已经生成了2016这个目录



2017目录也生成了



生成了相应TXT文件,TXT文件也有相应数据,目录文件名可以根据情况自己定!

很简单的一个例子,涉及到的面有字符串处理,文件编程等,关于上面用到的API函数有兴趣可以自己百度。太简单懒得写了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息