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?
Respuesta
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.
Puede ver el número de inodo (NSFileSystemFileNumber en los atributos devueltos por NSFileManager), que cubriría casos simples de cambio de nombre.
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.
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
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.
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.
- 1. Cómo detectar si Console.In (stdin) ha sido redirigido?
- 2. ¿Cómo puedo detectar si una extensión de Chrome ha sido habilitada (después de haber sido deshabilitada)
- 3. ¿Cómo detectar si una notificación ha sido descartada?
- 4. ¿Puedo detectar que un método ha sido anulado?
- 5. jQuery - Detectar si un archivo ha sido seleccionado en el archivo de entrada
- 6. ¿Cómo puedo detectar si un MapView de Android ha sido desplazado o ampliado?
- 7. ¿Cómo puedo determinar si Console.Out ha sido redirigido a un archivo?
- 8. ¿Cómo puedo detectar si el usuario ha sido seleccionado de las opciones de createChooser?
- 9. ¿Cómo puedo determinar si una imagen ha sido retocada?
- 10. ¿Cómo puedo verificar si una estructura ha sido instanciada?
- 11. ¿Cómo puedo saber si un cable de red ha sido desenchufado?
- 12. usando stat para detectar si existe un archivo (¿lento?)
- 13. ¿Cómo puedo saber si un delegado en particular ya ha sido asignado a un evento?
- 14. ¿Es posible detectar si un Stream ha sido cerrado por el cliente?
- 15. ¿Cómo detecta git que un archivo ha sido modificado?
- 16. Git: archivo renombrado manualmente, Git confundido
- 17. ¿Cómo comprobar si un archivo ha sido abierto por otra aplicación en C++?
- 18. Linux: ¿Cómo averiguo si un archivo ha sido actualizado por otro proceso?
- 19. Cómo detectar si un elemento en mi ObservableCollection ha cambiado
- 20. ¿Cómo verificar si una característica ha sido activada?
- 21. ¿Cómo puedo "desarmar" una clase que ha sido declarada
- 22. cómo determinar si la página web ha sido modificada
- 23. Cómo comprobar si NSTimer ya ha sido invalidado
- 24. Windows: cómo determinar si un archivo ha sido modificado desde una fecha determinada
- 25. Javascript: detectar cuando la página ha sido navegada "atrás" a
- 26. ¿Puedo editar con seguridad un archivo renombrado de manera forzada?
- 27. Cómo detectar si un usuario ha cerrado sesión, en php?
- 28. Averiguar si un objeto Open Graph ha sido leído antes
- 29. ¿La mejor manera de detectar si el texto de TextView ha sido cambiado?
- 30. ¿Cómo detectar si una variable ha cambiado?
Buena pregunta, pero dudo que haya una manera. –
ya preguntado y respondido? http://stackoverflow.com/questions/645321/how-to-dectect-new-or-modified-files-in-mac-osx/645379#645379 –