python 实时检测文件夹的大小,如果超过设定值,自动清空文件夹,如何
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python 实时检测文件夹的大小,如果超过设定值,自动清空文件夹,如何相关的知识,希望对你有一定的参考价值。
python 实时检测文件夹的大小,如果超过设定值,自动清空文件夹,如何实现??有什么思路??
实时检测我觉得可能没必要了,周期性检测倒是不错,比如每隔30秒检查一次,除非你一秒钟就几十上百兆数据写入,那就得实时检测了。实时监测的话,在while循环里不停的查看文件夹的变化
首写关于文件夹的大小,据我所知道的python标准库并没有提供关于文件夹大小的api或套件,你需要一个一个文件的去遍历获取文件的大小累加求和,获取文件大小可以使用os.stat(文件路径)。不过最好的方式,我觉得是通过调用系统命令获取文件夹的大小,这样就不用写递归方法,获取你要清空目录下的文件目录结构,当然目录结构简单的话,递归方法都不用写。不知道你的操作系统是什么,linux的话可以用
du -sh /data/applog/
在python2.7中可以使用commands.getoutput执行上面的命令并获取到输出结果
第二就是关于清空文件夹的,你必须保证没有程序对你要清空的目录进行访问,你才能正常的清空,否则,对于在使用中的文件你会清空失败。清空文件夹你可以使用shutil库里的rmtree()方法,它不管你文件夹是否有文件或子文件夹,使用它就是一行代码的事情,如果使用os模块进行删除的话你要从最底层文件夹开始删除。最后你再重新新建这文件夹
上面只是思路,具体使用还得根据你的实际需要来的
如果你要进行周期性检测的话,可以使用标准库中的sched库来开发 参考技术A
思路:用os.walk(dirname)遍历文件,用os.path.getsize(filename)统计大小,用os.popen('rm -rf /tmp/tmpabc')删除文件,代码如下:(更改maxsize可以设定大小,dirname改为要检测的文件夹)
#!/usr/bin/env python27import os
from os.path import join,getsize
def getdirsize(dir):
size=0L
for root,dirs,files in os.walk(dir):
size+=sum([getsize(join(root,name)) for name in files])
return size
if __name__ == '__main__':
dirname='/home/willie/code/zhidao/txt'
maxsize=50 #如何文件夹大于50M就删除
filesize=getdirsize(dirname)
# print 'filesize=',filesize
if filesize/1024/1024>maxsize:
os.popen('rm -rf '+dirname)本回答被提问者和网友采纳
我如何处理有关输入的字符串大小超过字符数组的设定大小的错误?
【中文标题】我如何处理有关输入的字符串大小超过字符数组的设定大小的错误?【英文标题】:How I can handle with error about entered size of string exceeds the set size of char array? 【发布时间】:2020-05-17 10:29:50 【问题描述】:如果我输入的字符串大于设置的大小,我需要某种错误处理程序。
cout << "Enter long of the string" << endl;
cin >> N;
char* st = new char[N];
char* st1 = new char[N];
for (int i = 0; i < N; ++i)
*(st1 + i) = ' ';
cout << "Enter string in the end put 0,without whitespace in the end." << endl;
cin.getline(st, N, '0');
【问题讨论】:
为什么不使用 std::string? 接下来我需要逐字拆分字符串,而不是用旧字符串中从 X 到 Y 的单词创建一个新字符串。如果使用 char 数组,我认为它更简单。 你认为你可以用 char 数组做什么,而你不能用std::string
做什么?
【参考方案1】:
首先是一些cmets。
不要在 C++ 中使用 C 样式数组(如char data[N]
)
字符串始终使用std::string
切勿将 char
数组用于字符串
永远不要在 C++ 中对拥有的内存使用原始指针
几乎永远不要在 C++ 中使用 new
避免使用指向拥有内存的原始指针的指针算法
因此,您应该重新考虑您的设计。首先开始正确地做。
回答你具体问题:如果你阅读getline的文档,那么你可以看到
count-1 个字符已被提取(在这种情况下 setstate(failbit) 被执行)。
因此,将设置故障位。你可以检查一下
if (std::cin.rdstate() == std::ios_base::failbit)
但您也可以在文档中阅读
从流中提取字符直到行尾或指定的分隔符 delim。
因此,它不会像您期望的那样工作,它将尝试读取直到读取 0。我认为它不适合你。
您还需要删除新的内存。否则,您正在创建一个内存漏洞。再看看你的例子并尝试一下:
#include <iostream>
int main()
size_t N;
std::cout << "Enter maximum length of the string\n";
std::cin >> N;
char* st = new char[N];
char* st1 = new char[N];
for (size_t i = 0U; i < N; ++i)
*(st1 + i) = ' ';
std::cout << "Enter string in the end put 0, without whitespace in the end.\n";
std::cin.getline(st, N, '0');
if (std::cin.rdstate() == std::ios_base::failbit)
std::cin.clear();
std::cout << "\nError: Wrong string entered\n\n";
delete[] st;
delete[] st1;
return 0;
解决所有问题:使用std::string
和std::getline
【讨论】:
以上是关于python 实时检测文件夹的大小,如果超过设定值,自动清空文件夹,如何的主要内容,如果未能解决你的问题,请参考以下文章
我如何处理有关输入的字符串大小超过字符数组的设定大小的错误?
使用 Python - 如何在不超过原始图像大小的情况下调整裁剪图像的大小以满足纵横比