2008-10-09 15 views

Respuesta

7

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.

+0

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

+0

Sí, el "tenedor de recursos" es el arcaico. La mayoría de los programas solo tratan con el "fork de datos". – ephemient

+0

Gracias - Editaré mi comentario para corregir mi error –

1

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).

+0

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

0

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?

0

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

+0

Esto es cierto en Linux, pero no en el sistema de archivos Mac OS X predeterminado, HFS +. Vea mi respuesta a esta pregunta. – titaniumdecoy

+0

> 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 –

11

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
0

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.