[WinAPI] API 14 [獲取、設置文件屬性和時間]


 

 

>_< 為了獲取文件屬性,用戶可以使用GetFileAttributesGetFileAttributesEx函數。

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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM