2008-10-30 25 views
6

Digamos que tengo un archivo de entrada y un directorio de destino. ¿Cómo puedo determinar si el archivo de entrada está en el mismo disco duro (o partición) que el directorio de destino?Cómo determinar si un directorio está en la misma partición

Lo que quiero hacer es copiar un archivo si es diferente, pero moverlo si es el mismo. Por ejemplo:

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) 

Gracias a la respuesta de CesarB, la función implementada same_partition:

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

Respuesta

11

En C, se usaría stat() y comparar el campo st_dev. En python, os.stat debería hacer lo mismo.

+0

Tenga en cuenta que esto no funcionará en Windows, lo que deja a st_dev como 0 para todas las unidades. (Probablemente no sea un problema para el que pregunta ya que especifica las etiquetas osX y linux) – Brian

3

Otra forma es el enfoque "mejor pedir perdón que permiso"; simplemente intente cambiarle el nombre, y si eso falla, tome el OSError apropiado y pruebe el enfoque de copia. es decir:

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

Esto tiene la ventaja de que también funcionará en Windows, donde dev_t es siempre 0 para todas las particiones.

Tenga en cuenta que si realmente desea copiar y luego borrar el archivo de origen (es decir, realizar un movimiento.), En lugar de copiar y, a continuación shutil.move ya se va a hacer lo que quiere:

 
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. 

[ Editar] Actualizado debido al comentario de Matthew Schinckel para mencionar que shutil.move eliminará la fuente después de la copia, que no es necesariamente lo que se desea, ya que la pregunta solo menciona la copia.

+0

No es exactamente lo mismo. El OP no parecía querer borrar el original si estaban en discos diferentes. –

+0

Buen punto - Me había perdido eso. – Brian

Cuestiones relacionadas