vc++實現資料夾時間屬性的獲取與更改
引言:對於大多數的
it企業和絕大多數的個人使用者而言,資料的備份主要是對資料內容的簡單備份,而很少涉及對備份資料自身屬性如檔案屬性、所在資料夾的時間屬性等內容的備份。而在某些對資料管理有著非常嚴格要求的特殊行業中,對以上這些相關屬性資訊的備份也是同等重要的。但是在目前的
windows
作業系統下,不論是直接通過手工進行資料備份還是通過某些資料備份軟體來進行,都難以將這些資訊完全保持原貌複製過來,尤其對於每時每刻均在發生變化的時間屬性更是難以保持其原始資訊。不僅如此,在
windows
作業系統下甚至沒有提供能直接修改此類屬性的工具和手段。為此,筆者對該問題做了研究,並總結出一套比較簡單的解決辦法。其中,對於檔案屬性的備份與更改方法筆者已在電腦報天極網《在
vc++
下對檔案屬性的獲取與更改》一文做了闡述,因此,本文在此就不再加以贅述,而著重對資料夾時間屬性的獲取與更改方法進行介紹。
設計思路
在windows
作業系統下並沒有提供任何可供修改資料夾時間屬性的方法和手段,即使是在
win32 api
函式中,也只是提供了對檔案時間屬性進行修改的函式呼叫,而沒有關於資料夾時間屬性修改的只言片語。雖然
windows
所提供的備份程式能夠把待備份檔案夾下的所有子資料夾的時間屬性按照原樣完整的複製過去,但是卻無法保持根目錄時間屬性的恆定。由此,可以考慮採取備份的方式來進行,並從同備份相關的
win32 api
函式入手。具體而言,可以先以開啟檔案的方式來開啟資料夾,然後就可以通過原本用於處理檔案時間屬性的
win32 api
函式getfiletime()
和setfiletime()
來獲取原始時間屬性並以其為引數來設定備份後的資料夾時間屬性了,這樣的處理可以確保資料夾在備份前後時間屬性的一致。
根據前面的分析可以看出,按照開啟檔案的方式來開啟資料夾是整個處理過程的關鍵,通常主要用於建立、開啟檔案的
win32 api
函式createfile()
並非只能用來建立和開啟檔案物件,實際上它還可以用來建立、開啟管道、郵槽、通訊資源、磁碟驅動器(只對
windows nt
而言)、控制台和資料夾(只能開啟)等。下面給出
createfile()
的原型:
handle createfile( lpctstr lpfilename, //
檔名指標
dword dwdesiredaccess, // 訪問模式
dword dwsharemode, // 共享模式
lpsecurity_attributes lpsecurityattributes, //安全屬性
dword dwcreationdisposition, // 建立方式
dword dwflagsandattributes, // 檔案屬性
handle htemplatefile // 指向待複製屬性的檔案指標
);當用其進行資料夾開啟操作時,第乙個引數
lpfilename
應被設定成為待開啟的資料夾的名稱;至於訪問模式可以根據需要靈活設定,對於本文而言,對源資料夾只進行讀取操作故可以設定為
generic_read
,對於備份後的資料夾由於需要將屬性資訊寫入,因此需要有
generic_write
的支援;共享模式引數
dwsharemode
的設定與進行檔案處理時的設定沒有什麼區別,在此可以設定為
file_share_read|file_share_delete
;由於createfile()
函式在進行資料夾操作時,不能以建立方式進行,因此建立方式只能開啟已經存在的物件,即
dwcreationdisposition
應當設定為
open_existing
;相比而言,
dwflagsandattributes
引數的設定是比較重要的,正是通過將該引數設定為
file_flag_backup_semantics
屬性才使
createfile()
函式來進行開啟資料夾的操作。
通常,檔案、資料夾的時間屬性指的是建立時間、最近訪問時間和最近修改時間等幾個具體屬性。對於檔案的上述屬性可以通過
getfiletime()
來獲取,對於資料夾,在通過
createfile()
函式將其開啟後,其獲取得到的控制代碼可以當作檔案控制代碼來使用。因此,通過
getfiletime()
函式同樣也可以得到資料夾的時間屬性。
getfiletime()
函式原型如下:
bool getfiletime( handle hfile, //
檔案控制代碼
lpfiletime lpcreationtime, // 建立時間的位址
lpfiletime lplastaccesstime, // 最近訪問時間的位址
lpfiletime lplastwritetime // 最近修改時間的位址
);其中後三個引數均是指向
filetime
結構的指標,得到的也都是
utc時間,如果需要,可以通過
filetimetolocalfiletime()
函式將此
utc時間轉化成本地時間。而且還可以進一步通過
filetimetosystemtime()
函式將其從檔案時間格式轉化成系統時間格式,轉化後的時間格式將儲存在乙個
systemtime
結構物件中。類似的,在將時間資訊寫入到資料夾屬性時,如果不是檔案時間格式也應當通過
systemtimetofiletime()
函式將其從系統時間格式轉換成檔案時間格式,然後再通過
setfiletime()
函式將指定的時間寫入到資料夾的時間屬性中去。這樣,在進行資料備份和恢復的過程中,包括根目錄在內的所有資料夾都可以保持時間屬性的一致。
簡單示例
下面根據前面的講述而給出乙個簡單的應用示例,通過此示例可以從指定的資料夾讀取時間屬性資訊並可在經過修改後再回寫進去(在此僅對最近修改時間進行處理,對於其他的時間屬性可用類似的方法加以實現)。這裡通過兩個函式
getdirtime()
和setdirtime()
來實現對資料夾時間資訊的獲取與更改處理,下面就以注釋的形式對這兩個函式的實現過程進行講解:
// 獲取指定資料夾的時間屬性,入口引數dirname指定了待處理的資料夾,stime為一
// 指向systemtime結構的指標
bool csetfordertimedlg::getdirtime(cstring dirname, systemtime &stime)
closehandle(hdir); // 關閉開啟過的資料夾
return retval;
}// 設定指定資料夾的時間屬性,入口引數dirname指定了待處理的資料夾,new_time
// 為一指向systemtime結構的指標
bool csetfordertimedlg::setdirtime(cstring dirname, systemtime new_stime)
至此,可以很方便的通過呼叫
getdirtime()
和setdirtime()
函式來實現對任意指定資料夾時間屬性的獲取與設定,具體為:
systemtime stime; //
系統時間結構物件
if (getdirtime(m_path, stime))
小結本文通過
createfile()
函式開啟資料夾,並在以後的處理中將其以檔案來對待,從而可以使用
getfiletime()
、setfiletime()
等函式來對其時間屬性進行獲取與寫入處理,可對包括根目錄在內的任意資料夾進行時間屬性設定。在資料的完整備份與復原等方面中有較好的應用前景。本文所述**在
windows 2000 professional
下,由microsoft visual c++ 6.0
編譯通過。
VC獲取指定資料夾路徑
vc獲取指定資料夾路徑 flyfish 2010 3 5 一 使用shell函式 1 獲取應用程式的安裝路徑 tchar buf max path shgetspecialfolderpath null,buf,csidl program files,null afxmessagebox buf 2...
VC程式設計改變指定的檔案或資料夾的屬性
檔案是資料在磁碟上最常用的一種存放形式,也是在程式設計中與之經常打交道的一種程式設計物件,不少程式尤其是資料傳輸和處理類的應用程式更是需要頻繁的建立 讀取和寫入檔案。對於一些要求不是很嚴格的程式,我們往往只關心檔案的內容是否正確 檔案大小是否有增減或是再嚴格一些,看檔名是否符合規定等等。以上這些要素...
assets資料夾與static資料夾的區別
assets資料夾與static資料夾的區別 原位址 相同點 assets資料夾和static資料夾在vue cli生成的專案中,都是用來存放靜態資源的。不同點 assets目錄中的檔案會被webpack處理解析為模組依賴,只支援相對路徑形式 build的時候由webpack解析為模組依賴。stat...