Обрезать файл с путем относительно каталога / дескриптора файла? - PullRequest
0 голосов
/ 18 октября 2018

Многие методы модуля os (см. документация ) поддерживают пути относительно файловых дескрипторов (dir_fd), например, метод unlink:

os.unlink(path, *, dir_fd=None)

В некоторых случаях я полагался на эту функцию, хотя она не поддерживается для всех файловых методов os.Это отсутствует для truncate (до и включая Python 3.7), например:

os.truncate(path, length)

Как я могу обойти эту проблему?

Моя лучшая идея на данный момент - явно открыть файл:

fd = os.open(path, flags = os.O_WRONLY | os.O_TRUNC, ... , dir_fd=dir_fd)
os.ftruncate(fd, length)
os.close(fd)

Мне было интересно, есть ли лучший метод.

1 Ответ

0 голосов
/ 19 апреля 2019

truncate не имеет параметра dir_fd, поскольку отсутствует системный вызов truncateat, который для этого потребуется.См. обсуждение здесь .

Правильное и единственно возможное решение на самом деле таково:

def truncate(path, length, dir_fd = None):
    fd = os.open(path, flags = os.O_WRONLY, dir_fd = dir_fd)
    os.ftruncate(fd, length)
    os.close(fd)

В отличие от моего первоначального вопроса, при открытии НЕ ДОЛЖЕН указываться режим os.O_TRUNCфайл.Если это сделать, файл будет обрезан до нуля, просто открыв его, что отнюдь не предназначено.

...