2011-12-11 8 views
5

大文字と小文字を区別しないでインストールされたcifsファイルシステム/network/cifsが与えられた場合、Cを使用して大文字と小文字を区別するパスを取得するにはどうすればよいですか?ディレクトリ反復なしでLinux上で大文字と小文字を区別するパスを取得するにはどうすればよいですか?

たとえば、fsにはファイル/network/cfis/Adena/t.txtがあります。 /network/cfis/AdEnA/T.txt(適切に解決される)が与えられたら、私は/network/cfis/Adena/t.txtがほしいと思う。

私はパスを反復して繰り返し、すべての小文字でそれらをマッチングさせ、ディレクトリ反復によって返された実際のケースを得る方法を知っています。しかし、これにはたくさんのシステムコールが含まれています。

マウントオプションの変更は解決策ではありません。

これが不可能な場合は、パスが大文字小文字を区別しないファイルシステムにあるかどうかを判断できますか?この方法では、必要な場合を除き、再帰的なディレクトリの繰り返しを避けることができます。

答えて

3

この質問はIRCで昨夜起きました。私の答えはあなたが反復しなければならなかったのです。その理由は、getcwd(これはLinuxで/proc/N/のファイルを見るだけで実装される可能性があります)は正式な名前を決定するためには信頼できません。 LinuxのCIFSカーネルモジュールは、あなたが尋ねたケーシングと、その場でアップ偽のinodeます:

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

は非常に異なった値を示すことができ、そのように、/proc/self/cwdは、これらのinodeの1、とは限らないものを反映します正式な命名何が価値がある、ここではOSX上で動作する方法がある(ただし、明らかではないLinuxの)のために

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

あなたは '場合(NULL == GetCurrentDir(バッファ、FILENAME_MAX))' – Dan

+0

を意味するものではありません。コードで 'getcwd'の代わりに' GetCurrentDir'マクロを使うつもりですか? –

+0

渡されたパスが現在のディレクトリではない場合はどうなりますか? – RedX

0

可能な解決策は、openに読み取り用のファイルであるかもしれないreadlinkに、その後、例えば23、 (おそらくそのトリックがうまく動作しません、私がやった/proc/self/fd/23擬似ファイルをファイルディスクリプタを取得します試してはいけません)

+1

動作しません:(。 –

0

#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はこのように指定されていません。。、..、およびシンボリックリンクを解決するだけで、実際Linuxでは実際には機能しませんでした。 –

+0

私はOSX誤ってその動作が同じであると仮定します。 – Billy

関連する問題