• [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
    ",szPath);
     26     //获取文件属性
     27     if(!GetFileAttributesExA(szPath,
     28         GetFileExInfoStandard,
     29         &wfad))
     30     {
     31         printf("获取文件属性错误:%d
    ",GetLastError());
     32         return 1;
     33     }
     34     //显示相关时间
     35     printf("创建时间:	");
     36     ShowFileTime(&(wfad.ftCreationTime));
     37     printf("最后访问时间:	");
     38     ShowFileTime(&(wfad.ftLastAccessTime));
     39     printf("最后修改时间:	");
     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("文件属性:	");
     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("
    ");
     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("文件大小:	%I64u 字节
    ",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
    ",
    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的隐藏和属性设置成功
    ",szFileName);
    156     }
    157     else
    158     {
    159         printf("属性设置; %d
    ",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("请输入参数
    ");
    177     scanf("%s",str1);scanf("%s",str2);
    178 
    179     ShowFileAttributes(str1);
    180     SetFileHiddenAndReadonly(str2);
    181     return 0;
    182 }
  • 相关阅读:
    TLPI读书笔记第32章:线程取消
    TLPI读书笔记第30章:线程同步
    Javascript事件:this.value()和this.select()
    Unknown tag (s:property)的原因
    maven web项目中运行stucts2报404的解决方案
    maven web项目的web.xml报错The markup in the document following the root element must be well-formed.
    JAVA实现 springMVC方式的微信接入、实现消息自动回复
    jquery easyui datagrid使用参考
    SQL两个字段排序
    windows下 zookeeper dubbo 安装+配置+demo 详细图文教程
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3599441.html
Copyright © 2020-2023  润新知