2009-05-03 28 views
5

Estoy construyendo una aplicación de utilidad que sincroniza archivos en dos sistemas para Mac OSX. Necesito detectar cuándo se ha cambiado el nombre de un archivo, pero de lo contrario es el mismo archivo. ¿Cómo hago esto en Cocoa?¿Cómo puedo detectar si un archivo ha sido renombrado usando Cocoa?

+0

Buena pregunta, pero dudo que haya una manera. –

+0

ya preguntado y respondido? http://stackoverflow.com/questions/645321/how-to-dectect-new-or-modified-files-in-mac-osx/645379#645379 –

Respuesta

3

No hay una respuesta simple; necesitas descubrir la mejor estrategia para tu aplicación.

En un nivel simple, está trabajando con el número del sistema de archivos. Puede agarrar esto usando NSFileSystemFileNumber. Probablemente sea mejor para el trabajo usar FSRef. Es una API de C pero relativamente sencilla, y tiene un método para comparar con FSRefs para la igualdad.

Pero hay muchas aplicaciones que realizan una operación de salvar reemplazando el archivo en el disco, cambiando su número de archivo. Esto podría alterar tu código. Así que considere usar alias. Este es el mismo sistema que el Finder utiliza para realizar un seguimiento del objetivo de un archivo de alias. Utilice el Administrador de alias (API de C) o uno de los contenedores de Objective-C de fuente abierta (por ejemplo, NDAlias ​​o BDAlias). Un alias hará todo lo posible para mantener una referencia a un archivo por ruta y número de archivo.

0

Puede ver el número de inodo (NSFileSystemFileNumber en los atributos devueltos por NSFileManager), que cubriría casos simples de cambio de nombre.

1

Un par de detalles adicionales que me he encontrado:

Si el archivo sólo se cambia el nombre, el archivo conservará el mismo inodo (NSFileSystemFileNumber).

Sin embargo, si se modificó el archivo, Mac OS X generalmente reemplazará el archivo anterior con una copia del archivo nuevo, por lo que los números de inodo no serán los mismos.

Si edita un archivo de texto en TextEdit y luego lo guarda, es posible que observe que el archivo desaparece y luego vuelve a aparecer en el Finder. Sin embargo, si edita este archivo con un editor de línea de comandos (vi, pico, emacs, etc.), se guardará en el archivo directamente.

Supongo que las aplicaciones Cocoa se guardarán primero en un archivo temporal y luego reemplazarán la versión original del archivo, lo que explica por qué los inodos son diferentes.

+0

Tengo el mismo problema anterior ¿me puede decir la solución alternativa? identificado de forma exclusiva cuando el archivo se modifica? También puede dar una respuesta desde este enlace: http://stackoverflow.com/questions/30191016/is-there-any-function-to-retrieve-the-path-associated-with-an-nsfilesystemfilenu – jigs

0

Supongo que tiene como objetivo el contenido de los archivos, no sus atributos. La forma más fácil es calcular y comparar hashes. Solo lea los dos archivos bloque por bloque y compare los valores hash, e. gramo. con estas rutinas MD5.

0

Todo lo mencionado anteriormente fallará si tiene el origen y el destino en diferentes plataformas/sistema operativo. La mejor manera es obtener una lista de los archivos nuevos y los archivos perdidos en las ubicaciones de origen y de destino, y luego, si dos archivos tienen el mismo tamaño. si tienen el mismo tamaño, compare allí Checksum/CRC y, si esto es lo mismo, se ha cambiado el nombre de uno de ellos.

Cuestiones relacionadas