Windowsでは大文字と小文字は区別しない動作がデフォルト

Linuxユーザーである本連載の読者ならば、当然Linuxではファイル名の大文字と小文字は区別して扱われていることを知っていると思う。例えば「hoge.txt」というファイルと「HOGE.txt」というファイルは別のファイルだ。

しかし、Windowsでは話が違う。現在主に使われているWindowsのファイルシステムでは、機能上は大文字と小文字を区別して扱っているが、互換性のためにこうしたファイルを操作するためにAPI側が大文字と小文字を区別しない動きをデフォルトにしている。以前は大文字と小文字を区別していなかったためだ。

試しに、WSLで次のようにWindowsのファイルシステム(DrvFs経由)のほうにhoge.txtとHOGE.txtというファイルを作ってみる。当然、Linuxからはこのファイルは異なる別のファイルとして扱える。

WSL側からWindowsのファイルシステム上でhoge.txtとHOGE.txtというファイルを作る

今度はWindows側からこのファイルにアクセスしてみる。すると次のように、hoge.txtというHOGE.txtという2つのファイルは異なったものとして認識されるものの、実際にファイルにアクセスするとHOGE.txtのみがアクセスできていることを確認できる。hoge.txtへのアクセスはHOGE.txtへのアクセスになっているわけだ。

Windows側からは異なるファイルとして確認できるものの、実際には片方のファイルにしかアクセスできない

Windowsには既に大文字と小文字を区別した動作をするようにする機能も用意されているが、この機能を有効にするとドライブ全体で大文字と小文字を区別して動作するようになるため、もしかすると既存のアプリケーションでいろいろと問題が発生する可能性がある。まるごと設定を変更するというのはリスキーだ。

それならば、WSL側で大文字と小文字を区別する必要があるような名前付けをしなければよいことになる。まさにその通りなのだが、Microsoftがこうした挙動をWindows側で解決する機能を実装してきたので、取り上げておこうと思う。

Insider Build 17093からはディレクトリごとに大文字小文字区別を設定可能

Microsoftは2018年2月28日(米国時間)、「Per-directory case sensitivity and WSL - Windows Command Line Tools For Developers」において、Windows Insider Build 17093から、ディレクトリごとに大文字と小文字を区別するかどうかの設定が行えるようにしたと発表した。この機能を利用することで、WSLからのWindows側のファイルの扱いを改善すると説明している。

MicrosoftはWindows Insider Build 17107からディレクトリごとに大文字と小文字を区別したり、またはどちらに設定されているのか確認したりするためのコマンドとして「fsutil.exe」ファイルを追加したと説明している。利用方法は次の通りだ。

● fsutil.exeコマンドを使って大文字小文字区別の有効無効を確認する方法

fsutil.exe file queryCaseSensitiveInfo パス

● fsutil.exeコマンドを使って大文字小文字区別を有効化

fsutil.exe file setCaseSensitiveInfo パス enable

● fsutil.exeコマンドを使って大文字小文字区別を無効化

fsutil.exe file setCaseSensitiveInfo パス disable

fsutil.exeコマンドの使用例 - 資料: Microsoft提供

WSL側から大文字・小文字の区別の設定をどう利用するかは、DrvFsマウント時にオプションとして指定できる。今のところ「case=dir」「case=off」「case=force」を指定することができ、/etc/wsl.confにオプションを書いておける。しかし、最終的にはデフォルトの動きがこのディレクトリ別大文字・小文字区別設定を利用するようになりそうなので、ユーザー側は特に気にしなくてもいつの間にかうまいこといっている、といった状況になるように見える。

WindowsはUNIX系のOSとは挙動が異なる点がいくつかあるので、今回のような改善が必要になる。しかし、状況はかなり良さそうだ。MicrosoftはWSLに関連する機能の開発に取り組み続けている。次のアップデートで、WSLはさらに実用性を増すことになりそうだ。