我所说的属性,指的是鼠标右键点击文件选择属性我们所看到的对话框中的内容。
不同的文件又不同的内容,比如rar的压缩文件,就有一个档案文件选项卡,一些应用执行文件可能就会存在版本信息的选项卡,普通文件也许可能只存在常规。我如何取得属性的信息?调用什么api可以获得呢?

解决方案 »

  1.   

    在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编译调试通过。
     
      

  2.   

    楼贴ê, р楼種瞶秆错
      

  3.   

    huwei001982(編程浪子):
    你写的是什么东西?与我的问题有关系吗?
    ---------
    lixiaosan(小三)
    我的确不是那个意思,我的意思是说,如何获得所有的,包括非常规的属性信息。
    --------
    (可能我的表达的确没清楚)
      

  4.   

    GetFileAttributes 
    获取文件属性。 
    可以获取文件的存档、只读、系统、隐藏等属性。 
    该函数只需一个文件路径作为参数。SetFileAttributes 
    设置文件属性。 
    能获取,自然也应该能设置。 
    可以设置文件的存档、只读、系统、隐藏等属性
      

  5.   

    比如我们编写的mfc应用程序,执行文件都回有版本信息,这个信息我该怎么获得?
      

  6.   

    赫赫,都理解错了.
    我倒是理解对了,but我不知道该怎么办:)
      

  7.   

    DWORD GetFileAttributes( LPCTSTR );
    该函数检取指定的文件的属性信息(主要是文件/目录处于何种状态,如压缩,隐藏,只读等等)。
    而如果你要得到文件的具体信息,那么就需要使用这个函数
    GetFileInfomationByHandle(HANDLE,LPBY_HANDLE_FILE_INFOMATION)
      

  8.   

    上面写错了,应该是GetFileInformationByHandle(HANDLE,LPBY_HANDLE_FILE_INFORMATION)LPBY_HANDLE_FILE_INFORMATION是一个BY_HANDLE_FILE_INFORMATION结构的指针:
    typedef struct _BY_HANDLE_FILE_INFORMATION { // bhfi 
        DWORD    dwFileAttributes; 
        FILETIME ftCreationTime; 
        FILETIME ftLastAccessTime; 
        FILETIME ftLastWriteTime; 
        DWORD    dwVolumeSerialNumber; 
        DWORD    nFileSizeHigh; 
        DWORD    nFileSizeLow; 
        DWORD    nNumberOfLinks; 
        DWORD    nFileIndexHigh; 
        DWORD    nFileIndexLow; 
    } BY_HANDLE_FILE_INFORMATION;
    详细请参照MSDN
      

  9.   

    TO: 楼主第一个贴是我回的, 第二个是系统乱加的(出错了)我知道你真正的意思, 但我也不知道怎么办点击RAR文件的属性会显示文件压缩比, 
    DLL, EXE文件的属性会显示版权信息,如果我猜得不错, 这些信息根本就不是 WINDOW 处理的, 而是 WinRar程式通过 Shell 编程加上去的
      

  10.   

    呵呵,windows操作系统,它不处理行吗?无论是谁加上去的,我们是不是也应该有办法得到呢?
      

  11.   

    1. 上面说的WIN32_FIND_DATA会获得很多属性.2. DWORD GetFileAttributes(
      LPCTSTR lpFileName   // name of file or directory
    );
    会获得A/R/H/S属性, 你用DWORD返回值相与会得到各种属性.
      

  12.   

    GetFileAttributes 
    获取文件属性。 
    可以获取文件的存档、只读、系统、隐藏等属性。 
    该函数只需一个文件路径作为参数。SetFileAttributes 
    设置文件属性。 
    能获取,自然也应该能设置。 
    可以设置文件的存档、只读、系统、隐藏等属性