<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    weidagang2046的專欄

    物格而后知致
    隨筆 - 8, 文章 - 409, 評論 - 101, 引用 - 0
    數據加載中……

    在VC++下對文件屬性的獲取與更改

    摘要:本文講述了在Visual C++ 下編程實現對磁盤文件的屬性進行獲取以及更改的一般方法,并給出部分相關的關鍵代碼。

      一、 引言

      文件是數據在磁盤上最常用的一種存放形式,也是在程序設計中與之經常打交道的一種編程對象,不少程序尤其是數據傳輸和處理類的應用程序更是需要頻繁的創建、讀取和寫入文件。對于一些要求不是很嚴格的程序,我們往往只關心文件的內容是否正確、文件大小是否有增減或是再嚴格一些,看文件名是否符合規定等等。以上這些要素對于大多數程序而言顯然是可以滿足實際需求的,但對于某些特殊行業的一些有著比較嚴格要求的軟件系統,僅有以上要素還是遠遠不夠的,往往還需要對文件的所有屬性諸如文件的創建時間、文件的最后訪問時間、文件的最后修改時間等等進行提取處理與重新設置。

      二、 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里直接對文件名參數進行設置即可。

      小結:本文通過對WIN32_FIND_DATA結構和SetFileTime()、SetFileAttributes()等主要函數實現了對磁盤文件的相關屬性信息的獲取與修改。用此技術可以在通訊等對文件有嚴格要求的應用領域實現文件全部信息(包括文件內容、文件名以及文件屬性等)的完整傳送。本文所述程序在Windows 98下由Microsoft Visual C++ 6.0編譯調試通過。


    from: http://www.yesky.com/20020904/1628566.shtml

    posted on 2005-11-03 19:40 weidagang2046 閱讀(377) 評論(0)  編輯  收藏 所屬分類: Windows

    主站蜘蛛池模板: 亚洲美女人黄网成人女| 久久精品成人免费观看97| 中文字幕在线观看亚洲日韩| WWW亚洲色大成网络.COM| 两个人看的www高清免费观看| 欧美好看的免费电影在线观看| heyzo亚洲精品日韩| 18亚洲男同志videos网站| 久久这里只精品国产免费10| 又黄又爽无遮挡免费视频| 亚洲婷婷天堂在线综合| 青柠影视在线观看免费| 免费在线黄色网址| 又硬又粗又长又爽免费看| 永久免费AV无码网站在线观看| 亚洲AV综合色区无码另类小说| 四虎影视久久久免费观看| 久久久久一级精品亚洲国产成人综合AV区 | 亚洲午夜福利精品无码| 久久国产亚洲精品| 日本免费的一级v一片| 亚洲成a人片在线不卡| 6080午夜一级毛片免费看 | 免费下载成人电影| 亚洲综合区图片小说区| 久久99免费视频| 国产亚洲色视频在线| 久9久9精品免费观看| 国产aⅴ无码专区亚洲av| 一个人免费播放在线视频看片| 日本最新免费不卡二区在线| 人体大胆做受免费视频| 亚洲好看的理论片电影| 好紧我太爽了视频免费国产| 亚洲欧洲尹人香蕉综合| 免费h成人黄漫画嘿咻破解版| 免费国产叼嘿视频大全网站 | 亚洲精品视频专区| 国产国产人免费人成免费视频| 亚洲精华国产精华精华液| 天天摸天天操免费播放小视频|