¿Cómo investigar la fragmentación de un archivo?

2

Me gustaría ver si uno de mis archivos está "por todas partes", es decir, fragmentado en pequeños pedazos en diferentes ubicaciones de mi disco duro.

No estoy buscando un software como iDefrag sino una utilidad de línea de comandos. No sé nada de sistemas de archivos, nodos, etc. ¿Existe tal herramienta CL? Más generalmente, ¿cómo sabes dónde están físicamente los archivos?

El archivo que quiero investigar es ~ / Library / Application Support / Google / Chrome / Default / History, pero eso es más una pregunta general.

    
pregunta Arthur 12.01.2012 - 12:49

2 respuestas

2

Hice la misma pregunta en quora y alguien impresionó con un programa de C que él mismo inventó.

Aquí está su código:

/*
  check-frag filename [blockjump]
*/  
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/fcntl.h>
#include <unistd.h>
#include <stdint.h>


int main(int argc, char *argv[]) {
    struct log2phys lf;
    int start, end, i, status;
    int blockjump = 4096;
    struct stat st_buf;

    if (argc < 2) {
        printf("Enter a filename.\n");
        return 1;
    }
    if (argc == 3) {
        blockjump = atoi(argv[2]);
    }
    printf("Using block size of %d\n", blockjump);
    status = stat(argv[1], &st_buf);
    if (status != 0 || (!(S_ISREG (st_buf.st_mode)))) {
        fprintf(stderr, "Error reading file %s or file is not regular file.\n", argv[1]);
        return 1;
    }
    int fd = open(argv[1], O_RDONLY);
    if (fd == -1) {
        fprintf(stderr, "Error or file not found: %s\n", argv[1]);
        return 1;
    }
    start = lseek(fd, 0, SEEK_CUR);
    end = lseek(fd, 0, SEEK_END);
    printf("start: %d\tend: %d\n", start, end);
    off_t last = 0;
    int cblocks = 1;
    int tblocks = 1;
    for (i = 0; i < (end-blockjump); i=i+blockjump) {
        tblocks++;
        lseek(fd, i, SEEK_SET);
        fcntl(fd, F_LOG2PHYS, &lf);
        if (last != lf.l2p_devoffset && last != (lf.l2p_devoffset-blockjump)) {
            printf("%jd\n", (intmax_t)lf.l2p_devoffset);
        } else {
            cblocks++;
        }
        last = lf.l2p_devoffset;

    }
    printf("contiguous blocks: %d\n", cblocks);
    printf("total blocks: %d\n", tblocks);
    printf("difference (fragmented extents): %d\n", tblocks-cblocks);
    printf("percent contiguous in file: %f\n", (float)cblocks/(float)tblocks);
    close(fd);

    return 0;
}

Ponga eso en un archivo, asígnele el nombre frag.c o algo así, y ejecute make frag o gcc frag.c -o frag . Ahora puedes ejecutar ./frag path/to/your/file . También puede agregar el tamaño de bloque como un segundo argumento. Tenga en cuenta que tendrá que ser capaz de compilar el programa, que en Mac OS X generalmente se realiza al tener instalado XCode.

    
respondido por el Arthur 21.01.2012 - 19:56
2

HFSDebug era una herramienta decente en una versión anterior de OSX, pero no creo que sea compatible con Lion.

enlace

El creador original de HFSDebug recomienda File Xray, un programa comercial para realizar las mismas tareas y más, échale un vistazo aquí

enlace

    
respondido por el Stu Wilson 12.01.2012 - 17:06

Lea otras preguntas en las etiquetas