Me gustaría crear un archivo disperso de modo que los bloques de cero no ocupen el espacio real en el disco hasta que les escriba datos. ¿Es posible?¿Cómo creo un archivo disperso programáticamente, en C, en Mac OS X?
Respuesta
Al igual que en otros Unixes, es una característica del sistema de archivos. O el sistema de archivos lo admite para TODOS los archivos o no. A diferencia de Win32, no tienes que hacer nada especial para que esto ocurra. Además, a diferencia de Win32, no hay una penalización de rendimiento por usar un archivo disperso.
En MacOS, el sistema de archivos predeterminado es HFS + que hace no admite archivos dispersos.
Actualización: MacOS solía soportar volúmenes UFS con soporte de archivos dispersos, pero eso se ha eliminado. Ninguno de los sistemas de archivos admitidos actualmente tiene soporte para archivos dispersos.
Hmmm ... en cierto sentido, la bifurcación de datos es la de unixy, y la bifurcación de recursos es el bicho raro especializado, ¿no? No es que importe de ninguna manera. Aclamaciones. – dmckee
Sí, el "tenedor de recursos" es el arcaico. La mayoría de los programas solo tratan con el "fork de datos". – ephemient
Gracias - Editaré mi comentario para corregir mi error –
hdiutil puede manejar imágenes y archivos escasos, pero desafortunadamente el marco al que se vincula es privado.
Puede intentar definir los símbolos externos definidos por el marco de DiskImages a continuación, pero esto probablemente no sea aceptable para el código de producción, y dado que el marco es privado, tendría que aplicar ingeniería inversa a sus casos de uso.
cristi: ~ diciu $ otool -L/usr/bin/hdiutil
/usr/bin/hdiutil: /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages (versión 1.0 compatibilidad .8, versión actual 194.0.0) [..]
cristi: ~ diciu $ nm /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages | awk -F '' '{print $ 3}' | C++ filt | grep -i escasa
[..]
CSparseFile :: sector2Band (tiempo largo)
CSparseFile :: addIndexNode()
CSparseFile :: readIndexNode (largo, largo, SparseFileIndexNode *)
CSparseFile :: readHeaderNode (CBackingStore *, * SparseFileHeaderNode, largo sin signo)
[... cortado por brevedad]
Posteriormente Editar
Usted podía uso hdiutil como un proceso externo y tiene que crear una imagen de disco escasa para usted. A partir del proceso C, crearía un archivo en la imagen de disco disperso (montado).
Hola, solo tengo que profundizar en las estructuras privadas 'hdiutil' para adjuntar un archivo DMG mediante programación (archivo que representa la imagen del disco desde la partición HFS +). Me pregunto si usted cava un poco dentro de la estructura de DiskImages y busca el método correcto.gracias – Zohar81
Si desea portabilidad, el último recurso es escribir su propia función de acceso para que pueda administrar un índice y un conjunto de bloques.
En esencia, usted administra un solo archivo ya que el SO gestiona el disco manteniendo la cadena de los bloques que forman parte del archivo, el mapa de bits de los bloques asignados/libres, etc.
Por supuesto, esto dará lugar a un acceso no optimizado y más lento, recomendaría esta aplicación solo si el requisito de ahorrar espacio es absolutamente crítico y tiene tiempo suficiente para escribir un conjunto sólido de funciones de acceso.
E incluso en ese caso, primero investigaría si su problema necesita una solución diferente. Probablemente debería almacenar sus datos de manera diferente?
Si busca (fseek, ftruncate, ...) más allá del final, el tamaño del archivo aumentará sin asignar bloques hasta que escriba en los agujeros. Pero no hay forma de crear un archivo mágico que convierta automáticamente bloques de ceros en agujeros. Tienes que hacerlo tú mismo.
Esto puede ser útil para observar (el comando OpenBSD cp inserta agujeros en lugar de escribir ceros). patch
Esto es cierto en Linux, pero no en el sistema de archivos Mac OS X predeterminado, HFS +. Vea mi respuesta a esta pregunta. – titaniumdecoy
> Si busca (fseek, ftruncate, ...) más allá del final, el tamaño del archivo aumentará sin asignar bloques Esto no parece ser cierto en OSX –
Parece haber cierta confusión sobre si el sistema de archivos Mac OS X predeterminado (HFS +) admite agujeros en los archivos. El siguiente programa demuestra que este no es el caso.
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
void create_file_with_hole(void)
{
int fd = open("file.hole", O_WRONLY|O_TRUNC|O_CREAT, 0600);
write(fd, "Hello", 5);
lseek(fd, 99988, SEEK_CUR); // Make a hole
write(fd, "Goodbye", 7);
close(fd);
}
void create_file_without_hole(void)
{
int fd = open("file.nohole", O_WRONLY|O_TRUNC|O_CREAT, 0600);
write(fd, "Hello", 5);
char buf[99988];
memset(buf, 'a', 99988);
write(fd, buf, 99988); // Write lots of bytes
write(fd, "Goodbye", 7);
close(fd);
}
int main()
{
create_file_with_hole();
create_file_without_hole();
return 0;
}
El programa crea dos archivos, cada uno 100.000 bytes de longitud, uno de los cuales tiene un agujero de 99,988 bytes.
En Mac OS X 10.5 en una partición HFS +, ambos archivos ocupan el mismo número de bloques de disco (200):
$ ls -ls
total 400
200 -rw------- 1 user staff 100000 Oct 10 13:48 file.hole
200 -rw------- 1 user staff 100000 Oct 10 13:48 file.nohole
Mientras que en CentOS 5, el archivo sin agujeros consume 88 más bloques de disco que el otro:
$ ls -ls
total 136
24 -rw------- 1 user nobody 100000 Oct 10 13:46 file.hole
112 -rw------- 1 user nobody 100000 Oct 10 13:46 file.nohole
Este hilo se convierte en una fuente completa de información sobre los archivos dispersos. Aquí está la parte que falta para Win32:
Tool that estimates if it makes sense to make file as sparse
Saludos
Parece que OS X es compatible con archivos dispersos en volúmenes UDF. Probé el programa de pruebas de titaniumdecoy en OS X 10.9 y generó un archivo disperso en una imagen de disco UDF. Además, no es que UFS ya no sea compatible con OS X, por lo que si necesita archivos dispersos, UDF es el único sistema de archivos compatible nativo que los admite.
También probé el programa en acciones SMB. Cuando el servidor es Ubuntu (sistema de archivos ext4) el programa crea un archivo disperso, pero 'ls -ls' a través de SMB no lo muestra. Si hace 'ls -ls' en el host de Ubuntu, sí muestra que el archivo es escaso. Cuando el servidor es Windows XP (sistema de archivos NTFS), el programa no genera un archivo disperso.
- 1. ¿Se ejecuta programáticamente al inicio en Mac OS X?
- 2. JNotify en Mac OS X?
- 3. División de un archivo usando AWK en Mac OS X
- 4. ¿Cómo instalar MySQL Connector/C en Mac OS X?
- 5. ¿Cómo obtener el tipo de archivo en Mac OS X?
- 6. ¿Cómo configurar libusb en Mac OS X?
- 7. ¿Cómo instalo wxPython en Mac OS X?
- 8. Cómo usar dylib en Mac OS X (C++)
- 9. Mac OS X: CGGetLastMouseDelta y moviendo el mouse programáticamente
- 10. Mac OS X - cambiar el tamaño programáticamente de Windows
- 11. Actualizaciones de aplicaciones en Mac OS X
- 12. Objective-C de serie - Mac OS X
- 13. Symbian C++ Desarrollo bajo Mac OS X
- 14. ¿Por qué fwrite() no escribe un archivo binario usando "wb", en C, en Mac OS X?
- 15. Enlace estático wxHaskell en Mac OS X
- 16. Aprendiendo ASP.NET MVC en Mac OS X
- 17. Mac OS X View Swapping
- 18. ¿Podemos ejecutar una aplicación C#/WPF en Mac OS X?
- 19. Icono de alta resolución para archivo en Mac OS X?
- 20. Mac OS X: Abrir archivo en el buscador + App Sandbox
- 21. Desarrollo de Blackberry en Mac OS X
- 22. Errores Virtualenvwrapper en Mac OS X Lion
- 23. ¿Cómo ejecutar un script como root en Mac OS X?
- 24. Gdb en Mac OS X v10.7 (Lion)
- 25. Vim Insertar modo en Mac OS X
- 26. ¿Existe un compilador de C# para Mac OS X?
- 27. wxPython 2.9 en Mac Os X
- 28. ¿Cómo crear un archivo disperso en NTFS?
- 29. C++ 11 con Xcode en Mac OS X Snow Leopard
- 30. Instalar CLSQL en Mac OS X
Creo que sería útil saber POR QUÉ desea dispersar archivos. –