Windowsはかつて「POSIXサブシステム」を備え、UNIX互換のファイルシステムと実行環境を提供していました。POSIXサブシステムは現在のWindowsにはもうありませんが、「Linux用Windowsサブシステム(WSL)」の登場で、POSIXサポートが復活というか、さらに強化されています。その1つが、「POSIX方式(スタイル)の削除」のサポートです。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
「POSIX(Portable Operating System Interface)」は、オペレーティングシステム(OS)の標準的なインタフェースと環境を定義するIEEE規格です。ソースコードレベルで移植性の高いアプリケーション開発を可能にするため、主にUNIX系OSに採用されました。
現在のWindowsの源流である「Windows NT」は、POSIX(IEEE 1003.1)準拠のOSとして開発され、当初は「POSIXサブシステム」というサブシステムと「Services for UNIX(SFU)」というUNIXとの互換性機能を備えていました。また、「NTFS」ファイルシステムには、POSIXサポートのために、大文字と小文字を区別するファイル名とディレクトリ名、ファイルやディレクトリのパーミッション、ハードリンクなどの機能が実装されました。
その後、POSIXサブシステムは廃止され、「UNIXベースアプリケーション用サブシステム(Subsystem for UNIX-Based Application、SUA)」に置き換わりましたが、「Windows 8.1」と「Windows Server 2012 R2」からは削除されました。WindowsにおけるPOSIXサポートはここでひとまず中断しましたが、その成果は「Windows 10」に導入された「Linux用Windowsサブシステム(Windows Subsystem for Linux、WSL)」(バージョン1709から一般提供開始、WSL2はバージョン1903以降)に引き継がれています。
WindowsとPOSIXの関係について、いろいろはしょって説明しましたが、要はWindowsにおけるPOSIXサポートは続いており、WindowsとWSL/WSL2のLinuxシェルのファイルシステム間で相互にファイルをやりとりできるようになったいま、POSIXサポートはさらに強化されているということです。
Windows 10 Fall Creators Update(バージョン1709、RS3)では、NTFSボリュームの新機能として「POSIXスタイル(POSIXセマンティクス)の削除」がサポートされました。「FSUTIL」コマンドの日本語版における出力結果には「POSIXスタイルのリンク解除と名前変更をサポート」と表示されますが、「POSIXスタイルのunlinkとrenameのサポート」です(画面1)。
Windowsでは、あるアプリケーションは別のアプリケーションによって排他的に(ファイルハンドルが)開かれているファイルを、たとえ共有モードで削除が許可されている場合でも、それを即座に削除することができません。
一方、ファイルやディレクトリを削除するLinuxの「unlink(またはrm)」コマンドは、それが可能です。WindowsとWSL/WSL2のLinuxは、ファイルシステム間で相互にやりとりできますが、WSLをサポートするためには、この「POSIXスタイルの削除」をサポートする必要がありました。Windows 10 バージョン1703ではWSLはβ版として利用できましたが、FSUTILの「POSIXスタイルのリンク解除と名前変更をサポート」の行は空白でした(行がないのではなく、空白行であることが、非公式で既に実装されていたことを暗示しています)。
以下の画面2は、「Windows Server 2019」(Windows 10 バージョン1709〜1809でも同様)のPowerShellでファイル「demo.txt」に新規作成し(筆者の都合の良い結果を得るために、共有モードで後続アクセスによる削除を許可)、ファイルハンドルを保持した状態で、コマンドプロンプトから同じファイルを参照しようとしたり、削除しようとしたりしたところです。
ファイルの削除操作は実施されたように見えますが、実行後もファイルは存在し続けています。ファイルの削除操作は、ファイルを排他的に開いているアプリケーションを終了してファイルハンドルが失われた時点で実施されます(画面3)。これが通常のWindowsにおけるファイル削除の挙動になります。
同様の操作を、コマンドプロンプトをWSLのLinuxシェルに置き換えて実施してみます。Windowsの方(Powershell.exe)でファイルが排他的に開かれている状態で、Linuxのunlink(またはrm)コマンドでそのファイルを削除すると、今度はファイルが即座に削除されます。しかも、ファイルを開いているWindows側でエラーは発生しません(ファイルはアプリケーションを閉じるまで引き続きアクセス可能です)。これが「POSIXスタイルの削除」の挙動です。
Windowsのネイティブなアプリケーションの場合でも、ファイル削除のAPIを利用すれば、「POSIXスタイルの削除」を実行できます。
以下の画面5は、前出の画面2と同じことを、Windows Server 2022で実施したものです。Windowsの「Del」コマンドは、別のアプリケーションで排他的に開かれているファイルであっても、即座に削除しました。
実は、Windows 10 May 2019 Update(バージョン1903、19H1)において、「POSIXスタイルの削除」がWindowsの既定に採用されたようなのです。このWindowsの既定の動作変更、つまり仕様変更について、詳しく説明した公式なドキュメントは見当たりません。
最近のWindowsは、このような仕様変更がひっそりと行われ、後になって明らかになることがあるので注意が必要です。この仕様変更は、従来のWindowsにおけるファイル削除の挙動を期待して開発されたアプリケーションに影響する可能性があります。
岩手県花巻市在住。Microsoft MVP 2008 to 2023(Cloud and Datacenter Management)。SIer、IT出版社、中堅企業のシステム管理者を経て、フリーのテクニカルライターに。Microsoft製品、テクノロジーを中心に、IT雑誌、Webサイトへの記事の寄稿、ドキュメント作成、事例取材などを手掛ける。個人ブログは『山市良のえぬなんとかわーるど』。近著は『Windows版Docker&Windowsコンテナーテクノロジ入門』(日経BP社)、『ITプロフェッショナル向けWindowsトラブル解決 コマンド&テクニック集』(日経BP社)。
Copyright © ITmedia, Inc. All Rights Reserved.