0%

驱动器卷标-文件夹操作

驱动器与文件夹

这两个东西在我们的日常操作电脑的过程中,经常用到,就是用来存储硬盘上的文件的。

卷标操作

由于不是很常用这些函数,我就贴一下函数定义就好了。
SetVolumeLabel设置卷标名称。

1
2
3
4
5
BOOL SetVolumeLabel(
LPCTSTR lpRootPathName, // pointer to name of root directory for
// volume
LPCTSTR lpVolumeName // name for the volume
);

第一个参数如果为NULL的话呢是操作当前的一个卷标,第二个参数就是卷标的名称,如果设置为NULL则是删除卷标
GetVolumeInformation获取卷标信息

1
2
3
4
5
6
7
8
9
10
11
12
13
BOOL GetVolumeInformation(
LPCTSTR lpRootPathName, // address of root directory of the
// file system
LPTSTR lpVolumeNameBuffer, // address of name of the volume
DWORD nVolumeNameSize, // length of lpVolumeNameBuffer
LPDWORD lpVolumeSerialNumber, // address of volume serial number
LPDWORD lpMaximumComponentLength,
// address of system's maximum
// filename length
LPDWORD lpFileSystemFlags, // address of file system flags
LPTSTR lpFileSystemNameBuffer, // address of name of file system
DWORD nFileSystemNameSize // length of lpFileSystemNameBuffer
);

逻辑驱动器的序列号是在格式化驱动器的时候,操作系统随机分配的一个GUID(全局标识符)。

检测逻辑驱动器

DWORD GetLogicalDrives(VOID)逻辑驱动器可用情况
这个函数没有参数,返回值是一个位掩码:
如果函数成功,则返回一个位掩码,表示当前可用的磁盘驱动器。位位置0(最小有效位)是驱动器A,位位置1是驱动器B,位位置2是驱动器C,依此类推。
GetLogicalDriveStrings获取存在的卷标:

1
2
3
4
DWORD GetLogicalDriveStrings(
DWORD nBufferLength, // size of buffer
LPTSTR lpBuffer // pointer to buffer for drive strings
);

这个就是位了我们的方便进行设计的,缓冲区的内容格式就是:
c:\<null>d:\<null><null>
GetDriveType获取驱动器的类型
就是判断驱动器是个什么盘符,比如说网络的,U盘,硬盘之类的。

1
2
3
UINT GetDriveType(
LPCTSTR lpRootPathName // pointer to root path
);

返回值有如下几个:

  • DRIVE_UNKNOWN The drive type cannot be determined.
  • DRIVE_NO_ROOT_DIR The root directory does not exist.
  • DRIVE_REMOVABLE The disk can be removed from the drive.
  • DRIVE_FIXED The disk cannot be removed from the drive.
  • DRIVE_REMOTE The drive is a remote (network) drive.
  • DRIVE_CDROM The drive is a CD-ROM drive.
  • DRIVE_RAMDISK The drive is a RAM disk.

GetDiskFreeSpace获取磁盘空间剩余的内容
有时候我们确实有这种需求,需要我们的磁盘剩余空间

1
2
3
4
5
6
7
8
9
BOOL GetDiskFreeSpace(
LPCTSTR lpRootPathName, // pointer to root path(要检测的磁盘)
LPDWORD lpSectorsPerCluster, // pointer to sectors per cluster(返回簇的扇区数)
LPDWORD lpBytesPerSector, // pointer to bytes per sector(每扇区的字节数)
LPDWORD lpNumberOfFreeClusters,
// pointer to number of free clusters(用于返回未使用的簇的数量)
LPDWORD lpTotalNumberOfClusters
// pointer to total number of clusters(驱动器簇的总量)
);

总容量的公式:簇总数 X 每簇扇区数 X 每扇区的字节数
剩余容量的计算公式: 未使用的簇 X 每簇扇区数 X 每扇区的字节数

格式化驱动器

SHFormatDriver这个是个外壳函数,就是意思是打开一个对话框,让用户进行选择行操作,这个函数使用的情况很少,所以不介绍了。但值得一说的是需要:#include <shlobj.h>和导入shell32.dll。

目录操作

CreateDirectory创建一个文件夹

1
2
3
4
BOOL CreateDirectory(
LPCTSTR lpPathName, // pointer to directory path string
LPSECURITY_ATTRIBUTES lpSecurityAttributes // pointer to security descriptor
);

不能进行递归创建,我们自己写一个就好了

1
2
3
4
5
6
7
8
9
10
BOOL CStudy_HistoryDlg::CreateDir(LPCTSTR lpszDir)
{
CString strDir = lpszDir;
int pos = 0;
while(pos = strDir.Find("\\",pos+1) != -1)
{
CreateDirectory(strDir.Left(pos),NULL);
}
return CreateDirectory(strDir,NULL);;
}

RemoveDirectory删除目录
这个只能删除空目录,无法递归删除,递归删除的话呢使用我们之前写好的那个文件删除的函数就可以了。