Как определить, находится ли каталог в том же разделе - PullRequest
6 голосов
/ 30 октября 2008

Скажем, у меня есть входной файл и целевой каталог. Как определить, находится ли входной файл на том же жестком диске (или в разделе), что и целевой каталог?

Я хочу скопировать файл, если он другой, но переместить его, если он тот же. Например:

target_directory = "/Volumes/externalDrive/something/"
input_foldername, input_filename = os.path.split(input_file)
if same_partition(input_foldername, target_directory):
    copy(input_file, target_directory)
else:
    move(input_file, target_directory)

Благодаря ответу CesarB реализована функция same_partition:

import os
def same_partition(f1, f2):
    return os.stat(f1).st_dev == os.stat(f2).st_dev

Ответы [ 2 ]

11 голосов
/ 30 октября 2008

В C вы должны использовать stat() и сравнивать поле st_dev. В питоне os.stat должен сделать то же самое.

3 голосов
/ 30 октября 2008

Другим способом является подход «лучше просить прощения, чем разрешения» - просто попробуйте переименовать его, а в случае неудачи перехватите соответствующий OSError и попробуйте метод копирования. то есть:

import errno
try:
    os.rename(source, dest):
except IOError, ex:
    if ex.errno == errno.EXDEV:
        # perform the copy instead.

Это имеет то преимущество, что оно также будет работать в Windows, где st_dev всегда равно 0 для всех разделов.

Обратите внимание, что если вы действительно хотите скопировать, а затем удалить исходный файл (т.е. выполнить перемещение), а не просто скопировать, то shutil.move уже сделает то, что вы хотите:

Help on function move in module shutil:

move(src, dst)
    Recursively move a file or directory to another location.

    If the destination is on our current filesystem, then simply use
    rename.  Otherwise, copy src to the dst and then remove src.

[Редактировать] В связи с комментарием Мэтью Шинкеля обновлено упоминание о том, что shutil.move удалит источник после копии, что не обязательно является желаемым, поскольку в вопросе упоминается только копирование.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...