• [WinAPI] API 5 [遍历驱动器并获取驱动器属性]


    (1) GetLogicalDrives。
    获取主机中所有的逻辑驱动器,以BitMap的形式返回.
    ◇返回值
    GetLogicalDrive函数返回一个DWORD类型的值,第一位表示所对应的驱动器是否存在。一般情况下DWORD的数据长度是32位,在这个DWORD中,每一位对应了一个逻辑驱动器是否存在。第二位如果是“1”则表示驱动器“B:”存在,第4位如果是“1”则表示驱动器“D:”是存在的,以此类推。


    (2) GetLogicalDriverStrings。
    获取主机中所有驱动器,以驱动器根路径字符串返回.
    ◇参数
    nBufferLength:参数lpBuffer所指向的内存空间的大小,以字节为单位。
    lpBuffer:指向存储返回结果字符串的内存空间。

    ◇返回值
    函数的返回值指明了函数调用是否成功,如果成功则返回缓冲区中返回结果的总长度。如果返回值大于nBufferLength,说明给定的缓冲区大小不够,返回值是实际需要的大小。如果返回0,则说明函数运行出错。
    ◇使用说明
    这个API实现了与GetLogicalDrives同样的功能,却以一种更直观的方式返回执行结果。函数执行结果放在lpBuffer所指向的内存区域中,此内存区域大小由nBufferLength参数指定,使函数返回结果不至于溢出。在调用此函数前需保证内存分配。

    (3)FindFirstVolume。
    查找主机中的第一个驱动器,返回驱动器设备名.

    ◇参数
    lpszVolumeName:指向驱动器名的内存缓冲区。
    cchBufferLength:参数lpszVolumeName所指向的缓冲区大小,以字节为单位。
    ◇返回值
    驱动器查找句柄,F猫NextVolume和FindVolumeColse的参数,如果执行失败,返回NULL。


    (4)FindNextVolume
    查找主机中后继的逻辑驱动器◇参数
    hFindVolume: FindFirstVolume所返回的驱动器查找句柄。
    lpszVolumeName:指向保存驱动器名的内存缓冲区。
    cchBufferLength:参数lpszVolumeName所指向的缓冲区大小,以字节为单位。
    ◇返回值
    返回BOOL表示是否成功,如果失败说明已经查找完成所有逻辑驱动器。


    (5)FindVo1umeClose。
    关闭FindFirstVolume打开的卷遍历句柄◇参数
    hFindVolume:要关闭的驱动器查找句柄。
    ◇返回值
    返回BOOL值表示是否成功关闭句柄。


    (6) GetDriveType。
    获取驱动器类型◇参数
    lpRootPathIName:驱动器根路径,如“C:”。
    ◇返回值
    驱动器的类型,如DRIVE' FIXED表示硬盘,DRIVE_CDROM表示光盘等。详见实例4-2的GetDirverInfo函数。


    (7) GetVolumeInformation。
    获取逻辑驱动器信息,◇参数
    lpRootPathName:输入参数,指向所要获取属性的驱动器的根路径字符串。
    lpVolumeNameBuffer:输出参数,返回驱动器名。
    nVolumeNameSize:输入参数,lpVolumeNameBuffer的内存缓冲区大小。
    lpVolumeSerialNumber:输出参数,存储驱动器序列号。
    lpMaximumComponentLength:输出参数,返回文件系统所支持的文件组成部分的最大值。
    lpFileSystemFlags:输出参数,属性可以用来判断多种驱动器属性值,如FILE_VOLUME_
    QUOTAS表示支持磁盘配额,FILE_SUPPORTS_ENCRYPTION表示文件系统是否支持EFS加密等。
    lpFileSystemNameBuffer:输出参数,表示文件系统类型,如“NTFS”、“CDFS”等。
    nFileSystemNameSize: lpFileSystemNameBuffer的缓冲区大小。
    ◇返回值
    返回BOOL值,表示信息获取是否成功。

      1 /*
      2 遍历驱动器并获取驱动器属性
      3 */
      4 #include<windows.h>
      5 #include<stdlib.h>
      6 #include<stdio.h>
      7 
      8 #define BUFSIZE 1024
      9 
     10 BOOL GetDirverInfo(LPSTR szDrive);
     11 
     12 void main()
     13 {
     14     CHAR szLogicalDriveStrings[BUFSIZE];
     15     PCHAR szDrive;
     16 
     17     ZeroMemory(szLogicalDriveStrings,BUFSIZE);
     18     //获取逻辑驱动器卷名
     19     GetLogicalDriveStringsA(BUFSIZE-1,szLogicalDriveStrings);
     20     szDrive=(PCHAR)szLogicalDriveStrings;
     21     //循环处理每个卷
     22     do
     23     {
     24         if(!GetDirverInfo(szDrive))
     25         {
     26             printf("
    Get Volume Information Error: %d",GetLastError());
     27         }
     28         szDrive+=(lstrlenA(szDrive)+1);
     29     }
     30     while(*szDrive!='x00');
     31 }
     32 /*
     33 *功能:获取驱动器的属性
     34 *参数:指明获取驱动器的根路径,如C:
     35 *返回:BOOL是否成功
     36 */
     37 BOOL GetDirverInfo(LPSTR szDrive)
     38 {
     39     UINT uDriveType;
     40     DWORD dwVolumeSerialNumber;
     41     DWORD dwMaximumComponentLength;
     42     DWORD dwFileSystemFlags;
     43     CHAR szFileSystemNameBuffer[BUFSIZE];
     44     CHAR szDirveName[MAX_PATH];
     45     printf("
    %s
    ",szDrive);
     46     uDriveType=GetDriveTypeA(szDrive);
     47     switch(uDriveType){
     48     case DRIVE_UNKNOWN:
     49         printf("The drive type cannot be determind.");
     50         break;
     51     case DRIVE_NO_ROOT_DIR:
     52         printf("The root path is invalid,for example,no volume is mounted at the path.");
     53         break;
     54     case DRIVE_REMOVABLE:
     55         printf("The drive is a type that has removable media,for example,a floppy drive or removable hard disk.");
     56         break;
     57     case DRIVE_FIXED:
     58         printf("The drive is a type that cannot be removed,for example,a fixed hard drive.");
     59         break;
     60     case DRIVE_REMOTE:
     61         printf("The drive is a remote (network) drive.");
     62         break;
     63     case DRIVE_CDROM:
     64         printf("The drive is a CD-ROM drive.");
     65         break;
     66     case DRIVE_RAMDISK:
     67         printf("The drive is a RAM disk.");
     68         break;
     69     default:
     70         break;
     71     }
     72     if(!GetVolumeInformationA(
     73         szDrive,
     74         szDirveName,
     75         MAX_PATH,
     76         &dwVolumeSerialNumber,
     77         &dwMaximumComponentLength,
     78         &dwFileSystemFlags,
     79         szFileSystemNameBuffer,
     80         BUFSIZE
     81         ))
     82     {
     83         return false;
     84     }
     85     printf("
    Volume Serial Number is %u",dwVolumeSerialNumber);
     86     printf("
    Maximum Component Length is %u",dwMaximumComponentLength);
     87     printf("
    System Type is %s
    ",szFileSystemNameBuffer);
     88     if(dwFileSystemFlags & FILE_VOLUME_QUOTAS)
     89     {
     90         printf("The file system supports disk quotas.
    ");
     91     }
     92     if(dwFileSystemFlags & FILE_CASE_SENSITIVE_SEARCH)
     93     {
     94         printf("The file system supports case-sensitive file names.
    ");
     95     }
     96     //you can use these value to get more information
     97     //FILE_CASE_PRESERVED_NAMES
     98     //FILE_CASE_SENSITIVE_SEARCH
     99     //FILE_FILE_COMPRESSION
    100     //FILE_NAMED_STREAMS
    101     //...
    102     return TRUE;
    103 }
  • 相关阅读:
    Android Html处理器通用类 HtmlUtil
    Android 文件管理器通用类 FileUtil
    Android 本应用数据清除管理器DataCleanManager
    获取索引--------用range()和len()
    循环结构中-------简单的部分放在上面, 条理会更清晰~~~ != 不等于
    列表 ->join---> 字符串 转类型:x--->y类型 y(x)
    迭代 判断数字 累加器
    print in或者not in, 判断在不在里面
    n=n+1 放在print(s)的上面的影响 (2) n=n=+1在前面,则不满足前面<100条件时候,才跳出while的循环,这时候while循环结束, 到了外面的下一步-->print()
    n=n+1 放在print(s)的前/后的影响
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/3585432.html
Copyright © 2020-2023  润新知