日期:2017年9月10日
任務目標:編寫一個程序可以讀取指定文件夾內指定或未指定類型(*.*)的文件信息,如:文件名、文件大小、創建日期、修改日期、最後訪問日期等。
編程環境:Windows 10 Enterprise、Visual Studio 2017 Enterprise、編譯字符集Unicode
這是第一次學習使用io.h庫,跟stdio.h不一樣,這個io.h不是標準C的頭文件,在windows下簡單搜索了一下,最大的可能是VC的runtime的頭文件。
(emmm具體情況還不太清楚。。。)
這個程序還是用到了前面寫過的動態輸入名稱函數get_name()。
可以調用_finddata_t 結構體得到文件的基本信息,
在corecrt_io.h頭文件中,此結構體的定義爲:
struct _finddata64i32_t
{
unsigned attrib;
__time64_t time_create; // -1 for FAT file systems
__time64_t time_access; // -1 for FAT file systems
__time64_t time_write;
_fsize_t size;
char name[260];
};
得到信息調用了三個函數:_findfirst()、_findnext()和_fineclose()
此結構涉及名爲句柄的概念,以下解釋來自百度百科(= =)
將信息寫入輸出文件時使用了fprintf()函數,用法和fread()和fwrite()差不多。
1.在初次輸出時出現了無法換行的問題,因此使用了\r\r\n的方式換行。
2.在初次輸出時還出現了文件夾內第一個文件的信息爲輸出的問題,後來發現是在_findfirst()後未輸出導致缺少一個文件信息。
3.此版本的代碼應該還不太完善,如遇到問題還會繼續修改。
#pragma warning(disable:4996) //VS 編譯聲明?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <io.h>
#include <time.h>
struct _finddata_t;
char* get_name(void) //不定長輸入地址
{
char *name, *temp;
int j = 1;
name = (char*)malloc(sizeof(char)*(j + 1));
if (NULL == name)
{
exit(1);
}
while ((name[j - 1] = getchar()) != '\n')
{
j++;
temp = (char*)malloc(j + 1);
if (NULL == temp)
{
exit(1);
}
name[j - 1] = '\0';
strcpy(temp, name);
free(name);
name = (char*)malloc(sizeof(char)*(j + 1));
if (NULL == name)
{
exit(1);
}
strcpy(name, temp);
free(temp);
}
name[j - 1] = '\0';
return(name);
}
void Output_info(void)
{
char * file_loc, *file_type, *file_add;
int loc_len, type_len;
printf("$$$$$ 輸入文件夾地址(./****/) $$$$$\n"); //文件地址
file_loc = get_name();
loc_len = strlen(file_loc);
printf("$$$$$ 輸入要查找的文件類型(*.xxxx) $$$$$\n"); //文件類型
file_type = get_name();
type_len = strlen(file_type);
file_add = (char*)malloc(loc_len+type_len+1);
if (NULL == file_add)
{
exit(1);
}
strcpy(file_add, file_loc);
strcat(file_add, file_type);
printf("file_add test output: %s\n", file_add);
/*################### 建立輸出文件"Output_file.txt" ###################*/
FILE *fp;
printf("##### Building Output_file.txt #####\n"); //狀態標識
if ((fp = fopen("Output_file.txt", "wb")) == NULL) // 打開輸出文件並使fp指向此文件
{
printf("##### Building failure ! #####\n"); // 如果打開時出錯,就輸出"打不開"的信息
exit(0); // 終止程序
}
//char headline[] = {"文件名\t\t\t\t文件大小\t\t創建日期\t\t修改日期\t\t訪問日期\n"};
//fprintf(fp, "%s\r\r\n", headline);
//fprintf(fp, "\n");
/*################### 將文件夾內文件信息加入到文件Output_file中 ###################*/
struct _finddata_t fileinfo; //文件存儲信息結構體
long fHandle; //保存文件句柄
int i = 0; //文件數記錄器
time_t Time_create, Time_write, Time_access; //時間格式
if ((fHandle = _findfirst(file_add, &fileinfo)) == -1L)
{
printf("當前目錄下沒有該類型的文件\n");
exit(0);
}
else
{
Time_create = time(&fileinfo.time_create);
Time_write = time(&fileinfo.time_write);
Time_access = time(&fileinfo.time_access);
fprintf(fp, "找到文件:%-s\r\r\n 文件大小:%-6d KB, 創建日期:%s, 修改日期:%s, 訪問日期:%s.\r\r\n", fileinfo.name, (fileinfo.size)/1000, ctime(&fileinfo.time_create), ctime(&fileinfo.time_write), ctime(&fileinfo.time_access));
while (_findnext(fHandle, &fileinfo) == 0)
{
Time_create = time(&fileinfo.time_create);
Time_write = time(&fileinfo.time_write);
Time_access = time(&fileinfo.time_access);
i++;
fprintf(fp, "\r\r\n找到文件:%-s\r\r\n 文件大小:%-6d KB, 創建日期:%s, 修改日期:%s, 訪問日期:%s.\r\r\n", fileinfo.name, (fileinfo.size)/1000, ctime(&fileinfo.time_create), ctime(&fileinfo.time_write), ctime(&fileinfo.time_access));
//printf("找到文件:%30s,文件大小:%10d,創建日期:%10d,修改日期:%10d,訪問日期:%10d\n", fileinfo.name, fileinfo.size,fileinfo.time_create,fileinfo.time_write,fileinfo.time_access);
}
}
_findclose(fHandle); //關閉文件
printf("文件數量:%d\n", i);
/*################### 關閉文件Output_file ###################*/
fclose(fp);
}
int main(void)
{
printf("##### Program initiating #####\n");
Output_info();
system("pause");
}