亚洲av色香蕉一区二区三区,十四以下岁毛片带血a级,亚洲 校园 欧美 国产 另类,亚洲av日韩av一区谷露,色欲av无码一区二区三区

  • 相關(guān)軟件
    >VC++實現(xiàn)對文件夾時間的修改 創(chuàng)建者:webmaster 更新時間:2005-05-17 23:56

    摘要: 本文給出了一種通過VC++程序?qū)ξ募A的時間屬性信息進行獲取與更改的一種方法。

      關(guān)鍵詞: 文件夾;時間屬性;Visual C++ 6.0

      引言:

      通常在數(shù)據(jù)維護與數(shù)據(jù)管理等工作中,經(jīng)常要對各類數(shù)據(jù)進行備份操作。對于大多數(shù)的IT企業(yè)和絕大多數(shù)的個人用戶而言,數(shù)據(jù)的備份主要是對數(shù)據(jù)內(nèi)容的簡單備份,而很少涉及對備份數(shù)據(jù)自身屬性如文件屬性、所在文件夾的時間屬性等內(nèi)容的備份。而在某些對數(shù)據(jù)管理有著非常嚴格要求的特殊行業(yè)中,對以上這些相關(guān)屬性信息的備份也是同等重要的。但是在目前的Windows操作系統(tǒng)下,不論是直接通過手工進行數(shù)據(jù)備份還是通過某些數(shù)據(jù)備份軟件來進行,都難以將這些信息完全保持原貌復(fù)制過來,尤其對于每時每刻均在發(fā)生變化的時間屬性更是難以保持其原始信息。不僅如此,在Windows操作系統(tǒng)下甚至沒有提供能直接修改此類屬性的工具和手段。為此,筆者對該問題做了研究,并總結(jié)出一套比較簡單的解決辦法。其中,對于文件屬性的備份與更改方法筆者已在天極網(wǎng)《在VC++下對文件屬性的獲取與更改》一文做了闡述,因此,本文在此就不再加以贅述,而著重對文件夾時間屬性的獲取與更改方法進行介紹。

      設(shè)計思路

      在Windows操作系統(tǒng)下并沒有提供任何可供修改文件夾時間屬性的方法和手段,即使是在Win32 API函數(shù)中,也只是提供了對文件時間屬性進行修改的函數(shù)調(diào)用,而沒有關(guān)于文件夾時間屬性修改的只言片語。雖然Windows所提供的備份程序能夠把待備份文件夾下的所有子文件夾的時間屬性按照原樣完整的復(fù)制過去,但是卻無法保持根目錄時間屬性的恒定。由此,可以考慮采取備份的方式來進行,并從同備份相關(guān)的Win32 API函數(shù)入手。具體而言,可以先以打開文件的方式來打開文件夾,然后就可以通過原本用于處理文件時間屬性的Win32 API函數(shù)GetFileTime()和SetFileTime()來獲取原始時間屬性并以其為參數(shù)來設(shè)置備份后的文件夾時間屬性了,這樣的處理可以確保文件夾在備份前后時間屬性的一致。

      根據(jù)前面的分析可以看出,按照打開文件的方式來打開文件夾是整個處理過程的關(guān)鍵,通常主要用于創(chuàng)建、打開文件的Win32 API函數(shù)CreateFile()并非只能用來創(chuàng)建和打開文件對象,實際上它還可以用來創(chuàng)建、打開管道、郵槽、通訊資源、磁盤驅(qū)動器(只對Windows NT而言)、控制臺和文件夾(只能打開)等。下面給出CreateFile()的原型:

    HANDLE CreateFile(
     LPCTSTR lpFileName, // 文件名指針
     DWORD dwDesiredAccess, // 訪問模式
     DWORD dwShareMode, // 共享模式
     LPSECURITY_ATTRIBUTES lpSecurityAttributes, //安全屬性
     DWORD dwCreationDisposition, // 創(chuàng)建方式
     DWORD dwFlagsAndAttributes, // 文件屬性
     HANDLE hTemplateFile // 指向待復(fù)制屬性的文件指針
    );

      當用其進行文件夾打開操作時,第一個參數(shù)lpFileName應(yīng)被設(shè)置成為待打開的文件夾的名稱;至于訪問模式可以根據(jù)需要靈活設(shè)置,對于本文而言,對源文件夾只進行讀取操作故可以設(shè)置為GENERIC_READ,對于備份后的文件夾由于需要將屬性信息寫入,因此需要有GENERIC_WRITE的支持;共享模式參數(shù)dwShareMode的設(shè)置與進行文件處理時的設(shè)置沒有什么區(qū)別,在此可以設(shè)置為FILE_SHARE_READ|FILE_SHARE_DELETE;由于CreateFile()函數(shù)在進行文件夾操作時,不能以創(chuàng)建方式進行,因此創(chuàng)建方式只能打開已經(jīng)存在的對象,即dwCreationDisposition應(yīng)當設(shè)置為OPEN_EXISTING;相比而言,dwFlagsAndAttributes參數(shù)的設(shè)置是比較重要的,正是通過將該參數(shù)設(shè)置為FILE_FLAG_BACKUP_SEMANTICS屬性才使CreateFile()函數(shù)來進行打開文件夾的操作。

      通常,文件、文件夾的時間屬性指的是創(chuàng)建時間、最近訪問時間和最近修改時間等幾個具體屬性。對于文件的上述屬性可以通過GetFileTime()來獲取,對于文件夾,在通過CreateFile()函數(shù)將其打開后,其獲取得到的句柄可以當作文件句柄來使用。因此,通過GetFileTime()函數(shù)同樣也可以得到文件夾的時間屬性。GetFileTime()函數(shù)原型如下:

    BOOL GetFileTime(
     HANDLE hFile, // 文件句柄
     LPFILETIME lpCreationTime, // 創(chuàng)建時間的地址
     LPFILETIME lpLastAccessTime, // 最近訪問時間的地址
     LPFILETIME lpLastWriteTime // 最近修改時間的地址
    );

      其中后三個參數(shù)均是指向FILETIME結(jié)構(gòu)的指針,得到的也都是UTC時間,如果需要,可以通過FileTimeToLocalFileTime()函數(shù)將此UTC時間轉(zhuǎn)化成本地時間。而且還可以進一步通過FileTimeToSystemTime()函數(shù)將其從文件時間格式轉(zhuǎn)化成系統(tǒng)時間格式,轉(zhuǎn)化后的時間格式將保存在一個SYSTEMTIME結(jié)構(gòu)對象中。類似的,在將時間信息寫入到文件夾屬性時,如果不是文件時間格式也應(yīng)當通過SystemTimeToFileTime()函數(shù)將其從系統(tǒng)時間格式轉(zhuǎn)換成文件時間格式,然后再通過SetFileTime()函數(shù)將指定的時間寫入到文件夾的時間屬性中去。這樣,在進行數(shù)據(jù)備份和恢復(fù)的過程中,包括根目錄在內(nèi)的所有文件夾都可以保持時間屬性的一致。

     簡單示例

      下面根據(jù)前面的講述而給出一個簡單的應(yīng)用示例,通過此示例可以從指定的文件夾讀取時間屬性信息并可在經(jīng)過修改后再回寫進去(在此僅對最近修改時間進行處理,對于其他的時間屬性可用類似的方法加以實現(xiàn))。這里通過兩個函數(shù)GetDirTime()和SetDirTime()來實現(xiàn)對文件夾時間信息的獲取與更改處理,下面就以注釋的形式對這兩個函數(shù)的實現(xiàn)過程進行講解:

    // 獲取指定文件夾的時間屬性,入口參數(shù)DirName指定了待處理的文件夾,stime為一
    // 指向SYSTEMTIME結(jié)構(gòu)的指針
    BOOL CSetForderTimeDlg::GetDirTime(CString DirName, SYSTEMTIME &stime){
     // 打開文件夾
     HANDLE hDir = CreateFile (DirName, GENERIC_READ,
       FILE_SHARE_READ|FILE_SHARE_DELETE,
       NULL, OPEN_EXISTING,
       FILE_FLAG_BACKUP_SEMANTICS, NULL);
     FILETIME lpCreationTime; // 文件夾的創(chuàng)建時間
     FILETIME lpLastAccessTime; // 對文件夾的最近訪問時間
     FILETIME lpLastWriteTime; // 文件夾的最近修改時間
     // 獲取文件夾時間屬性信息
     if (GetFileTime(hDir, &lpCreationTime, &lpLastAccessTime, &lpLastWriteTime)){
      FILETIME ftime;
      FileTimeToLocalFileTime(&lpLastWriteTime, &ftime); // 轉(zhuǎn)換成本地時間
      FileTimeToSystemTime(&ftime, &stime); // 轉(zhuǎn)換成系統(tǒng)時間格式
     }
     CloseHandle(hDir); // 關(guān)閉打開過的文件夾
     return retval;
    }

    // 設(shè)置指定文件夾的時間屬性,入口參數(shù)DirName指定了待處理的文件夾,new_time
    // 為一指向SYSTEMTIME結(jié)構(gòu)的指針
    BOOL CSetForderTimeDlg::SetDirTime(CString DirName, SYSTEMTIME new_stime){
     // 打開目錄的Win32 API調(diào)用
     HANDLE hDir = CreateFile(DirName, GENERIC_READ|GENERIC_WRITE,
       FILE_SHARE_READ|FILE_SHARE_DELETE,
       NULL, OPEN_EXISTING,
       FILE_FLAG_BACKUP_SEMANTICS, NULL);
     FILETIME lpCreationTime; // 文件夾的創(chuàng)建時間
     FILETIME lpLastAccessTime; // 對文件夾的最近訪問時間
     FILETIME lpLastWriteTime; // 對文件夾的最近修改時間
     SystemTimeToFileTime(&new_stime, &lpCreationTime); // 轉(zhuǎn)換成文件時間格式
     SystemTimeToFileTime(&new_stime, &lpLastAccessTime);
     SystemTimeToFileTime(&new_stime, &lpLastWriteTime);
     // 設(shè)置文件夾的時間屬性
     BOOL retval = SetFileTime(hDir, &lpCreationTime, &lpLastAccessTime,           &lpLastWriteTime);
     CloseHandle(hDir); // 關(guān)閉文件夾
     return retval;
    }

      至此,可以很方便的通過調(diào)用GetDirTime()和SetDirTime()函數(shù)來實現(xiàn)對任意指定文件夾時間屬性的獲取與設(shè)置,具體為:

    SYSTEMTIME stime; // 系統(tǒng)時間結(jié)構(gòu)對象
    if (GetDirTime(m_Path, stime))
    {
     // 如果獲取文件夾時間屬性成功,獲取到的時間信息將保存在stime結(jié)構(gòu)對象中
     ……
     // 如果需要可以對獲取到的時間屬性進行修改,也可以保留不變
     ……
     // 將修改后的時間屬性回寫到文件夾
     SetDirTime(m_Path, stime);
    }

      小結(jié)

      本文通過CreateFile()函數(shù)打開文件夾,并在以后的處理中將其以文件來對待,從而可以使用GetFileTime()、SetFileTime()等函數(shù)來對其時間屬性進行獲取與寫入處理,可對包括根目錄在內(nèi)的任意文件夾進行時間屬性設(shè)置。在數(shù)據(jù)的完整備份與復(fù)原等方面中有較好的應(yīng)用前景。本文所述代碼在Windows 2000 Professional下,由Microsoft Visual C++ 6.0編譯通過。
    相關(guān)文章
    本頁查看次數(shù):