Windows文件创建,遍历,删除,判断,删除自身等

我们在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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是在Windows下使用C语言遍历目录并删除7天前的文件的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <windows.h> #include <time.h> #define MAX_PATH_LEN 260 // 删除指定文件 void DeleteFile(char *filePath) { if (remove(filePath) != 0) { printf("删除文件 %s 失败。\n", filePath); } else { printf("删除文件 %s 成功。\n", filePath); } } // 遍历目录并删除7天前的文件 void TraverseDir(char *dirPath) { char file[MAX_PATH_LEN]; WIN32_FIND_DATA findFileData; HANDLE hFind; time_t nowTime, fileTime; double diffTime; nowTime = time(NULL); sprintf(file, "%s\\*.*", dirPath); hFind = FindFirstFile(file, &findFileData); if (hFind == INVALID_HANDLE_VALUE) { printf("无法打开目录 %s\n", dirPath); return; } do { if (strcmp(findFileData.cFileName, ".") == 0 || strcmp(findFileData.cFileName, "..") == 0) { continue; } sprintf(file, "%s\\%s", dirPath, findFileData.cFileName); if (findFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { TraverseDir(file); } else { fileTime = (findFileData.ftLastWriteTime.dwHighDateTime << 32) + findFileData.ftLastWriteTime.dwLowDateTime; diffTime = difftime(nowTime, fileTime / 10000000 - 11644473600); if (diffTime >= 7 * 24 * 3600) { DeleteFile(file); } } } while (FindNextFile(hFind, &findFileData)); FindClose(hFind); } int main(int argc, char *argv[]) { if (argc != 2) { printf("用法: %s 目录路径\n", argv[0]); return 0; } TraverseDir(argv[1]); return 0; } ``` 该程序的主要思路是利用Windows API函数`FindFirstFile()`和`FindNextFile()`遍历目录中的所有文件和子目录,并使用`difftime()`函数计算文件最后修改时间和当前时间之间的时间差。如果时间差大于等于7天,则删除文件
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值