文件,让人又爱又恨;
主要是讲操作
首先,我们看一下,文件的操作部分的第一个部分,
文件信息结构体:WIN32_FIND_DATAA
这是VS2019下查看定义
typedef struct _WIN32_FIND_DATAA {
DWORD dwFileAttributes; //文件属性
FILETIME ftCreationTime; //文件创建时间
FILETIME ftLastAccessTime; //文件最后一次访问时间
FILETIME ftLastWriteTime; //文件最后一次写入时间
DWORD nFileSizeHigh;
DWORD nFileSizeLow;
DWORD dwReserved0;
DWORD dwReserved1;
_Field_z_ CHAR cFileName[ MAX_PATH ];
_Field_z_ CHAR cAlternateFileName[ 14 ];
#ifdef _MAC
DWORD dwFileType;
DWORD dwCreatorType;
WORD wFinderFlags;
#endif
} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
查找第一个文件与查找下一个文件
查看定义,FindFirstFileA 与 FindNextFileA
返回值INVALID_HANDLE_VALUE(无效句柄值)
HANDLE WINAPI FindFirstFileA( _In_ LPCSTR lpFileName,
_Out_ LPWIN32_FIND_DATAA lpFindFileData );
返回值布尔值
BOOL WINAPI FindNextFileA( _In_ HANDLE hFindFile,
_Out_ LPWIN32_FIND_DATAA lpFindFileData );
我们可以遍历文件信息,可以查看文件,就可以做很多事情了
编译环境,VS2019,使用字符集unicode,当然多字节字符集也是可以的
实现文件遍历
#include <iostream>
#include <windows.h>
#include <string>
#define maxx 1000
//参数文件路径或者盘符
int findFile(char* Path)
{
char fd[maxx];
LPWIN32_FIND_DATAA FindFileData = new WIN32_FIND_DATAA;
strcpy_s(fd, Path);
strcat_s(fd, "\\*.*");
HANDLE hFind = FindFirstFileA(fd, FindFileData);
if (INVALID_HANDLE_VALUE == hFind)
{
if (FindFileData != NULL) {
delete FindFileData;
FindFileData = NULL;
}
return -1;
}
//文件句柄
while (FindNextFileA(hFind, FindFileData))
{
if (FindFileData->dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if (strcmp(FindFileData->cFileName, ".") != 0 && strcmp(FindFileData->cFileName, "..") != 0)
{
//这里可以显示文件夹(可以把文件夹保存)
//std::cout <<"这是文件夹:"<< FindFileData.cFileName << std::endl;
char szFile[maxx] = { 0 };
strcpy_s(szFile, Path);
strcat_s(szFile, "\\");
strcat_s(szFile, FindFileData->cFileName);
findFile(szFile);
//std::cout << "以上是文件夹:" << FindFileData.cFileName << std::endl;
}
}
else
{
//打印文件路径
std::cout << Path << "\\" << FindFileData->cFileName << std::endl;
}
}
FindClose(hFind);
if (FindFileData != NULL) {
delete FindFileData;
FindFileData = NULL;
}
return 0;
}
int main()
{
std::string temp;
char* path = NULL;
std::cout << "请输入文件夹名字或者盘符" << std::endl;
std::cout << "示例一:d:" << std::endl;
std::cout << "示例二:e:\\444" << std::endl;
std::cout << "请输入:";
std::cin >> temp;
path = (char*)temp.c_str();
findFile(path);
system("pause");
return 0;
}
效果如下:
遍历自己的盘符之后,可以考虑遍历所有的盘符,接下来要讲的就是逻辑盘的操作
主要是一个函数,查看定义:
DWORD
WINAPI
GetLogicalDriveStringsA(
_In_ DWORD nBufferLength, //缓冲区长度
_Out_writes_to_opt_(nBufferLength, return + 1) LPSTR lpBuffer //缓冲区
);
小贴士:1、dword 类型就是无符号长整形 即 unsigned long
2、可以理解为挤牙膏似的存储,虽然连续,但是输出是一段一段的,即缓冲区地址虽然连续,但是输出的盘符是一个一个的
//具体可自行想象内存结构个人理解示意图
#include <stdio.h>
#include<iostream>
#include <Windows.h>
int main()
{
DWORD dwSize = MAX_PATH;
char logicalDrive[MAX_PATH] = { 0 };
DWORD dwResult = GetLogicalDriveStringsA(dwSize, logicalDrive);
//处理获取到的结果
if (dwResult > 0 && dwResult <= MAX_PATH) {
//找到第一个磁盘的首地址
char* szSingleDrive = logicalDrive;
while (*szSingleDrive) {
std::cout << szSingleDrive << std::endl;
// 获取下一个磁盘的首地址
szSingleDrive += strlen(szSingleDrive) + 1;
}
}
return 0;
}
得到磁盘,再结合磁盘遍历,可以做些什么呢?一切尽在你自己掌握
2019/9/9 17:52:32