【问题标题】:How can I detect if there is sufficient storage on a flash drive to write to a file?如何检测闪存驱动器上是否有足够的存储空间来写入文件?
【发布时间】:2018-09-06 01:01:28
【问题描述】:

我正在开发一个可以在闪存驱动器上生成无限文本文件的 Python 程序。该程序将是唯一在该闪存驱动器上运行的程序,我想在每次写入时检查是否有足够的存储空间。

如果有,我想将文件写入驱动器。如果没有足够的空间,我想对内容做点别的。例如:

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

我需要找到一个好方法来确定file.write() 操作将占用多少空间,并将其与驱动器上的可用空间进行比较。

谢谢!

【问题讨论】:

  • 这在典型的操作系统中是不可能的,因为在您检查时可能有足够的存储空间,而不是在您尝试写入时,因为其他应用程序可能已经填满了存储空间。一个健壮的应用程序在写入数据时必须能够容忍故障。预检只能是建议性的。反之亦然:检查时可用存储空间可能不足,但写入时可用存储空间充足。一种解决方法是为文件分配所有空间,然后写入实际数据。但即便如此,也可能会发生 I/O 错误(例如硬件故障)。
  • @BenjaminSoyka:“老鼠和男人最好的计划往往会出错。”也许您的解决方案今天有效,但明天有用的操作系统会为存储添加索引,从而占用索引空间。或者,正如我所写,发生 I/O 错误。或者,您计算要写入的实际数据量的存储空间,但忽略了计算文件系统需要添加多少以用于会计目的(跟踪文件段等)。而且不知道要添加多少,因为明天驱动器可能会使用不同类型的文件系统进行格式化。

标签: python diskspace


【解决方案1】:

这取决于平台;这是 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.

【讨论】:

    【解决方案2】:

    可以按照here的说明获取磁盘信息:

    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()
    

    现在,使用usedavailable 来确定磁盘是否有足够的空间。

    【讨论】:

    • 我现在如何将此与写入文件所需的大小进行比较?
    • 您需要知道您要写入文件的编码是什么,以及您要写入的数据是什么。例如,如果你想写一个二进制格式的整数,你可能需要 4 个字节。
    • 我想用文本格式写一个 1000 字符长的数字字符串。
    • 如果使用 Unicode,大小约为字符串长度 * 2 个字节
    • 你不应该重新发明subprocess.call(),除非你必须这样做。另见stackoverflow.com/questions/4256107/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多