檔案是資料在磁碟上最常用的一種存放形式,也是在程式設計中與之經常打交道的一種程式設計物件,不少程式尤其是資料傳輸和處理類的應用程式更是需要頻繁的建立、讀取和寫入檔案。對於一些要求不是很嚴格的程式,我們往往只關心檔案的內容是否正確、檔案大小是否有增減或是再嚴格一些,看檔名是否符合規定等等。以上這些要素對於大多數程式而言顯然是可以滿足實際需求的,但對於某些特殊行業的一些有著比較嚴格要求的軟體系統,僅有以上要素還是遠遠不夠的,往往還需要對檔案的所有屬性諸如檔案的建立時間、檔案的最後訪問時間、檔案的最後修改時間、檔案的讀寫、檔案的隱現等等進行提取處理與重新設定。例如,修改檔案的讀寫隱現等屬性,可以實現檔案的保護和控制,尤其是修改檔案的產生修改和訪問時間,可以避免因防病毒更改系統時間而造成的檔案修改時間的紊亂所形成的不便。在dos下檔案的屬性可以用dos命令加以修改,在windows下,可以通過右鍵的屬性改變一組檔案和資料夾的讀寫屬性,但是卻不能修改檔案的產生修改和訪問時間,並且不能修改子目錄下的檔案和資料夾的屬性。
本例項基於windows的api,設計了通用的檔案和資料夾的屬性(包括檔案的產生修改和訪問時間以及讀寫隱現等)的修改方法,並實現了其visual c++程式編碼。程式執行後,點選"修改屬性"按鈕,就可以將專案資料夾中的"2.doc"文件的屬性修改的與"1.doc"文件一致。
一、實現方法
關於檔案的全部屬性資訊,總計有以下以下9種:檔案的標題名、檔案的屬性(唯讀、存檔,隱藏等)、檔案的建立時間、檔案的最後訪問時間、檔案的最後修改時間、檔案大小的高位雙字、檔案大小的低位雙字、保留、保留。在這裡只有檔案標題名和檔案的長度可以通過cfile模擬較方便的獲得,而對於其他幾種屬性的獲取和設定就無能為力了。
windows中的api函式組提供了用於檔案讀寫、屬性設定的眾多api函式,例如:
handle createfile( lpctstr, dword, dword,lpsecurity_attributes, dword,dword,handle );
該函式產生或者開啟乙個系統物件,並返回乙個用以訪問該物件的控制代碼,這些物件可以是檔案、資料夾、管道等。
handle findfirstfile( lpctstr, lpwin32_find_data );
該函式在指定目錄尋找與指定檔名匹配的檔案和資料夾,並返回乙個查詢控制代碼。
bool findnextfile( handle,lpwin32_find_data );
該函式繼續乙個由查詢控制代碼指定的查詢過程。
bool findclose( handle );
該函式關閉指定的查詢控制代碼,結束指定的查詢。
dword getfileattributes( lpctstr );
該函式檢取指定的檔案的屬性資訊。
bool setfileattributes( lpctstr,dword );
該函式設定指定的檔案的屬性資訊。
windows中的api函式組提供了有關時間轉換的眾多api函式,例如:
bool systemtimetofiletime( const systemtime *,lpfiletime );
該函式將系統時間轉換成檔案時間,檔案時間是乙個64位長度的數,表示從2023年1月1日起的時間偏移,以千萬分之一秒為單位。
bool localfiletimetofiletime(const filetime *,lpfiletime );
該函式將本時區的檔案時間轉換成格林威治時間的檔案時間。
bool setfiletime( handle,const filetime*,const filetime *,const filetime * );
該函式設定檔案產生修改和訪問的時間。 至於檔名的修改則更加簡單,直接在建立檔案時在createfile()或cfile類的成員函式open裡直接對檔名引數進行設定即可。
在上面的函式中,findfirstfile()和findnextfile()使用的乙個資料結構win32_find_data成員變數裡包含了以上所有的檔案屬性,因此可以通過這個結構作為獲取和更改檔案屬性的手段。該結構的內容如下:
typedef struct _win32_find_data win32_find_data, *pwin32_find_data;
win32_find_data ffd ;
handle hfind = findfirstfile("c: est.dat",&ffd);
在使用這個結構時不能手工修改這個結構中的任何資料,它對於開發人員來說只能作為乙個唯讀資料,其所有的成員變數都會由系統完成填寫。在msdn幫助中可以查詢到關於win32_find_data結構的更加詳細的說明。
為了更好的儲存獲取到的檔案屬性資訊,對應於檔案屬性構造乙個自定義的file_info資料結構,獲取的屬性資訊可暫存於此:
typedef struct _file_info file_info, * pfile_info;
首先用findfirstfile()函式將檔案屬性獲取到win32_find_data 結構物件findfiledata中去,之後可以用findclose()將其關閉,並把findfiledata中的有關檔案屬性資訊的內容複製到自定義結構file_info的結構物件fileinfo中備用。下面是關於這部分描述的部分關鍵**:
//宣告結構物件
file_info fileinfo;
win32_find_data findfiledata;
……//獲取檔案屬性資訊
findclose(findfirstfile("test.txt",&findfiledata));
memset(&fileinfo,0,sizeof(file_info));
……//將檔案屬性資訊儲存到fileinfo中備用
strcpy(fileinfo.szfiletitle,myfile.getfiletitle());
fileinfo.dwfileattributes = findfiledata.dwfileattributes;
fileinfo.ftcreationtime = findfiledata.ftcreationtime;
fileinfo.ftlastaccesstime = findfiledata.ftlastaccesstime;
fileinfo.ftlastwritetime = findfiledata.ftlastwritetime;
fileinfo.nfilesizehigh = findfiledata.nfilesizehigh;
fileinfo.nfilesizelow = findfiledata.nfilesizelow;
…… 在獲取到檔案的原始屬性資訊後既可以原封不動的將屬性重新寫到檔案,也可以對其中某一項或某幾項屬性內容進行修改後再行寫入檔案,從而達到更改檔案屬性的目的。比如可以用setfiletime()函式設定檔案的建立時間、最近一次訪問時間以及最近一次修改的時間等等:
setfiletime((handle)destfile.m_hfile, //待寫入的檔案控制代碼
&fileinfo.ftcreationtime, //檔案的建立時間
&fileinfo.ftlastaccesstime, //檔案最近一次的訪問時間
&fileinfo.ftlastwritetime); //檔案最近一次的修改時間
也可以用setfileattributes() 函式實現對檔案屬性的修改:
setfileattributes(fileinfo.szfiletitle,fileinfo.dwfileattributes);
二、程式設計步驟
1、啟動visual c++6.0,生成乙個基於對話方塊的應用程式,命名為"file";
2、修改對話方塊介面,在其上放置乙個按鈕控制項,caption設定為"修改屬性",然後使用class wizard為該按鈕新增滑鼠單擊訊息響應函式;
3、在專案資料夾中放置"1.doc"、"2.doc"檔案;
4、新增**,編譯執行程式。
三、程式**
/////////////////////////////////////
void cfiledlg::ontest()
四、小結
本文通過對win32_find_data結構和setfiletime()、setfileattributes()等主要函式實現了對磁碟檔案的相關屬性資訊的獲取與修改。用此技術可以在通訊等對檔案有嚴格要求的應用領域實現檔案或資料夾的全部資訊(包括檔案內容、檔名以及檔案屬性等)的完整傳送。
VC獲取指定資料夾路徑
vc獲取指定資料夾路徑 flyfish 2010 3 5 一 使用shell函式 1 獲取應用程式的安裝路徑 tchar buf max path shgetspecialfolderpath null,buf,csidl program files,null afxmessagebox buf 2...
VC 判斷檔案或資料夾是否存在
在windows應用專案中,幾乎總會需要用到一些檔案系統相關的函式,如 判斷檔案是否存在,判斷資料夾是否為空,刪除資料夾及其所有子項,計算資料夾的大小,等等。不知為何,windows並未提供直接的api來完成這些操作,於是,江湖上開始創立起各種流派,一片刀光劍影。大道流 getfileattribu...
列舉資料夾,列舉指定資料夾
一 列舉資料夾函式 void specialfolder browse hwnd hwnd clean up.g pmalloc free pidlspecialfolder g pmalloc free lpbuffer release the shell s allocator.g pmallo...