Linux生成以當前時間年/月/日命名的資料夾並向相應目錄檔案中寫資料例程
阿新 • • 發佈:2019-02-13
功能需求:在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函式有興趣可以自己百度。太簡單懶得寫了。