前言
- 各位师傅大家好,我是qmx_07,今天继续讲解Windows系统编程的相关知识:目录操作
目录
目录操作
创建目录
- 通过CreateDirectory函数创建目录
原型:
BOOL CreateDirectoryA(
[in] LPCSTR lpPathName,//目录名称
[in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes//安全属性,对目录的访问权限,NULL表示默认的安全属性
);
删除目录
-
使用RemoveDirectory函数删除目录
RemoveDirectory(源文件)
-
注意:使用该函数只能删除空目录,如果该目录有文件,遍历删除文件,再使用该函数
遍历目录文件(模仿dir命令)
WIN32_FIND_DATA
- 一般使用_WIN32_FIND_DATA来存储文件的信息,下面了解一下存储了哪些内容:
typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;//文件属性 比如是文件,或者是目录
FILETIME ftCreationTime;//文件目录的创建时间
FILETIME ftLastAccessTime;//最后的访问时间
FILETIME ftLastWriteTime;//最后的写入时间
DWORD nFileSizeHigh;//存储的高位DWORD
DWORD nFileSizeLow;//存储的低位DWORD
DWORD dwReserved0;//保留内容
DWORD dwReserved1;//保留内容
CHAR cFileName[MAX_PATH];//文件名称
CHAR cAlternateFileName[14];//文件备用名称
}
- 文件名称、创建时间、最近的读取、写入时间、文件大小等数据
时间戳及转换
- 我们使用FindFirstFile函数查找qmx.ini文件,将数据存储到FindFileData中,打印文件名称和创建时间
- 但是可以观察到 创建时间是一堆数字,并不能直接看到日期
时间戳,是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数(不考虑闰秒),用于表示一个时间点
需要使用SYSTEMTIME和FileTimeToSystemTime函数,来进行转换日期
SYSTEMTIME 和 FileTimeToSystemTime
typedef struct _SYSTEMTIME {
WORD wYear;//年
WORD wMonth;//月
WORD wDayOfWeek;//星期
WORD wDay;//天
WORD wHour;//小时
WORD wMinute;//分钟
WORD wSecond;//秒钟
WORD wMilliseconds;//毫秒
} SYSTEMTIME, *PSYSTEMTIME, *LPSYSTEMTIME;
BOOL FileTimeToSystemTime(
[in] const FILETIME *lpFileTime,//FileTime的指针,也就是时间戳
[out] LPSYSTEMTIME lpSystemTime//SystemTime指针,用来将时间戳转换到日期存储
);
- 使用FileTimeToSystemTime函数将时间戳存储到SYSTEMTIME中,将时间戳转换成年月日时分秒,以此来打印数据
文件常量类型
- 这些是常用到的文件类型
实现
WIN32_FIND_DATA FindFileData;
HANDLE hFile = FindFirstFile("G:\\win_file\\test\\*", &FindFileData);
if (INVALID_HANDLE_VALUE == hFile)
{
std::cout << "FindFirstFile Faild" << std::endl;
std::cout << GetLastError() << std::endl;
}
do
{
SYSTEMTIME SystemTime;
FileTimeToSystemTime(&FindFileData.ftCreationTime, &SystemTime);
std::cout << SystemTime.wYear << "-" << SystemTime.wMonth<<"-"<<SystemTime.wDay<<" ";
if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
std::cout << "<DIR>" << " ";
}
std::cout << FindFileData.cFileName << std::endl;
} while (FindNextFile(hFile, &FindFileData));
- 逻辑:通过遍历目录文件,依次打印时间,文件名称
- FindNextFile用来查找下一个文件
- FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY 判断文件是否是目录
- 画面演示:
卷
CHAR VolumeName[MAX_PATH] = { 0 };//用于存储卷的名称
DWORD VolumeSerialNum;//存储卷的序列号
DWORD MaxComponentLength;//存储文件名的最大长度
DWORD SysFlags;//卷的特性信息
CHAR FileSystem[MAX_PATH] = { 0 };//存储文件系统名称
GetVolumeInformation("D:\\", VolumeName, MAX_PATH, &VolumeSerialNum, &MaxComponentLength,&SysFlags, FileSystem,MAX_PATH);
- GetVolumeInformation函数用于获取卷信息
磁盘
BOOL GetDiskFreeSpaceA(
[out] LPDWORD lpSectorsPerCluster,//用于获取指定磁盘卷中每个簇包含的扇区数量
[out] LPDWORD lpBytesPerSector,//用于获取指定磁盘卷中每个扇区包含的字节数
[out] LPDWORD lpNumberOfFreeClusters,//用于获取指定磁盘卷中当前空闲的簇的数量
[out] LPDWORD lpTotalNumberOfClusters//用于获取指定磁盘卷中总的簇的数量
);
- lpSectorsPerCluster * lpBytesPerSector 空闲空间大小 = 空闲簇数量 × 簇大小
- lpSectorsPerCluster和lpBytesPerSector 计算磁盘总大小
总结
- 学习了目录的相关知识 了解 时间戳 遍历文件 模拟dir命令、以及卷,磁盘 使用windows api查看相关信息