[新手編程訓練項目]004——C語言文件夾文件信息輸出001:io庫中_finddata_t結構體的使用

日期: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()

此結構涉及名爲句柄的概念,以下解釋來自百度百科(= =)

“在程序設計中,句柄是一種特殊的智能指針 。當一個應用程序要引用其他系統(如數據庫、操作系統)所管理的內存塊或對象時,就要使用句柄。
句柄與普通指針的區別在於,指針包含的是引用對象的內存地址,而句柄則是由系統所管理的引用標識,該標識可以被系統重新定位到一個內存地址上。這種間接訪問對象的模式增強了系統對引用對象的控制。
關於_finddata_t的具體情況可以參考此的文章,這是引用別人的CSDN中講解的_finddata_t:http://blog.csdn.net/wzhwho/article/details/6372353


將信息寫入輸出文件時使用了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");
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章