Home > Latest topics

Latest topics > WSLでフォルダーを作るとWindowsでNTFSなパーティションでも大文字小文字が区別される落とし穴がある

宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能! シス管系女子って何!? - 「シス管系女子」特設サイト

WSLでフォルダーを作るとWindowsでNTFSなパーティションでも大文字小文字が区別される落とし穴がある - Dec 23, 2020

業務でWindowsネイティブのアプリケーションに関わることになって、Visual Studio用のプロジェクトになってるリポジトリをcloneしてきてビルドしようとしたら、fatal error C1083: コンパイラの中間生成物 ファイルを開けません。(ファイルパス):No such file or directory とエラーが出てビルドできなくて、ドハマリしてた。Windowsのエクスプローラで見ても確かにその位置にファイルはあるのに。何故?

他の人を巻き込んで調査に協力してもらって最終的に分かったことは、ファイルシステムがNTFSのパーティションでもパスの大文字小文字が区別される状態になっていることがあり、エラーメッセージに現れていたパス(すべて小文字)では実際のファイル(大文字小文字混在)にアクセスできなかったのが原因だということだった。パスの大文字小文字を区別しない状態に設定を修正したら、問題は解決した。

 

何故そんな状態が発生していたかというと、今使っている作業環境(Windows 10)に引っ越すにあたり、旧環境から必要なファイルをまとめて持ってくるために、WSL1上のrsyncを使ったのが原因だったようだ。Per-directory case sensitivity and WSL | Windows Command Lineという記事によると、This option controls which directories are treated as case sensitive, and whether new directories created with WSL will have the flag set.((DevFsのcaseオプションは)ディレクトリー名の大文字小文字の区別を制御し、WSLで新たに作られたディレクトリーは大文字小文字を区別するフラグがセットされた状態となる)とあった。PowerShellで当該フォルダに cd して fsutil.exe file queryCaseSensitiveInfo . と実行してみると、確かに問題のcloneされたリポジトリのディレクトリーはパスの大文字小文字が区別される状態になっていた。

この状態は fsutil.exe というコマンドを使って、fsutil.exe file setcasesensitiveinfo . disable とすれば解除できるそうなのだけれど、残念ながらこの fsutil.exe は再帰的な実行に対応していないため、問題を解決しようと思うと、cloneしたリポジトリ配下のファイルやディレクトリーすべてにこのコマンド列を実行しなくてはならない。それはあまりにかったるいしヒューマンエラーも起こりそうだったので、既存の質問に寄せられていた回答に倣って、PowerShellで以下のようなコマンド列を実行して再帰的にディレクトリーの設定を修正することにした。

(Get-ChildItem -Recurse -Directory).FullName | ForEach-Object {fsutil.exe file setCaseSensitiveInfo $_ disable}

普段はファイル名に大文字小文字を混在させないようになるべく意識しているせいで、この状態が発生している事に気付いてなかった。メモ帳や秀丸エディタなどのWindowsアプリケーションでエラーメッセージに現れていたパスのファイルを開こうとして、確かにファイルはあるのにファイルが見つからないと言われる、という現象が調査の過程で発生して、それでやっと気が付いたんだった。自分で知らないうちに掘っていた落とし穴に、掘ったことにも気付かず自分でハマってしまった。

という学びを得た話をWSLアドベントカレンダー2020に書けばよかったんだけど、もうすべて埋まってたので、記録のためにここに放流しておく。

分類:システム再構築, , , 時刻:19:17 | Comments/Trackbacks (1) | Edit

Comments/Trackbacks

no title

なおcase=dirがデフォルトなのはバージョン1803だけで1809以降はcase=offがデフォルトな為今から新規にWSLを使う人は意図的にやらないとこの状況は起きなくなったのである

Commented by at 2020/12/30 (Wed) 21:25:08

TrackBack ping me at


の末尾に2020年11月30日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2020-12-23_wsl-fsutil.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。

Post a comment

writeback message: Ready to post a comment.

2020年11月30日時点の日本の首相のファミリーネーム(ひらがなで回答)

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のコメント

最近のつぶやき