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