2012-01-17 19 views
8

Dadas dos rutas que tengo que comparar si apuntan al mismo archivo o no. En Unix esto se puede hacer con os.path.samefile, pero como la documentación indica que no está disponible en Windows. ¿Cuál es la mejor manera de emular esta función? No es necesario que emule el caso común. En mi caso existen las siguientes simplificaciones:¿Cómo emular el comportamiento os.path.samefile en Windows y Python 2.7?

  • Las rutas no contienen enlaces simbólicos.
  • Los archivos están en el mismo disco local.

Ahora utilizar los siguientes:

def samefile(path1, path2) 
    return os.path.normcase(os.path.normpath(path1)) == \ 
      os.path.normcase(os.path.normpath(path2)) 

¿Está bien?

+2

'>>> os.path.normcase (os.path.normpath (r" c: \ users \ aayoubi \ desktop ")) 'c: \\ users \\ aayoubi \\ desktop'' i couldn' Encontrar casos en los que esto fracase. – aayoubi

+0

Acabo de encontrar un ejemplo. 'c: \\ one \ two' y 'c: \\ one \ two \' pueden apuntar al mismo directorio, pero este método diría que son diferentes. –

+1

ambas salidas fueron las mismas: '>>> os.path.normcase (os.path.normpath (r" c: \\ one \ two ")) 'c: \\ one \\ two'' '>>> os.path.normcase (os.path.normpath (r" c: \\ one \ two \\ ")) 'c: \\ one \\ two'' – aayoubi

Respuesta

3

La llamada al sistema os.stat devuelve una tupla con mucha información sobre cada archivo, incluida la creación y las marcas de tiempo de la última modificación, el tamaño y los atributos del archivo. Las posibilidades de que diferentes archivos tengan los mismos parámetros son muy escasas. Creo que es muy razonable para hacerlo:

def samefile(file1, file2): 
    return os.stat(file1) == os.stat(file2) 
+3

Supongo que es técnicamente posible que el archivo se modifique entre las dos llamadas a stat. Comparando la ruta como lo hace en la pregunta no tendría este problema – Shawabawa

+0

Sí, para los archivos aleatorios tales posibilidades son muy pequeñas. Pero tengo un montón de archivos creados de forma semiautomática y muchos de ellos tienen el mismo tamaño y marcas de tiempo. –

+0

Creo que ese enfoque es probable que conduzca a errores difíciles de encontrar. Este tipo de caso puede ocurrir cuando, por ejemplo, un archivador descomprime muchos archivos, todos con las mismas marcas de tiempo. Si son archivos de cero bytes, uno podría terminar con muchas coincidencias falsas ... –

2

El caso de uso real de os.path.samefile no es enlaces simbólicos, pero duro enlaces. os.path.samefile(a, b) devuelve True si a y b son enlaces duros al mismo archivo. Puede que no tengan el mismo camino.