

OS とファイルシステムにより、case insensitive であったり、いわゆる全角と半角の同一視であったり、Unicode
正規化などによって、ディレクトリエントリ上のファイル名と完全に一致していなくても特定のファイルを指定できることがありますが、ユーザの指定したファイル名から、これに一致する実際のディレクトリエントリ上のファイル名を得る方法がありますでしょうか。

[code]

    % touch A.txt                         
    % ls   
    A.txt
    % wc a.txt                             
           0       0       0 a.txt
    
[/code]

例として、ディレクトリエントリ上のファイル名は A.txt ですが、ユーザが a.txt
を指定してもこのファイルにアクセスできてしまいます。この状態のとき、ユーザが入力（指定）した a.txt から実際のファイル名 A.txt
を得る方法になります。

力技として、ファイル名からディレクトリを得て、os.scandir()
で読み出してチェックすることも考えましたが、ファイル名の一致判定の方法が思いつきませんでした。i-node
で判定するとハードリンクで違うファイル名にも一致してしまいます。

python に限りませんが、ファイルシステムや OS (Win, mac, Linux/Unix) に依存しない方法がないでしょうか。


CC BY-SA 4.0
2023-05-15T10:48:56.763
94858
2023-05-17T01:55:07.280
2023-05-17T01:29:55.827
3060
58300
question
python
ユーザ指定のファイル名に一致するディレクトリエントリ上のファイル名を得るには？


> ファイルシステムや OS (Win, mac, Linux/Unix) に依存しない方法がないでしょうか。

私が知る限り、統一的な方法はないかと思います。

以下、Python で使えるかどうかわからない情報です。

  * macOS は [`NSString` の `fileSystemRepresentation`](https://developer.apple.com/documentation/foundation/nsstring/1414559-filesystemrepresentation?language=objc) を呼んでからディレクトリ内のファイル一覧と `fnmatch(..., FNM_CASEFOLD)` で比較すればいいかもしれません。
  * Windows は、入力ファイル名で [`FindFirstFile()`](https://learn.microsoft.com/ja-jp/windows/win32/api/fileapi/nf-fileapi-findfirstfilea) を呼ぶと結果の `WIN32_FIND_DATA::cFileName` にはディスク上の名前が入っていた記憶があります。


CC BY-SA 4.0
2023-05-17T01:27:29.417
94873
2023-05-17T01:55:07.280
2023-05-17T01:55:07.280
3475
3475
94858
answer