2011-12-11 19 views
5

Dato un file system cifs montato /network/cifs che non fa distinzione tra maiuscole e minuscole, come si ottiene il percorso case sensitive utilizzando C?Come posso ottenere un percorso case sensitive su Linux senza l'iterazione della directory?

Ad esempio, il file fs ha un file /network/cfis/Adena/t.txt. Dato /network/cfis/AdEnA/T.txt (che risolve correttamente), voglio /network/cfis/Adena/t.txt.

So che un modo per farlo è iterare ricorsivamente sul percorso, confrontarli in minuscolo e ottenere il caso restituito dall'iterazione della directory. Tuttavia, questo comporta un sacco di syscalls che preferirei non fare.

La modifica delle opzioni di montaggio non è una soluzione.

Se ciò non è possibile, è possibile determinare se un percorso si trova su un file system senza distinzione tra maiuscole e minuscole? In questo modo ho potuto evitare di fare l'iterazione ricorsiva della directory, se non richiesto.

risposta

3

Questa domanda è arrivata la scorsa notte in IRC; la mia risposta è stata la necessità di ripetere, e il motivo è che getcwd (che può essere implementato guardando solo i file /proc/N/ in Linux) non è affidabile per determinare il nome canonico. Il modulo del kernel di Linux CIFS volontà falsi fino inode al volo con l'involucro che hai chiesto:

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

può mostrare valori molto diversi, e come tale, /proc/self/cwd rifletterà uno di questi inode, non necessariamente quello con la denominazione canonica.

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

Non lo dire 'if (NULL == GetCurrentDir (tampone, FILENAME_MAX))' – Dan

+0

Penso che volevi usare la macro 'GetCurrentDir' invece di' getcwd' nel codice? –

+0

Cosa succede se il percorso passato non è la directory corrente? – RedX

0

Una possibile soluzione potrebbe essere quella di open il file per la lettura, ottenendo un descrittore di file, per esempio 23, poi a readlink il pseudo-file /proc/self/fd/23 (ma forse quel trucco non funziona bene, ho fatto non provarlo)

+1

Non funziona :(. –

0

Per quello che vale, ecco un modo che funziona su OSX (ma a quanto pare non 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

realpath non è specificato come questo. Risolve solo., .. e symlink. Inoltre non funzionava per me in pratica su Linux. –

+0

Grazie. L'avevo provato solo su OSX , assumendo erroneamente che il comportamento sarebbe lo stesso. – Billy

Problemi correlati