我们在Windows平台下进行开发时,经常需要跟文件文件夹打交道,今天就来总结整理一下,一些基本的文件操作,封装一些自己常用的函数方便自己以后使用
创建文件
#include <windows.h>
#include <string>
int CreateNormalFile(std::wstring strPath) {
HANDLE h = CreateFile(strPath.c_str(), GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL);
if (h == INVALID_HANDLE_VALUE){
CloseHandle(h);
return GetLastError();
}
//如果文件存在,GetLastError值为183,文件也是存在的
//但是会清空文件
return 0;
}
int CreateHiddenFile(std::wstring strPath) {
HANDLE h = CreateFile(strPath.c_str(), GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM, NULL);
if (h == INVALID_HANDLE_VALUE) {
CloseHandle(h);
return GetLastError();
}
}
创建隐藏文件,可以给文件指定FILE_ATTRIBUTE_SYSTEM,验证是否创建成功可以使用批处理代码如下
for /f "delims=?" %%a in ('dir /a /b') do attrib -a -s -h -r "%%a"
判断文件或文件夹是否存在
//判断文件属性有效且dwAttrib中么有FILE_ATTRIBUTE_DIRECTORY
bool IsFileExist(std::wstring path)
{
DWORD dwAttrib = GetFileAttributes(path.c_str());
return INVALID_FILE_ATTRIBUTES != dwAttrib && 0 == (dwAttrib & FILE_ATTRIBUTE_DIRECTORY);
}
//判断文件属性有效且dwAttrib中有FILE_ATTRIBUTE_DIRECTORY
bool IsDirExist(std::wstring path)
{
DWORD dwAttrib = GetFileAttributes(path.c_str());
return INVALID_FILE_ATTRIBUTES != dwAttrib && 0 != (dwAttrib & FILE_ATTRIBUTE_DIRECTORY);
}
//判断路径是否存在实际也没啥用
bool IsPathExist(std::wstring path)
{
DWORD dwAttrib = GetFileAttributes(path.c_str());
return INVALID_FILE_ATTRIBUTES != dwAttrib;
}
遍历某个目录所有文件(使用时根据自己的需求更改)
bool FileList(const wchar_t * path) {
WIN32_FIND_DATA fData;
wchar_t filePath[MAX_PATH] = { 0 };
swprintf_s(filePath, L"%s\\*.*", path);
HANDLE h = FindFirstFile(filePath, &fData);
if (h == INVALID_HANDLE_VALUE) {
return false;
}
while (FindNextFile(h, &fData)) {
if (wcscmp(fData.cFileName, L".") == 0 || wcscmp(fData.cFileName, L"..") == 0)
continue;
wchar_t fullpath[MAX_PATH] = { 0 };
swprintf_s(fullpath, L"%ls\\%ls", path, fData.cFileName);
wprintf(L"%s\n",fullpath);
//判断是否是文件夹
DWORD dwAttribute = GetFileAttributes(fullpath);
if ((dwAttribute != INVALID_FILE_ATTRIBUTES ) && (dwAttribute &
FILE_ATTRIBUTE_DIRECTORY) != 0)
{
//是文件夹,递归调用
FileList(fullpath);
}
}
FindClose(h);
return true;
}
删除文件
如果要删除文件,那么我们需要使用API函数DeleteFile来删除,但是如果文件被占用时,我们这个api会调用失败,我们要在程序中删除自身也是这种情况,程序正在运行,调用DeleteFile肯定是无法删除的
#include <windows.h>
#include <stdio.h>
int main()
{
//多字节版本
//char exeFilePath[MAX_PATH] = { 0 };
//GetModuleFileNameA(GetModuleHandle(NULL), exeFilePath, MAX_PATH);
//char commandStr[101] = { 0 };
sprintf不安全,所以用sprintf_s
//sprintf_s(commandStr, "/C DEL /F /Q %s >> NUL", exeFilePath);
//ShellExecute(NULL, "open", "cmd.exe", commandStr, NULL, SW_HIDE);
//宽字节版本
wchar_t exeFilePath[MAX_PATH] = { 0 };
GetModuleFileName(GetModuleHandle(NULL),exeFilePath,MAX_PATH);
wchar_t commandStr[MAX_PATH] = { 0 };
swprintf_s(commandStr, L"/C DEL /F /F %s >> NUL", exeFilePath);
ShellExecute(NULL, L"open", L"cmd.exe", commandStr, NULL, SW_HIDE);
return 0;
}