如何检测文件夹是否太重,如果是,请删除其中的一部分
How to detect if a folder is too heavy, and if so delete part of it
我需要控制由路径定义的文件夹是否充满了文件夹,如果这些文件夹太多,我需要从旧的文件夹中删除,例如其中的一半,最新的。实际上,我需要为将来的文件夹腾出空间。
void fCID(long pThreadId)
{
ULARGE_INTEGER rFreeBytesAvailable, rTotalNumberOfBytes, rTotalNumberOfFreeBytes;
if(sc.LB.TMCI && sc.LB.ISM == 1)
{
for(10000000000;10000000000 > sd;sd--) //wrong, i'm looking for it
{
if (::GetDiskFreeSpaceEx (NULL, &rFreeBytesAvailable, &rTotalNumberOfBytes,
&rTotalNumberOfFreeBytes))
{
if (rFreeBytesAvailable.QuadPart > 10000000000) //10gb
{
fAFOZA("C:\S\H1\CA"); //function zip
}
else
{
sd=sd - 50% of (LA); //sd = space disposable
}
}
}
}
else
{
fDFOP(where.Trace_C_P); //not interesting
fDFOP(where.Trace_C_CL_P); //not interesting
}
}
这段代码只是一个想法
ULARGE_INTEGER rFreeBytesAvailable, rTotalNumberOfBytes,
rTotalNumberOfFreeBytes;
if(sc.LB.TMCI && sc.LB.ISM == 1)
{
if (::GetDiskFreeSpaceEx ("C:\S\H1\CA\LA", &rFreeBytesAvailable, &rTotalNumberOfBytes, &rTotalNumberOfFreeBytes))
{
do
{
fDFOP("C:\S\H1\CA\LA"); //this function deletes what's inside the path
}while(rFreeBytesAvailable.QuadPart == 10000000000)
if (rFreeBytesAvailable.QuadPart > 10000000000) //10gb
{
fAFOZA("C:\S\H1\CA");//this one makes a zip
}
}
}
这可能是另一种可能的实现
如果要删除目录结构中最旧的文件以回收一定数量的空间,则可以使用 C++17std::filesystem
库类recursive_directory_iterator
和函数last_write_time
和remove
来自同一个库。
例:
#include <cstdint>
#include <filesystem>
#include <set>
#include <string>
#include <system_error>
#include <tuple>
namespace fs = std::filesystem;
// a class containing the interesting information about each file
struct file {
fs::path path;
std::uintmax_t file_size;
std::filesystem::file_time_type write_time;
// An operator< to be able to sort files in this order:
// ascending write_time
// decending file_size (to remove the biggest of two files with the same write_time)
// ascending path
bool operator<(const file& rhs) const {
return
std::tie(write_time, rhs.file_size, path) <
std::tie(rhs.write_time, file_size, rhs.path);
}
};
// A function to traverse a directory structure, collect file names, age and sizes
// and to remove the oldest until "bytes_to_remove" bytes have been removed
std::uintmax_t rm_old_files(const std::wstring& dir, std::uintmax_t bytes_to_remove) {
std::uintmax_t bytes_removed = 0;
std::set<file> files; // the set will sort file entries with the oldest first
// collect all regular files in the directory structure starting at "dir"
for (const fs::directory_entry& de : fs::recursive_directory_iterator(dir)) {
if (de.is_regular_file()) {
files.emplace(file{de, de.file_size(), fs::last_write_time(de)});
}
}
// remove files until at least "bytes_to_remove" bytes have been removed
std::error_code ec; // unread but used to prevent exceptions in fs::remove
for (auto const& [path, file_size, write_time] : files) {
std::wcout << L"removing " << path << L'n';
/* uncomment this part when you've made sure that it'll
remove the correct files.
if (fs::remove(path, ec)) {
bytes_removed += file_size;
if (bytes_removed >= bytes_to_remove) break;
}
*/
}
return bytes_removed;
}
用法示例:
std::wstring dir = L"C:\S\H1\CA\LA";
ULARGE_INTEGER FreeBytesAvailableToCaller;
ULARGE_INTEGER TotalNumberOfBytes;
ULARGE_INTEGER TotalNumberOfFreeBytes;
if (GetDiskFreeSpaceExW(dir.c_str(), &FreeBytesAvailableToCaller,
&TotalNumberOfBytes,
&TotalNumberOfFreeBytes)) {
// if less than half the total number of bytes are available,
// execute rm_old_files to try to make at least half available.
if (FreeBytesAvailableToCaller.QuadPart < TotalNumberOfBytes.QuadPart/2) {
auto bytes_removed =
rm_old_files(dir, TotalNumberOfBytes.QuadPart/2 -
FreeBytesAvailableToCaller.QuadPart);
std::wcout << L"removed " << bytes_removed << L" bytesn";
}
}
相关文章:
- 如果我真的真的想从 STL 容器继承,并且我继承构造函数并删除新运算符,会发生什么?
- 如何删除字符串中的前 2 个字符(如果它有"-")
- 如果我想链接静态库并删除未使用的符号.txt我应该如何处理 Cmakelist
- 编译器是否必须始终删除 try-catch 块(如果它被证明是非抛出的)
- 文件模式标志"ios::app"是否用于删除文件(如果文件已存在)?
- 如果我删除指针,我的C++程序会意外删除系统文件吗?
- C++:如果我重载新运算符,我是否也必须重载删除运算符?
- 如何检测文件夹是否太重,如果是,请删除其中的一部分
- C++类析构函数删除成员(如果"owner"?
- 如果方法在类中定义,则阻止编译器删除方法
- 未找到匹配的运算符删除;如果初始化引发异常,内存将不会被释放
- 如果未声明,则由预处理器删除thread::hardware_concurrency
- 删除 QGraphicsPixmapItem (如果它已添加到场景中).如果不添加到场景
- 如果一个类继承了一个带有虚拟 dtor 的类,为什么要删除一个没有虚拟 dtor 的类是可以的
- 如果我有一个指向矢量元素的指针,而不是迭代器,如何删除它?
- 如果引用应该保留,不删除析构函数中的指针会导致内存泄漏吗?
- 如果删除未使用的REF类,DLL将无法加载
- 如果删除,如何返回 true,如果不使用 bool,则返回 false
- 如果删除一个正在运行的pthread对象会发生什么?
- 如果删除是在c++中的列表迭代中完成的,则会出现分段错误