2 votos

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

Me gustaría ver si alguno de mi archivo es "all over the place", es decir, fragmentado en pequeños trozos en diferentes ubicaciones en el disco duro.

Yo no estoy buscando un software como iDefrag sino más bien una utilidad de línea de comandos. Yo no sé nada de los sistemas de archivos, nodos, etc. Hace un CL de la herramienta de existir? De manera más general, ¿cómo saber dónde se encuentran los archivos son físicamente?

El archivo que se desea investigar es ~/Library/Application Support/Google/Chrome/Default/Historia de los índices, sino que se trata más bien de una cuestión general.

2voto

Nader Shirazie Puntos 8494

HFSDebug fue una herramienta decente en una versión anterior de OS x, sin embargo, yo no lo creía Lion es compatible.

http://www.osxbook.com/software/hfsdebug/

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

http://filexray.com/

2voto

Arthur Puntos 143

Me hizo la misma pregunta en quora y alguien impresionante respondió con un programa en C que él hizo a sí mismo.

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;
}

Puesto que en un archivo, el nombre de fragmentación.c o algo así, y ejecutar make frag o gcc frag.c -o frag. Ahora puede ejecutar ./frag path/to/your/file. Usted puede también agregar el tamaño de bloque como segundo argumento. Tenga en cuenta que usted tendrá que ser capaz de compilar el programa, que en Mac OS X se hace generalmente por tener XCode instalado.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X