5

大文字と小文字を区別しないマウントされた cifs ファイル システム/network/cifsがある場合、C を使用して大文字と小文字を区別するパスを取得するにはどうすればよいですか?

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

それを行う1つの方法は、パスを再帰的に反復し、それらをすべて小文字で一致させ、ディレクトリの反復によって返される実際の大文字と小文字を取得することです。ただし、これには、私がむしろやりたくない多くのシステムコールが含まれます。

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

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

4

4 に答える 4

3

その質問は、昨夜 IRC で取り上げられたばかりです。私の答えは、反復する必要があるということでした。その理由は、 ( Linux でファイルをgetcwd見るだけで実装される可能性がある) 正規名を決定する信頼性がないためです。/proc/N/Linux CIFS カーネル モジュールは、要求された大文字と小文字を使用して、オンザフライで inode を偽造します。

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

は非常に異なる値を示す可能性が/proc/self/cwdあるため、これらの inode の 1 つが反映されますが、正規の名前が付いているとは限りません。

于 2011-12-11T13:57:08.703 に答える
0

価値のあるものとして、OSXで機能する方法を次に示します(ただし、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"
于 2014-03-16T04:05:59.970 に答える
0

考えられる解決策は、読み取り用にファイルを開き、ファイル記述子 (たとえば 23) を取得してから、疑似ファイルをreadlink/proc/self/fd/23することです (ただし、そのトリックはうまくいかない可能性があります。私は試していません)。

于 2011-12-11T09:47:03.677 に答える
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 == GetCurrentDir(buffer, FILENAME_MAX))
      perror("getcwd error");
   printf("The current directory is %s.\n", buffer);
   return 0;

}
于 2011-12-11T08:51:16.500 に答える