2008-10-30 10 views
6

Dites que j'ai un fichier d'entrée et un répertoire cible. Comment puis-je déterminer si le fichier d'entrée se trouve sur le même disque dur (ou partition) que le répertoire cible?Comment déterminer si un répertoire se trouve sur la même partition

Ce que je veux faire est la copie d'un fichier si c'est sur un autre, mais déplacez-le si c'est pareil. Par exemple:

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) 

Merci à la réponse de CesarB, la fonction same_partition mise en œuvre:

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

Répondre

11

En C, vous pouvez utiliser stat() et comparer le champ st_dev. En python, os.stat devrait faire de même.

+0

Notez que cela ne fonctionnera pas sous Windows, ce qui laisse st_dev à 0 pour tous les lecteurs. (Probablement pas un problème pour le questionneur puisqu'il spécifie les balises osX et linux) – Brian

3

Une autre façon est l'approche «mieux vaut demander pardon que la permission» - essayez simplement de le renommer, et si cela échoue, attrapez le OSError approprié et essayez l'approche de copie. à savoir:

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

Cela a l'avantage également fonctionner sous Windows, où st_dev est toujours 0 pour toutes les partitions.

Notez que si vous voulez vraiment copier, puis supprimez le fichier source (effectuer un mouvement.), Plutôt que de simplement copier, puis shutil.move va déjà faire ce que vous voulez:

 
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. 

[ Edit] Mis à jour en raison du commentaire de Matthew Schinckel pour mentionner que shutil.move va supprimer la source après la copie, ce qui n'est pas forcément ce qui est voulu, car la question mentionne simplement la copie.

+0

Pas tout à fait pareil. L'OP ne semblait pas vouloir supprimer l'original s'il se trouvait sur des disques différents. –

+0

Bon point - j'avais raté ça. – Brian