Как определить, достаточно ли места на флэш-накопителе для записи в файл? - PullRequest
0 голосов
/ 06 сентября 2018

Я работаю над программой на Python, которая будет бесконечно создавать текстовые файлы на флешке. Каждый раз, когда программа хочет создать и записать файл, я хочу проверить, достаточно ли места для этого. Если есть, я хочу записать файл на флешку. Если недостаточно места для хранения, я хотел бы сделать что-то еще с содержанием Каков наилучший способ сделать это? Например:

def write_file(contents):
    if "Check if there is sufficient storage space on E:\ drive.":
        # Write to file.
        file = open("filename", "w")
        file.write(contents)
        file.close()
    else:
        # Alternative method for dealing with content.

Мне понадобится хороший способ узнать, сколько места займет file.write(), и сравнить его со свободным местом на диске.

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

Это зависит от платформы; Вот решение для Windows:

import ctypes
import platform

def get_free_space(dirname):
    free_bytes = ctypes.c_ulonglong(0)
    ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(dirname), None, None, ctypes.pointer(free_bytes))
    return free_bytes.value / 1024

if __name__ == "__main__":
    free_space = get_free_space("path\\")
    print(free_space)

Если вы работаете в Linux, я не уверен, но я нашел это:

from os import statvfs

st = statvfs("path/")
free_space = st.f_bavail * st.f_frsize / 1024

Ваша функция должна выглядеть так:

def write_file(contents):
    if free_space >= len(contents.encode("utf-8")):
        # Write to file.
        file = open("filename", "w")
        file.write(contents)
        file.close()
    else:
        # Alternative method for dealing with content.
0 голосов
/ 06 сентября 2018

Вы можете получить информацию о диске, как это объяснено здесь :

import subprocess
df = subprocess.Popen(["df", "path/to/root/of/disk"], stdout=subprocess.PIPE)
output = df.communicate()[0]
device, size, used, available, percent, mountpoint = \
    output.split("\n")[1].split()

Теперь используйте used и available, чтобы решить, достаточно ли на диске места.

...