WIN32_FIND_DATA結構
關於文件的全部屬性信息,總計有以下以下9種:文件的標題名、文件的屬性(只讀、存檔,隱藏等)、文件的創建時間、文件的最後訪問時間、文件的最後修改時間、文件大小的高位雙字、文件大小的低位雙字、保留、保留。在這裏只有文件標題名和文件的長度可以通過CFile類比較方便的獲得,而對於其他幾種屬性的獲取和設置就無能爲力了。
在用findfirst()和findnext()函數去查找磁盤文件時經常使用的一個數據結構WIN32_FIND_DATA的成員變量裏包含了以上所有的文件屬性,因此可以通過這個結構作爲獲取和更改文件屬性的手段。該結構的內容如下:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes; //文件屬性
FILETIME ftCreationTime; // 文件創建時間
FILETIME ftLastAccessTime; // 文件最後一次訪問時間
FILETIME ftLastWriteTime; // 文件最後一次修改時間
DWORD nFileSizeHigh; // 文件長度高32位
DWORD nFileSizeLow; // 文件長度低32位
DWORD dwReserved0; // 系統保留
DWORD dwReserved1; // 系統保留
TCHAR cFileName[ MAX_PATH ]; // 長文件名
TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;
可以通過FindFirstFile()函數根據當前的文件存放路徑查找該文件來把待操作文件的相關屬性讀取到WIN32_FIND_DATA結構中去:
WIN32_FIND_DATA ffd ;
HANDLE hFind = FindFirstFile("c://test.dat",&ffd);
在使用這個結構時不能手工修改這個結構中的任何數據,結構對於開發人員來說只能作爲一個只讀數據,其所有的成員變量都會由系統完成填寫。在MSDN幫助中可以查找到關於WIN32_FIND_DATA結構的更加詳細的說明。
三、 文件屬性信息的獲取與更改
爲了更好的保存獲取到的文件屬性信息,對應於文件屬性構造一個自定義的FILE_INFO數據結構,獲取的屬性信息可暫存於此:
typedef struct _FILE_INFO {
TCHAR szFileTitle[128]; //文件的標題名
DWORD dwFileAttributes; //文件的屬性
FILETIME ftCreationTime; //文件的創建時間
FILETIME ftLastAccessTime; //文件的最後訪問時間
FILETIME ftLastWriteTime; //文件的最後修改時間
DWORD nFileSizeHigh; //文件大小的高位雙字
DWORD nFileSizeLow; //文件大小的低位雙字
DWORD dwReserved0; //保留,爲0
DWORD dwReserved1; //保留,爲0
} 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);
至於文件名的修改則更加簡單,直接在創建文件時在CreateFile()或CFile類的成員函數Open裏直接對文件名參數進行設置即可