>_< 為了獲取文件屬性,用戶可以使用GetFileAttributes與GetFileAttributesEx函數。
GetFileAttributesEx函數除了返回文件屬性外,還返回文件時間信息、文件大小等。
GetFileAttributesEx將返回結果保存在WIN32_FILE_ATTRIBUTE DATA結構中。
>_< 獲取的文件時間是以FILETIME格式存在的,如果要正確顯示,還需要對其時區進行調整,調整為本地時區,然后轉換為系統時間格式,便於顯示。
>_< 前面在獲取文件大小時已經介紹,NTFS文件系統使用了64位數據來表示文件大小。因為32位的數據最多只能表示4GB的大小。Windows將其分為了高32位和低32位,兩個都需要使用到,這一點尤其要在對大於4GB的文件操作時注意。
(1)GetFileAttributeS。
獲取文件或目錄的屬牲
◇參數
lpFileName:輸入參數,為需要獲取屬性的文件或目錄。 、
◇返回值
返回DWORD值,表示文件屬性。如果返回INVALID_FILE ATTRIBUTES,則表示失敗。可使用GetLastError函數獲取錯誤信息。
◇使用說明
要判斷文件具體有哪些屬性,需要使用“&”與屬性常量進行運算,如果運行結果為真,則表示具有這種屬性。
(2)GetFileAttributesEx。
獲取文件或目錄的屬性、時間、大小,以WIN32_FILE ATTRIBUTE_DATA結構的形式返回結果
◇參數
lpFileName:輸入參數,為需要獲取屬性的文件或目錄。
flnfoLevelId:輸入參數,是獲取文件屬性信息的類別,會影響到lpFileInformation參數具體采用什么形式輸出結果。但是本參數一般只能指定為GetFileExInfoStandard。
lpFileInformation:輸出參數,用於返回結果。如果flnfoLevelId參數指定為GetFileExInfoStandard,則為LPWIN32_FILE_ATTRIBUTE_ DATA類型。
◇返回值
返回BOOL值,表示是否成功。
(3) SetFileAttributes.
設置文件或目錄的屬性
◇參數
lpFileName:輸入參數,為需要設置屬性的文件或目錄。
dwFileAttributes:文件屬性值。
◇返回值
返回BOOL值,表示是否成功。
◇使用說明
文件系統中對文件屬性的表示使用了DWORD類型的數據,多個文件屬性使用“【”運算連接在一起
(4)FileTimeToLocalFileTime。
把文件時間轉換為本地的文件時間
◇參數
lpFileTime:輸入參數,為需要轉換的文件時間。
lpLocalFileTime:輸出參數,為指向轉換后的文件時間。
◇返回值
返回BOOL值,表示是否成功。
(5)FileTimeToSystemTime
將文件時間轉換為系統時間(SYSTEMTIME格式),便於顯示
◇參數
lpFileTime:輸入參數,指向需要轉換的文件時間。
lpSystemTime:輸出參數,指向轉換后的SYSTEMTIME。
◇返回值
返回BOOL值,表示是否成功。
>_< 關鍵數據結構
(1) FILETIM。
此結構用最小的數據量表示的時間,但是不便於用戶查看和顯示。通過API獲取的系統時間都是這種格式的。如果要使用顯示,可以使用FileTimeToSystemTime轉換為便於顯示的SYSTEMTIME結構
(2) SYSTEMTIME。
此結構使用了較為直觀的方式表示時間。
(3) WIN32_FILE ATTRIBUTE_DATA。
GetFileAttributesEx使用這個結構表示返回結果,包括文件屬性、文件創建時間、文件最后訪問時間、文件最后寫入時間和文件大小。
>>>本實例編譯完成后是一個可執行文件,運行時需輸入兩個參數,均是文件路徑,程序將第一個參數所指向的文件和目錄的屬性顯示出來,將第二個參數所指向的文件或目錄設置為隱藏和只讀。
1 // 獲取、設置文件屬性和時間 2 #include <windows.h> 3 #include <stdio.h> 4 5 /* 函數申明 */ 6 DWORD ShowFileTime(PFILETIME lptime); 7 DWORD ShowFileSize(DWORD dwFileSizeHigh,DWORD dwFileSizeLow); 8 DWORD ShowFileAttrInfo(DWORD dwAttribute); 9 DWORD SetFileHiddenAndReadonly(LPSTR szFileName); 10 11 /* ************************************ 12 * DWORD ShowFileAttributes(LPSTR szPath) 13 * 功能 獲取並顯示文件屬性, 14 * 調用ShowFileTime、ShowFileSize和 15 * ShowFileAttrInfo函數 16 * 17 * 參數 LPTSTR szPath,獲取並顯示此文件的屬性 18 * 19 * 返回值 0代表執行完成,1代碼發生錯誤 20 **************************************/ 21 DWORD ShowFileAttributes(LPSTR szPath) 22 { 23 //文件屬性結構 24 WIN32_FILE_ATTRIBUTE_DATA wfad; 25 printf("文件:%s\n",szPath); 26 //獲取文件屬性 27 if(!GetFileAttributesExA(szPath, 28 GetFileExInfoStandard, 29 &wfad)) 30 { 31 printf("獲取文件屬性錯誤:%d\n",GetLastError()); 32 return 1; 33 } 34 //顯示相關時間 35 printf("創建時間:\t"); 36 ShowFileTime(&(wfad.ftCreationTime)); 37 printf("最后訪問時間:\t"); 38 ShowFileTime(&(wfad.ftLastAccessTime)); 39 printf("最后修改時間:\t"); 40 ShowFileTime(&(wfad.ftLastWriteTime)); 41 //顯示文件大小 42 ShowFileSize(wfad.nFileSizeHigh,wfad.nFileSizeLow); 43 //顯示文件屬性 44 ShowFileAttrInfo(wfad.dwFileAttributes); 45 46 return 0; 47 } 48 /* ************************************ 49 * DWORD ShowFileAttrInfo(DWORD dwAttribute) 50 * 功能 打印將文件屬性 51 * 52 * 參數 DWORD dwAttribute,文件屬性 53 * 54 * 返回值 0 55 **************************************/ 56 DWORD ShowFileAttrInfo(DWORD dwAttribute) 57 { 58 //依次判斷屬性,並顯示。 59 printf("文件屬性:\t"); 60 if(dwAttribute&FILE_ATTRIBUTE_ARCHIVE) 61 printf("<ARCHIVE> "); 62 if(dwAttribute&FILE_ATTRIBUTE_COMPRESSED) 63 printf("<壓縮> "); 64 if(dwAttribute&FILE_ATTRIBUTE_DIRECTORY) 65 printf("<目錄> "); 66 if(dwAttribute&FILE_ATTRIBUTE_ENCRYPTED) 67 printf("<加密> "); 68 if(dwAttribute&FILE_ATTRIBUTE_HIDDEN) 69 printf("<隱藏> "); 70 if(dwAttribute&FILE_ATTRIBUTE_NORMAL) 71 printf("<NORMAL> "); 72 if(dwAttribute&FILE_ATTRIBUTE_OFFLINE) 73 printf("<OFFLINE> "); 74 if(dwAttribute&FILE_ATTRIBUTE_READONLY) 75 printf("<只讀> "); 76 if(dwAttribute&FILE_ATTRIBUTE_SPARSE_FILE) 77 printf("<SPARSE> "); 78 if(dwAttribute&FILE_ATTRIBUTE_SYSTEM) 79 printf("<系統文件> "); 80 if(dwAttribute&FILE_ATTRIBUTE_TEMPORARY) 81 printf("<臨時文件> "); 82 83 printf("\n"); 84 85 return 0; 86 } 87 /* ************************************ 88 * DWORD ShowFileSize(DWORD dwFileSizeHigh, DWORD dwFileSizeLow) 89 * 功能 打印文件大小信息 90 * 91 * 參數 DWORD dwFileSizeHigh,文件大小高32位 92 * DWORD dwFileSizeLow,文件大小低32位 93 * 94 * 返回值 0 95 **************************************/ 96 DWORD ShowFileSize(DWORD dwFileSizeHigh, DWORD dwFileSizeLow) 97 { 98 ULONGLONG liFileSize; 99 liFileSize = dwFileSizeHigh; 100 101 //高們移動32位 102 liFileSize <<= sizeof(DWORD)*8; 103 liFileSize += dwFileSizeLow; 104 printf("文件大小:\t%I64u 字節\n",liFileSize); 105 return 0; 106 } 107 /* ************************************ 108 *DWORD ShowFileTime(PFILETIME lptime) 109 * 功能 輪換文件時間,將打印 110 * 111 * 參數 PFILETIME lptime,指向文件時間的指針 112 * 113 * 返回值 0 114 **************************************/ 115 DWORD ShowFileTime(PFILETIME lptime) 116 { 117 //文件時間結構 118 FILETIME ftLocal; 119 //系統時間結構 120 SYSTEMTIME st; 121 //調整為系統所在時區的時間 122 FileTimeToLocalFileTime( 123 lptime, 124 &ftLocal 125 ); 126 //將文件時間轉換為SYSTEMTIME格式,便於顯示。 127 FileTimeToSystemTime( 128 &ftLocal, 129 &st 130 ); 131 //顯示時間信息字符串 132 printf("%4d年%.2d月%#02d日,%.2d:%.2d:%.2d\n", 133 st.wYear,st.wMonth,st.wDay,st.wHour,st.wMinute,st.wSecond); 134 135 return 0; 136 } 137 /* ************************************ 138 * DWORD SetFileHiddenAndReadonly(LPSTR szFileName) 139 * 功能 將指定的文件設置為隱藏和只讀 140 * 141 * 參數 LPSTR szFileName,文件路徑 142 * 143 * 返回值 0 144 **************************************/ 145 DWORD SetFileHiddenAndReadonly(LPSTR szFileName) 146 { 147 //獲取原來的文件屬性 148 DWORD dwFileAttributes = GetFileAttributesA(szFileName); 149 //將只讀和隱藏屬性附加到原來的文件屬性上 150 dwFileAttributes |= FILE_ATTRIBUTE_READONLY; 151 dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN; 152 //設置文件屬性,並判斷是否成功。 153 if(SetFileAttributesA(szFileName, dwFileAttributes)) 154 { 155 printf("文件%s的隱藏和屬性設置成功\n",szFileName); 156 } 157 else 158 { 159 printf("屬性設置; %d\n",GetLastError()); 160 } 161 return 0; 162 } 163 /* ************************************ 164 * int main(int argc, PCHAR argv[]) 165 * 功能 設置和獲取文件屬性等 166 * 167 * 參數 顯示第一個參數指定文件的屬性、時間、大小 168 * 將第二個參數的屬性設置為隱藏、只讀。 169 * 170 * 返回值 0代表執行完成,1代碼發生錯誤 171 **************************************/ 172 int main(int argc, PCHAR argv[]) 173 { 174 char str1[100]; 175 char str2[100]; 176 printf("請輸入參數\n"); 177 scanf("%s",str1);scanf("%s",str2); 178 179 ShowFileAttributes(str1); 180 SetFileHiddenAndReadonly(str2); 181 return 0; 182 }