windows下文件系统类型及VC++如何获取文件系统类型

FAT 、FAT32和NTFS是windows下常见的有三种文件系统格式。

一.FAT与FAT32

基于MS-DOS,Win 95等系统都采用了FAT16文件系统。在Win 9X下,FAT16支持的分区最大为2GB。计算机将信息保存在硬盘上称为“簇”的区域内。使用的簇越小,保存信息的效率就越高。在FAT16的情况下,分区越大簇就相应的要增大,存储效率就越低。随着计算机硬件和应用的不断提高,FAT16文件系统已不能很好地适应系统的要求。在这种情况下,推出了增强的文件系统FAT32。同FAT16相比,FAT32主要具有以下特点:

1. 同FAT16相比FAT32最大的优点是可以支持的磁盘大小达到2TB(2047GB),但是不能支持小于512MB的分区。基于FAT32的Win 2000可以支持分区最大为32GB;而基于 FAT16的Win 2000支持的分区最大为4GB。

2. 由于采用了更小的簇,FAT32文件系统可以更有效率地保存信息。如两个分区大小都为2GB,一个分区采用了FAT16文件系统,另一个分区采用了FAT32文件系统。采用FAT16的分区的簇大小为32KB,而FAT32分区的簇只有4KB的大小。这样FAT32就比FAT16的存储效率要高很多,通常情况下可以提高15%。

3. FAT32文件系统可以重新定位根目录和使用FAT的备份副本。另外FAT32分区的启动记录被包含在一个含有关键数据的结构中,减少了计算机系统崩溃的可能性.

二. NTFS文件系统

1. NTFS 支持文件加密和分别管理功能(也就是著名的EFS加密格式),可为用户提供更高层次的安全保证。

2. NTFS 具有更好的磁盘压缩性能,可进一步满足小硬盘用户的需要(读取会慢一些)。

3. NTFS 最大支持高达 2TB (1TB=1024GB)的大硬盘,而且它的性能不会随着磁盘容量的增大而降低。

4. NTFS可以支持的分区(如果采用动态磁盘则称为卷)大小可以达到2TB。而Win 2000中的FAT32支持分区的大小最大为32GB。

5. NTFS是一个可恢复的文件系统。在NTFS分区上用户很少需要运行磁盘修复程序。NTFS通过使用标准的事物处理日志和恢复技术来保证分区的一致性。发生系统失败事件时,NTFS使用日志文件和检查点信息自动恢复文件系统的一致性。

6. NTFS支持对分区、文件夹和文件的压缩。任何基于Windows的应用程序对NTFS分区上的压缩文件进行读写时不需要事先由其他程序进行解压缩,当对文件进行读取时,文件将自动进行解压缩;文件关闭或保存时会自动对文件进行压缩。

7. NTFS采用了更小的簇,可以更有效率地管理磁盘空间。在Win 2000的FAT32文件系统的情况下,分区大小在2GB~8GB时簇的大小为4KB;分区大小在8GB~16GB时簇的大小为8KB;分区大小在16GB~32GB时,簇的大小则达到了16KB。而Win 2000的NTFS文件系统,当分区的大小在2GB以下时,簇的大小都比相应的FAT32簇小;当分区的大小在2GB以上时(2GB~2TB),簇的大小都为4KB。相比之下,NTFS可以比FAT32更有效地管理磁盘空间,最大限度地避免了磁盘空间的浪费。

8. 在NTFS分区上,可以为共享资源、文件夹以及文件设置访问许可权限。许可的设置包括两方面的内容:一是允许哪些组或用户对文件夹、文件和共享资源进行访问;二是获得访问许可的组或用户可以进行什么级别的访问。访问许可权限的设置不但适用于本地计算机的用户,同样也应用于通过网络的共享文件夹对文件进行访问的网络用户。与FAT32文件系统下对文件夹或文件进行访问相比,安全性要高得多。另外,在采用NTFS格式的Win 2000中,应用审核策略可以对文件夹、文件以及活动目录对象进行审核,审核结果记录在安全日志中,通过安全日志就可以查看哪些组或用户对文件夹、文件或活动目录对象进行了什么级别的操作,从而发现系统可能面临的非法访问,通过采取相应的措施,将这种安全隐患减到最低。这些在FAT32文件系统下,是不能实现的。

