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