C++ 扫描当前路径下文件并删除大文件
- C++获取当前路径
- 扫描文件路径下规定后缀名称的文件
- 计算文件大小
1. 获取当前路径
- 使用<Windows.h>中的GetCurrentDirectory方法实现,单独编写验证程序如下:
#include<iostream>
#include<Windows.h>
using namespace std;
int main(void)
{
char buf[1000];
GetCurrentDirectory(1000, buf);
cout << buf << endl;
system("pause");
return 0;
}
DWORD GetCurrentDirectory(
[in] DWORD nBufferLength,
[out] LPTSTR lpBuffer
);
-----------++++----------
参数说明:
[in] nBufferLength:存储目录字符串的缓冲区长度,以TCHARs为单位,需要包括终止字符NULL的空间
[out] lpBuffer:指针,指向一块缓冲区,用于接收结果(当前目录绝对路径)字符串,以NULL为结尾。
返回值
执行成功:返回写入缓冲区的字符数(不包括终止null);
执行失败:返回值为0;
缓冲区不够大时将返回指定缓冲区所需大小,以字符为单位(包括终止null)。
故可以通过GetCurrentDirectory(0, NULL);获取缓冲区所需大小,再进行缓冲区初始化完成创建。
使用 Visual Studio 2019 编译器,出现报错"char *"类型的实参与"LPWSTR"类型的形参不兼容。
---> 解决:
配置解决方案的属性,在(配置属性->高级->高级属性)中找到字符集,将其更改为使用多字节字符集。
2. 文件扫描
- 按照规定后缀名称扫描文件夹,得到规定后缀名的文件列表
void GetAllFormatFiles(string path, vector<string>& files, string format)
{
intptr_t hFile = 0;
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1)
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
{
GetAllFormatFiles(p.assign(path).append("\\").append(fileinfo.name), files, format);
}
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
3. 获取文件大小
size_t getFileSize(const char* fileName) {
if (fileName == NULL) {
return 0;
}
struct stat statbuf;
stat(fileName, &statbuf);
size_t filesize = statbuf.st_size;
return filesize;
}
long long GetFileSize(string& strPath)
{
std::ifstream read_file_(strPath.c_str(), ios::binary);
long long fileSize = 0;
if (read_file_.is_open())
{
read_file_.seekg(0, ios_base::end);
istream::pos_type file_size = read_file_.tellg();
read_file_.seekg(0, ios_base::beg);
return (long long)file_size;
}
return 0;
}
4. 完整应用例程
#include <string>
#include <vector>
#include <io.h>
#include <iostream>
#include <fstream>
#include<Windows.h>
using namespace std;
#include"LogM.h"
size_t getFileSize(const char* fileName) {
if (fileName == NULL) {
return 0;
}
struct stat statbuf;
stat(fileName, &statbuf);
size_t filesize = statbuf.st_size;
return filesize;
}
long long GetFileSize(string& strPath)
{
std::ifstream read_file_(strPath.c_str(), ios::binary);
long long fileSize = 0;
if (read_file_.is_open())
{
read_file_.seekg(0, ios_base::end);
istream::pos_type file_size = read_file_.tellg();
read_file_.seekg(0, ios_base::beg);
return (long long)file_size;
}
return 0;
}
void GetAllFormatFiles(string path, vector<string>& files, string format)
{
intptr_t hFile = 0;
struct _finddata_t fileinfo;
string p;
if ((hFile = _findfirst(p.assign(path).append("\\*" + format).c_str(), &fileinfo)) != -1)
{
do
{
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
{
GetAllFormatFiles(p.assign(path).append("\\").append(fileinfo.name), files, format);
}
}
else
{
files.push_back(p.assign(path).append("\\").append(fileinfo.name));
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
}
int main()
{
#if 1
char buf[1000];
GetCurrentDirectory(1000, buf);
std::cout << "当前路径:" << buf << std::endl;
string filePath = "E:\\VS2019\\test_demo\\test_demo";
vector<string> files;
string format = ".log";
GetAllFormatFiles(filePath, files, format);
int size = files.size();
for (int i = 0; i < size; i++)
{
cout << files[i] << endl;
std::cout << "file's size1 = " << getFileSize(files[i].c_str()) << std::endl;
std::cout << "file's size2 = " << GetFileSize(files[i]) << std::endl;
int size = getFileSize(files[i].c_str()) * 1024;
if (size > 4000)
{
remove(files[i].c_str());
}
}
#else
log_.FileScan(".txt");
#endif
system("pause");
return 0;
}