Python | os.posix_fallocate 函数

怎样提前分配文件磁盘空间

最近更新时间 2020-12-11 10:22:11

os.posix_fallocate 函数确保为 fd 指向的文件分配了足够的磁盘空间,该空间从偏移量 offset 开始,到 len 字节为止。

磁盘空间不足会造成文件存储异常,在磁盘空间比较少或者保存大文件前分配磁盘空间很重要。

函数定义

os.posix_fallocate(fd, offset, len)
# 函数定义

if sys.platform != 'win32':
    # Unix only
    ...
    def posix_fallocate(fd: int, offset: int, length: int) -> None: ...
    ...

兼容性:Unix 系统。

参数

  • checkfd - 文件描述符。
  • checkoffset - 文件偏移量。
  • checklen - 字节长度。

返回值

  • checkNone - 无。

示例1: - 使用 os.posix_fallocate() 函数确保文件磁盘空间。

# coding=utf-8

# Python3 代码
# 讲解怎样使用 os.posix_fallocate() 函数分配文件磁盘空间

# 引入 os 库
import os

# 文件路径
path = "foo.txt"

# 使用 os.open 函数打开文件
fd = os.open(path, os.O_RDWR)

# 分配磁盘空间
os.posix_fallocate(fd, 0, 50)

# 获取文件大小
size = os.path.getsize(path)
print("Size::", size)

# 关闭文件
os.close(fd)
Size:: 50

调用 os.posix_fallocate 后,没有写入文件内容,文件大小也会变为新磁盘空间大小。

示例2: - 使用 os.posix_fallocate() 函数创建文件。

# coding=utf-8

def _create_file(self, filename, size, sparse=True):
    try:
        f = open(filename, "w ")
    except (OSError, IOError):
        raise ExecutionError("Could not open %s" % filename)
    try:
        if sparse:
            try:
                os.posix_fallocate(f.fileno(), 0, size)
            except AttributeError:
                # Prior to version 3.3, Python does not provide fallocate
                os.ftruncate(f.fileno(), size)
        else:
            self.shell.log.info("Writing %d bytes" % size)
            while size > 0:
                write_size = min(size, 1024)
                f.write("\0" * write_size)
                size -= write_size
    except (OSError, IOError):
        os.remove(filename)
        raise ExecutionError("Could not expand file to %d bytes" % size)
    except OverflowError:
        raise ExecutionError("The file size is too large (%d bytes)" % size)
    finally:
        f.close()

rss_feed