「Windows 10ミニTips」は各回の作成時点で最新のWindows 10環境を使用しています。

指定フォルダーなら利用可能だが……

WindowsはMS-DOS時代の慣例から、ファイル名の大文字・小文字を区別しない。MS-DOSは、UNIXなど先達のOSを参考に開発を重ね、そこからファイルシステムであるFATを受け継いだWindowsも同じだった。

  • Windows 10 ミニTips

    WSL上で小文字のファイルと大文字のファイルにリダイレクトで標準出力し、メモ帳で開いてみると後から開いた大文字のファイルで上書きしていることが確認できる

厳密には、Windows NT系と呼ばれるOSは、当初からファイル名の大文字・小文字を区別するAPIを用意していたものの、互換性の関係から無効にしている。

この仕様が変更されることになったのは、WSLの存在だ。Windows 10上でLinuxディストリビューションの動作を実現するWSLと互換性を保つため、Windows 10 ビルド17107からファイル名の大文字・小文字を区別する機能が加わった。

つまり、Windows 10 バージョン1803(April 2018 Update)は大文字・小文字を区別したファイル名を扱うことが可能だ。「fsutil」コマンドの「queryCaseSensitiveInfo」を用いると、ファイル名の大文字・小文字の属性を判断し、「SetCaseSensitiveInfo」で指定したフォルダーの属性を切り替える。

  • Windows 10 ミニTips

    コマンドプロンプトを起動し、「fsutil.exe file queryCaseSensitiveInfo C:¥Users¥kaz¥Desktop」と実行すると、デスクトップフォルダーの属性が確認できる。続いて「fsutil.exe file SetCaseSensitiveInfo C:¥Users¥kaz¥Desktop enable」と実行することで、大文字・小文字の属性を有効にする

  • Windows 10 ミニTips

    同じように、WSL上で小文字・大文字のファイルを作成すると、今度はそれぞれのファイルが正しく生成できたことを確認できる

  • Windows 10 ミニTips

    lsコマンドでデスクトップフォルダーを確認すると、図のように大文字・小文字のファイルが存在する

上図のとおり、SetCaseSensitiveInfoは指定したフォルダーに対して、ファイル名の大文字・小文字を区別する属性を付与している。一見すると、この属性をシステム全体に展開したほうが有益に思えるだろう。

だが、本来はファイル名で大文字・小文字を考慮しないアプリを実行すると、正しく動作しない(かもしれない)互換性問題が発生してしまう。そのため、WSL上でソースコードを展開し、コマンドラインでビルドするような場面でもない限り、この機能を使う場面はない。

  • Windows 10 ミニTips

    「fsutil.exe file SetCaseSensitiveInfo C:¥Users¥kaz¥Desktop disable」と実行すれば、属性を無効にできる。ただし、対象となるフォルダーにファイルが存在するとエラーが発生するので、必要なファイルは退避・削除してから実行しよう

とはいえ、何らかのトラブルに見舞われ、ファイル名の大文字・小文字を区別する必要性が生じた場合、上図に示した操作で属性を無効にできることは覚えておくとよいだろう。

阿久津良和(Cactus)