1. 程式人生 > >Linux生成以當前時間年/月/日命名的資料夾並向相應目錄檔案中寫資料例程

Linux生成以當前時間年/月/日命名的資料夾並向相應目錄檔案中寫資料例程

功能需求:在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函式有興趣可以自己百度。太簡單懶得寫了。