文件系统和文件输入输出
(file system & file I/O)
系统和卷操作
GetLogicalDrives函数:
DWORD GetLogicalDrives(void);
该函数返回一个32位的值,其中每一位代表是否某一个逻辑驱动器存在。(第1位代表A,
第25位代表Z)
GetLogicalDriveStrings函数:
DWORD GetLogicalDriveStrings(DWORD cchBuffer, //
系统中每一个逻辑驱动器相关的
根目录信息将填充该指针指向的缓冲区
LPTSTR lpszBuffer); // 告诉函数缓冲区的最大尺寸
该函数返回保存所有数据所需的字节数.
调用方法:
DWORD dw=GetLogicalDriveStrings(0,NULL);
LPSTR lpDriveStrings=HeapAlloc(GetProcessHeap(),0,dw*sizeof(TCHAR));
GetLogicalDriveStrings(dw,lpDriveStrings);
返回缓冲区的内容和环境串缓冲区有相同的格式:项目之间由0字符分割,在最后有一个另
外的结束符0。
Windows 95:
该函数没有实现。
GetDriveType函数:
UINT GetDriveType(LPTSTR lpszRootPathName);
该函数返回由lpszRootPathName标识的驱动器的类型,见下表:
标识符 含义
0 无法确定驱动器的类型
1 不存在的根目录
DRIVE_REMOVEABLE 磁盘可以从驱动器中移走(软盘驱动器)
DRIVE_FIXED 磁盘不能从驱动器中移走(硬盘驱动器)
DRIVE_REMOTE 驱动器是远程驱动器(网络驱动器)
DRIVE_CDROM 驱动器是一个CD_ROM驱动器
DRIVE_RAMDISK 驱动器是一个RAM盘
获得卷的特定信息
GetVolumeInformation函数:
GetVolumeInformation(LPTSTR lpRootPathName, // 逻辑驱动器的相关根目录
LPTSTR lpVolumeNameBuffer, // 返回卷的名字
DWORD nVolumeNameSize, // 卷缓冲区的尺寸
LPDWORD lpVolumeSerialNumber, // 卷的序列号
LPDWORD lpMaximumComponentLength, //
返回支持的目录名和文件名的最大字符数
LPDWORD lpFileSystemFlags, // 返回文件系统的标志,见下表
LPTSTR lpFileSystemNameBuffer, //
返回文件系统的名字(FAT,HPFS,NTFS或CDFS)
DWORD nFileSystemNameSize); // 文件系统名字缓冲区的最大尺寸
标志 含义
FS_CASE_IS_PRESERVED 当名字存入磁盘时文件名大小写保留下来
FS_CASE_SENSITIVE 文件系统支持大小写敏感文件名查询
FS_UNICODE_STORED_ON_DISK 文件系统支持磁盘上的文件名使用Unicode
FS_PERSISTENT_ACLS 文件系统维护和增强访问控制表(只在NTFS下)
GetDiskFreeSpace函数:
BOOL GetDiskFreeSpace(LPTSTR lpszRootPathName,// 逻辑驱动器的相关根目录
LPDWORD lpSectorsPerCluster, // 每簇多少扇区
LPDWORD lpBytesPerSector, // 每扇区多少字节
LPDWORD lpFreeClusters, // 空闲扇区数量
LPDWORD lpClusters); // 总扇区数量
DeviceIoControl函数:
BOOL DeviceIoControl(HANDLE hDevice, // 磁盘设备的句柄
DWORD dwIoControlCode,// 设备命令
LPVOID lpvInBuffer,DWORD cbInBuffer,LPVOID lpvOutBuffer,DWORD cbOutBuffer,
LPDWORD lpcbBytesReturned,LPOVERLAPPED lpOverlapped);
该函数用来直接向磁盘设备驱动程序发明令或请求信息.
hDevice参数指定一个磁盘设备的句柄.这个句柄可以调用函数CreateFile而得到.如果你
想获得指向一个软盘驱动器或一个硬盘驱动器的单个分区的句柄,按如下形式调用
CreateFile:
hDevice=CreateFile("///.//X:",/* X 代表设备的驱动器字母
*/0,FILE_SHARE_WRITE,
NULL,OPEN_EXISTING,0,NULL);
你也可以通过以下形式调用CreateFile来获得指向一个物理硬盘的句柄:
hDevice=CreateFile("///.//PhysicalDriveN",/*
N代表用户系统上的一个硬盘,系统第
一硬盘是驱动器0 */0,FIEL_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
dwIoControlCode参数指定想送给设备的命令,取以下值:
命令标识符 含义
FSCTL_DISMOUNT_VOLUME 卸下磁盘
FSCTL_LOCK_VOLUME 锁住磁盘
FSCTL_UNLOCK_VOLUME 解锁磁盘
IOCTL_DISK_CHECK_VERIFY 检查一个可拆除介质设备的变化
IOCTL_DISK_EJECT_MEDIA 从一个SCSI设备中弹出介质
IOCTL_DISK__FORMAT_TRACKS 格式化一个连续的磁道集
IOCTL_DISK_GET_DRIVE_GEOMETRY 获得物理磁盘的几何信息
IOCTL_DISK_GET_DRIVE_LAYOUT 提供关于磁盘上每一分区的信息
IOCTL_DISK_GET_MEDIA_TYPES 获得介质支持的信息
IOCTL_DISK_GET_PARTITION_INFO 获得磁盘分区的信息