0

当最新添加的文件超过已用空间限制时,我必须删除 dir 中最旧的文件。我不知道为什么排序列表files = sorted(os.listdir(DIR), key=os.path.getctime)在第一个元素上不包含最旧的文件(在本例中是名为“file_1”的文件)

代码

    print('START: Cycle no. ', cycle)
    time.sleep(1)
    print('Saving {0} files. {1} MB each'.format(FILES_NUM, MB_FILE_SIZE))
    i = 1
    while (i < FILES_NUM):
        usage = psutil.disk_usage(DIR)
        used = usage.used // (2**20)
        # print('Uzyta pamiec: ', used)
        if (used < 50): # 50 MB
            print('Saving file_{}'.format(i))
            with open("file_{}".format(i), 'wb') as f:
                f.write(os.urandom(FILE_SIZE))           
        else:
            files = sorted(os.listdir(DIR), key=os.path.getctime)
            print('Files list: ', files)
            os.remove(files[0])
            print('Deleted oldest file: ',files[0])
        i = i + 1

    print('KONIEC: Cycle no. ', cycle)
    print('Deleting the content of the card...')

结果

压力测试结果

编辑:我知道删除后的下一个文件的文件名结尾应该比上一个添加的大一个。在这个例子中应该是Saving file_22而不是Saving file_23. 第 22 个 'i' 用于删除过程,但我该如何克服这个问题?

4

1 回答 1

0

ctime不是按字母顺序对文件进行排序,所以不要假设最旧的文件是file_1. 让我们使用您的代码的简化版本来看看这一点:

import os
import sys

from datetime import datetime

FILES_NUM = 10
FILE_SIZE = 10


def main():
    for i in range(1, FILES_NUM + 1):
        if i == 5: # Assume disk usage has been exceeded
            files = sorted(os.listdir('.'), key=os.path.getctime)
            files = [
                f'{i} - {datetime.fromtimestamp(os.path.getctime(i))}'
                for i in files
                if i.startswith('file_')
            ]
            print(f'Files list: {files}')
            print(f'Deleted oldest file: {files[0]}')

        print(f'Saving file{i}')
        with open(f'file_{i}', 'wb') as f:
            f.write(os.urandom(FILE_SIZE))


if __name__ == '__main__':
    main()

首次运行(无文件):

$ python test.py
Saving file1
Saving file2
Saving file3
Saving file4
Files list: ['file_1 - 2019-05-30 15:36:36.366754', 'file_2 - 2019-05-30 15:36:36.367754', 'file_4 - 2019-05-30 15:36:36.367754', 'file_3 - 2019-05-30 15:36:36.367754']
Deleted oldest file: file_1 - 2019-05-30 15:36:36.366754
Saving file5
Saving file6
Saving file7
Saving file8
Saving file9
Saving file10

运行秒数(旧文件已存在):

$ python test.py
Saving file1
Saving file2
Saving file3
Saving file4
Files list: ['file_6 - 2019-05-30 15:36:36.367754', 'file_5 - 2019-05-30 15:36:36.367754', 'file_7 - 2019-05-30 15:36:36.367754', 'file_8 - 2019-05-30 15:36:36.368754', 'file_10 - 2019-05-30 15:36:36.368754', 'file_9 - 2019-05-30 15:36:36.368754', 'file_1 - 2019-05-30 15:37:00.360535', 'file_2 - 2019-05-30 15:37:00.361535', 'file_4 - 2019-05-30 15:37:00.361535', 'file_3 - 2019-05-30 15:37:00.361535']
Deleted oldest file: file_6 - 2019-05-30 15:36:36.367754
Saving file5
Saving file6
Saving file7
Saving file8
Saving file9
Saving file10

如您所见,第二次运行期间最旧的文件是file_6. 这是因为当磁盘使用率高于阈值时,我们进入if排序并列出现有文件的分支,此时仅创建了 1-4 个文件,因此 5-10 个仍然较旧。

另请注意,这ctime是 UNIX 系统上最后一次元数据更改的时间(文件所有权、权限,而不是内容修改)。您可以尝试mtime按修改日期排序。

在代码中的逻辑稍作更改后,索引问题现在也应该得到修复。

注意:示例使用 Python 3.7+

于 2019-05-30T12:54:04.193 回答