9. 在Win 2000的NTFS文件系统下可以进行磁盘配额管理。磁盘配额就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。设置磁盘配额后,可以对每一个用户的磁盘使用情况进行跟踪和控制,通过监测可以标识出超过配额报警阈值和配额限制的用户,从而采取相应的措施。磁盘配额管理功能的提供,使得管理员可以方便合理地为用户分配存储资源,避免由于磁盘空间使用的失控可能造成的系统崩溃,提高了系统的安全性。

10. NTFS使用一个“变更”日志来跟踪记录文件所发生的变更

NTFS格式缺点:

NTFS 格式具有许多独特的优点,不过,它也有一个缺点,那就是该磁盘文件格式不能被除它自己之外的其他操作系统所识别(NT 4.0也不例外),这就对数据交流造成了一定的影响,也就不支持DOS操作系统。

三. VC++如何获取系统盘符文件系统类型

BOOL GetVolumeInformation(
    [IN]  LPCTSTR lpRootPathName,                                //卷所在的根目录,如:"C:\\", 如果为NULL,表示当前目录
    [OUT]  LPTSTR lpVolumeNameBuffer,                       // 输出参数,存放卷名缓冲区
    [IN]  DWORD nVolumeNameSize,                              // 卷名缓冲区长度
    [OUT]  LPDWORD lpVolumeSerialNumber,                // 卷序列号
    [OUT]  LPDWORD lpMaximumComponentLength,     // 最大文件文件名组件长度,随文件系而变化
    [OUT]  LPDWORD lpFileSystemFlags,                       // 文件系统的一些属性,通常为一些宏的组合
    [OUT]  LPTSTR lpFileSystemNameBuffer,                 // 说明何种文件系统,例如NTFS,  FAT等
    [IN]  DWORD nFileSystemNameSize                         // 文件系统缓冲区长度
);

编码如下:

void ShowDischaracterBasicInfo(const TCHAR *szPath)
{
    TCHAR szVolumeNameBuf[MAX_PATH] = { 0 };
    DWORD dwVolumeSerialNum;
    DWORD dwMaxComponentLength;
    DWORD dwSysFlags;
    TCHAR szFileSystemBuf[MAX_PATH] = { 0 };
    BOOL bGet = GetVolumeInformation(L"C:\\",
        szVolumeNameBuf,
        MAX_PATH,
        &dwVolumeSerialNum,
        &dwMaxComponentLength,
        &dwSysFlags,
        szFileSystemBuf,
        MAX_PATH);

    wprintf(L"硬盘%s基本信息: %s %d %d %d %s", szPath, szVolumeNameBuf, dwVolumeSerialNum, dwMaxComponentLength, dwSysFlags, szFileSystemBuf);
}

四. 枚举系统盘符及其获取盘符容量信息

void EnumSystemDischaracter()
{
    TCHAR szBuf[128];
    memset(szBuf, 0, sizeof(TCHAR) * 128);

    DWORD len = GetLogicalDriveStrings(sizeof(szBuf) / sizeof(TCHAR), szBuf);
    
    wcout << L"枚举系统盘符:";
    for (TCHAR * s = szBuf; *s; s += _tcslen(s) + 1)
    {
        LPCTSTR sDrivePath = s;
        wcout << sDrivePath << L" ";
    }
    cout << endl;
}

void ShowDischaracterVolume(const TCHAR *szPath)
{
    DWORD dwTotalDiskSpace, dwFreeDiskSpace, dwUsedDiskSpace;
    ULARGE_INTEGER uiFreeBytesAvailableToCaller;
    ULARGE_INTEGER uiTotalNumberOfBytes;
    ULARGE_INTEGER uiTotalNumberOfFreeBytes;
    if (GetDiskFreeSpaceEx(szPath, &uiFreeBytesAvailableToCaller,
        &uiTotalNumberOfBytes,
        &uiTotalNumberOfFreeBytes))
    {
        dwTotalDiskSpace = (DWORD)(uiTotalNumberOfBytes.QuadPart / 1024 / 1024);
        dwFreeDiskSpace = (DWORD)(uiFreeBytesAvailableToCaller.QuadPart >> 20);
        dwUsedDiskSpace = dwTotalDiskSpace - dwFreeDiskSpace;
        wprintf(L"硬盘%s 总空间%dMB, 已用%dMB, 可用%dMB\r\n", szPath,
            dwTotalDiskSpace, dwUsedDiskSpace, dwFreeDiskSpace);
    }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值