摘要: 文件的屬性包括文件的產生修改和訪問時間以及讀寫隱現等,在DOS下文件的屬性可以用DOS命令加以修改,在WINDOWS下,可以通過右鍵的屬性改變一組文件和文件夾的讀寫屬性,但是卻不能修改文件的產生修改和訪問時間,並且不能修改子目錄下的文件和文件夾的屬性。本文基於Windows的API設計了通用的文件和文件夾的屬性(包括文件的產生修改和訪問時間以及讀寫隱現等)的修改方法,並實現了其Visual C++程序編碼。
---- 文件的屬性的修改具有廣泛的使用價值,修改文件的讀寫隱現等屬性,可以實現文件的保護和控制,尤其是修改文件的產生修改和訪問時間,可以避免因防病毒更改系統時間而造成的文件修改時間的紊亂所形成的不便,例如,對程序員來說,編譯時,系統有可能又重新編譯那些修改時間紊亂的文件,造成不必要的麻煩。
---- 一、應用的API函數
---- 1、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 );
該函數設置指定的文件的屬性信息。
---- 2、API中的時間函數組提供了有關時間轉換的眾多API函數,在本編碼中用到的該函數組中的函數有:
BOOL SystemTimeToFileTime( CONST SYSTEMTIME *,LPFILETIME );
該函數將系統時間轉換成文件時間,文件時間是一個64位長度的數,
表示從1601年1月1日起的時間偏移,以千萬分之一秒為單位。
BOOL LocalFileTimeToFileTime(CONST FILETIME *,LPFILETIME );
該函數將本時區的文件時間轉換成格林威治時間的文件時間。
BOOL SetFileTime( HANDLE,CONST FILETIME*,CONST FILETIME *,CONST FILETIME * );
該函數設置文件產生修改和訪問的時間。
---- 二、編碼實現
---- 1、首先建立一個基於對話框的工程,在對話框窗體中放置以下控制並通過類管理向導為這些控制添加適當變量:
文件名編輯框,輸入要改變的文件的全路徑,文件名中可以有通配符*和?。變量類型CString,名稱m_FILENAME;
修改包括子目錄文件的檢查框,變量類型BOOL,名稱m_DIRECTORY;
修改文件訪問時間檢查框,變量類型BOOL,名稱m_Access;
文件訪問時間日編輯框,變量類型BOOL,名稱m_ADAY;
文件訪問時間月編輯框,變量類型BOOL,名稱m_AMONTH;
文件訪問時間年編輯框,變量類型BOOL,名稱m_AYEAR;修改文件產生時間檢查框,變量類型BOOL,名稱m_CREATE;
文件產生時間日編輯框,變量類型BOOL,名稱m_CDAY;
文件產生時間時編輯框,變量類型BOOL,名稱m_CHOUR;
文件產生時間分編輯框,變量類型BOOL,名稱m_CMINUTE;
文件產生時間月編輯框,變量類型BOOL,名稱m_CMONTH;
文件產生時間秒編輯框,變量類型BOOL,名稱m_CSECOND;
文件產生時間年編輯框,變量類型BOOL,名稱m_CYEAR;
修改文件修改時間檢查框,變量類型BOOL,名稱m_MODIFY;
文件修改時間日編輯框,變量類型BOOL,名稱m_MDAY;
文件修改時間時編輯框,變量類型BOOL,名稱m_MHOUR;
文件修改時間分編輯框,變量類型BOOL,名稱m_MMINUTE;
文件修改時間月編輯框,變量類型BOOL,名稱m_MMONTH;
文件修改時間秒編輯框,變量類型BOOL,名稱m_MSECOND;
文件修改時間年編輯框,變量類型BOOL,名稱m_MYEAR;
修改文件屬性檢查框,變量類型BOOL,名稱m_PROPERTY;
文件隱藏屬性檢查框,變量類型BOOL,名稱m_HIDE;
文件只讀屬性檢查框,變量類型BOOL,名稱m_READ;
文件存檔屬性檢查框,變量類型BOOL,名稱m_SAVE;
文件系統屬性檢查框,變量類型BOOL,名稱m_SYSTEM;
執行更改的按鈕,點擊該按鈕後執行選定的更改操作。
以上成員變量可在對話類的構造函數中用當前系統時間予以初始化。
---- 2、在對話類中加入以下成員:
char filter[16];
int ChangeTheProperty(LPSTR Filename,BYTE bFlag=0) ;
其中成員變量filter用以存放帶通配符的文件名。
成員函數ChangeTheProperty中實現了帶通配符的文件的屬性的改變,考慮到要遍歷子目錄,
該函數采用了遞歸調用,並請注意參數bFlag,其缺省值為0,
1表示調用發生自子目錄。其實現如下:
int CChangePropertyDlg::Change
TheProperty(LPSTR FileName,BYTE bFlag)
{
////存放路徑
char pathname[MAX_PATH];
////存放全路徑文件名
char allname[MAX_PATH];
////初始化pathname
int num=strlen(FileName);
for(int i=num-1;i>=0;i--){
if(FileName[i]==´´)
break;
}
if(i==-1)
return 0;
strncpy(pathname,FileName,i+1);
pathname[i+1]=´´;
////查找並修改所有子目錄下符合條件的文件
D
[1] [2] [3] 下一頁