2011-12-11 9 views
5

Dado un sistema de archivos cifs montado /network/cifs que no distingue entre mayúsculas y minúsculas, ¿cómo obtengo la ruta sensible a mayúsculas y minúsculas utilizando C?¿Cómo puedo obtener una ruta sensible a mayúsculas y minúsculas en Linux sin iteración de directorios?

Por ejemplo, el fs tiene un archivo /network/cfis/Adena/t.txt. Dado /network/cfis/AdEnA/T.txt (que se resuelve correctamente), quiero /network/cfis/Adena/t.txt.

Sé que una forma de hacerlo es iterar recursivamente sobre la ruta, hacer coincidir todas las minúsculas y obtener el caso real devuelto por la iteración del directorio. Sin embargo, esto implica una gran cantidad de llamadas de sistema que preferiría no hacer.

Cambiar las opciones de montaje no es una solución.

Si esto no es posible, ¿es posible determinar si hay una ruta en un sistema de archivos que no distingue entre mayúsculas y minúsculas? De esta forma podría evitar hacer iteraciones de directorios recursivas a menos que sea necesario.

Respuesta

3

Esa pregunta acaba de salir anoche en el IRC; mi respuesta fue que tiene que iterar, y la razón es que getcwd (que puede implementarse simplemente mirando los archivos /proc/N/ en Linux) no es confiable para determinar el nombre canónico. El módulo del núcleo Linux CIFS hará falsos inodos sobre la marcha con la carcasa que usted pidió:

ls -dli /mnt/foo /mnt/foO /mnt/fOo /mnt/FOo /mnt/FOO 

puede mostrar valores muy diferentes, y como tal, /proc/self/cwd reflejará uno de estos nodos-i, no necesariamente el que tiene el nombramiento canónico.

0
#include <stdlib.h> 
#include <stdio.h> /* defines FILENAME_MAX */ 
#ifdef WINDOWS 
    #include <direct.h> 
    #define GetCurrentDir _getcwd 
#else 
    #include <unistd.h> 
    #define GetCurrentDir getcwd 
#endif 


int main(void) 
{ 
    char buffer[FILENAME_MAX]; 

    chdir("/network/cfis/AdEnA"); 
    if (NULL == getcwd(buffer, FILENAME_MAX)) 
     perror("getcwd error"); 
    printf("The current directory is %s.\n", buffer); 
    return 0; 

} 
+0

No quiere decir 'si (== NULL GetCurrentDir (tampón, FILENAME_MAX))' – Dan

+0

Creo que quisiste usar el macro 'GetCurrentDir' en lugar de' getcwd' en el código. –

+0

¿Qué pasa si la ruta aprobada no es el directorio actual? – RedX

0

Una posible solución podría ser la de open el archivo para la lectura, la obtención de un descriptor de archivo, por ejemplo 23, y luego a readlink pseudoficheros /proc/self/fd/23 (pero tal vez ese truco no funcionará bien, lo hice no lo intente)

+1

No funciona :(. –

0

Por lo que vale la pena, que aquí es una manera que funcione en OSX (pero al parecer no Linux):

#include <stdlib.h> 
char case_sensitive_path[1024]; 
realpath("/network/cfis/AdEnA/T.txt", case_sensitive_path); 
// case_sensitive_path is now "/network/cfis/Adena/t.txt" 
+0

no se especifica que realpath haga esto. Solo resuelve., .., y enlaces simbólicos. Tampoco funcionó para mí en la práctica en Linux. –

+0

Gracias. Solo lo había probado en OSX , asumiendo incorrectamente que el comportamiento sería el mismo. – Billy

Cuestiones relacionadas