宣伝。日経LinuxにてLinuxの基礎?を紹介する漫画「シス管系女子」を連載させていただいています。 以下の特設サイトにて、単行本まんがでわかるLinux シス管系女子の試し読みが可能!
「C:\Program Files\foo\bar\hoge.txt」という位置にあるファイルを読み込んで処理するアプリケーションを開発していて、テストって事でhoge.txtを書き換えてみたのに、アプリケーションの方でhoge.txtを読み込んでみると、書き換える前の内容が返ってくるんですよ。え、このhoge.txtじゃなくて別の位置のhoge.txtを読みに行っちゃってるの? と思って「C:\Program Files\foo\bar\hoge.txt」を消してみると、「ファイルが見つかりません」ってエラーになるんですよね。だから見に行ってるのは確かにこのファイルで間違いないはずなのに。
僕は普段秀丸エディタを使ってるんですが、秀丸エディタって、書き込み権限が無いファイルを開くと「読み込み専用」って表示されて閲覧だけの状態になるんですよね。でも今回のhoge.txtはそうなってないから、ちゃんと書き換えも保存もできてるんですよ。一回秀丸エディタのウィンドウを閉じて、もう一度「C:\Program Files\foo\bar\hoge.txt」を開くと、さっき保存した時の内容になってるんで、書き込みに失敗したというわけでもない。なのに、自作のアプリで「C:\Program Files\foo\bar\hoge.txt」を開くと、秀丸エディタで書き換える前の内容が返ってくる。他にも同じ現象が起こってる人がいるみたいだし。何なんですかこれは?
……結論から言うと、犯人はWindows Vista以降で導入されたVirtualStoreという仕組みでした。
Windows Vista以降ではファイルに対して書き込みができない時に、「書き込めませんでした」というエラーを出す代わりに「C:\Users\ユーザ名\AppData\Local\VirtualStore」っていうフォルダの中にファイルを書き出すアプリケーションがあるみたいなんですね。今回は秀丸エディタがそうだったんですけど。実際、「C:\Users\ユーザ名\AppData\Local\VirtualStor\Program Files\foo\bar\hoge.txt」を見たら、さっき書き換えたはずの内容でhoge.txtが存在していました。
で、この状態で秀丸エディタで「C:\Program Files\foo\bar\hoge.txt」を開こうとすると、Windowsが「C:\Users\ユーザ名\AppData\Local\VirtualStor\Program Files\foo\bar\hoge.txt」の内容を返すみたいなんですよ。これはWindowsのファイル入出力の仕組みが透過的にやっていることらしくて、秀丸から見た時のファイルの位置はあくまで「C:\Program Files\foo\bar\hoge.txt」のままであるというのがポイント。で、この時メモ帳などの別のアプリケーションから「C:\Program Files\foo\bar\hoge.txt」を開くと、今度はVirtualStoreの方ではなく「C:\Program Files\foo\bar\hoge.txt」の実体の方が返される。その結果、「秀丸エディタとメモ帳でそれぞれ同じファイルを開いてるはずなのに、実際に見えてる内容が違う」という現象が起こる。
しかも最悪なことに、どうやら一回この状態に嵌ってしまうともうお手上げのようで、それ以後は秀丸ではVirtualStoreの方のファイルにしかアクセスできないんですよね。参った。もうVirtualStoreを全部消してしまいたい位なんですけど、VirtualStoreを見てみると他にもいろんなファイルが存在してるので、同じようにVirtualStoreの方の内容が返ってきてるお陰で正しく動作しているという状態のアプリケーションが他にもあるんだったら、不用意にVirtualStoreを消してしまうと大変なことになりかねないので消すわけにもいかない。
「コントロールパネル」→「管理ツール」→「ローカル セキュリティ ポリシー」で「セキュリティの設定」→「ローカル ポリシー」→「セキュリティ オプション」→「ユーザー アカウント制御:各ユーザの場所へのファイルまたはレジストリの書き込みエラーを仮想化する」を「無効」にするとVirtualStoreを無効にできるようなので、クリーンな環境でWindows VistaやWindows 7を使い始める時は、無効にしとくといいような気がします。本来できないはずの事をユーザに気取らせずにやろうとするから無理が生じるのであって、システムファイルをいじれるのは管理者権限がある人だけというルールを徹底していれば、無駄な混乱はしなくて済むのです。LinuxとかBSDとか、そういうものですし。
追記。付いたコメントの中に、僕の目には「Program Files以下にあるファイルをわざわざユーザが書き換えなきゃいけないという仕様が今の時代にはそもそもあり得ないでしょ。技術レベルの低い無能な似非プログラマがWindowsの仕様に逆ギレとか、まったく自業自得のくせに滑稽極まりないし。プププのプー」と言っているように見える物がいくつかあったけれども、Firefoxでいえばapplication.iniにあたるような、そう頻繁に書き換える訳じゃないけど可変のパラメータを外部ファイルで定義できるようにしておくためのファイルをいじってテストしてた時に遭遇した話なので、結構イラッとしました。
2019年4月25日追記。Windows 10になった今もVirtualStoreは仕組みとして存在し続けているのですが、さすがにこの時代になるとVirtualStoreのトラップに引っかかるアプリの方が時代後れでしょと言っていいような感じで、秀丸エディタも64bit版を使えばこの問題にハマらずに済むようになりました。よかったよかった。
「管理者として実行」すれば秀丸エディタでも VirtualStore じゃなくて実体のほうを開けますよ。
MBSA とか Program Files 内に手書きで修正するような設定ファイルを持つアプリケーションではまりました。
期待している結果としては、こういう場面では「管理者権限がないので書き込めません。なのでリードオンリーで開きます。」っていう風になってて欲しいんですよね。
本来できないはずの事を無理矢理プラットフォームの側で吸収しようとするから泥沼になるんですよ……
VirtualStoreってXPではAdministratorがデフォルトでProgram Filesに書き込み放題だったことを前提とした行儀の悪いアプリを何とかするためなので多分メッセージを出すべきとかではなさそうです。
例えばゲームとかでProgram Files以下に保存するやつとかたくさんありますが、「セーブできませんでした」っていわれてもどうすれば…?じゃあProgram Filesに書き込み権をつけさせるの?またまたご冗談を…みたいな話なわけで一律オフにすれば良いといってしまうのは微妙かなと。
まあこれはこれで確かにはまると混乱するので悩ましいですが。
理想的にはそういうアプリケーション(秀丸とか)が「私は書く場所を理解している礼儀をわきまえたアプリなのでVirtualStoreを利用しません」ってマニフェストをくっつけてくれる事なんですけどね。
VirtualStoreを使わないようにすると保存ダイアログとかでは書けませんよって一応警告でますし。
ちなみにタスクマネージャーで仮想化という列を表示するとどれがVirtualStoreを使うかどうかわかります(有効・無効もコンテキストメニューから切り替えられる)。
同感。VirtualStorに泣きました。次は切る。
毎週あるネット生放送をデスクトップキャプチャで保存しているのですが、先日たまたまいつも使っている外付けHDDを学校に忘れて、パソコン単体でキャプチャしたことがあったんです。その時に書き出し先をC直下にしたら、録画中は正常に録画が進んでいくのに、後で見たら保存されていないことがありました。
録画失敗↓orzと思っていましたが、今日SpaceMongerというソフトでCドライブを解析していたら、失敗したはずのファイルが直下とVirtualStore両方に見つかりました。
こんな回りくどいことせずに、エラーメッセージ返してくれた方が嬉しかったです。同フォルダには、失敗したと思った後に行った録画テストの動画ファイルが大量に残っていました。未圧縮のaviファイルが大量に。Cドライブの容量が妙に圧迫されていると思ったらこれでした。
VirtualStoreに書き込むんならVirtualStoreから読み込んでくれればいいだけなのに。
XP置き換えでメールソフトの中身をぐちゃぐちゃにされた。
ユーザーに「ドン引きされないための付け焼き刃」としか思えない。
クソ、これで10日ぐらい時間をすてた。
原因がわかった。ありがとうございます。
古い分析機器のPC更新でXPから7に乗り換えましたところ、Program Files以下にインストールされた設定ファイルを変更・調整して使うソフトでしたので同じ目に合いました。半日悩んだところで、この記事に行き着き解決しました。ありがとうございました。
c:\の直下にいつもファイル保存していて突然エクスプローラやらで閲覧もアップロードもできなくなって混乱していました
。
winの自動アップデートとかしてないし設定とか変更した覚えもないのになぜこんなことになったのか謎ですがこの記事のおかげでもとに戻せそうです。ありがとうございました。
大変助かりました。心より感謝申し上げます。
Vimの設定ファイル_vimrcは初心者でも書き換え推奨される基本設定ファイルですが、この3日間度書き換えても反映されず、途方にくれておりました。
Win7 HOME Premium では ローカルセキュリティーポリシーが存在しないため、
「HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System → EnableVirtualization」の値を1から0に書き換えることで解決しました。今のところ、誤動作するプログラムはありません。
個人的感想ですが、余計なおせっかいだけならまだしも、表示されているタスクと本質的に異なる作業しておいて何も告知しないのは、迷惑極まる話です。
の末尾に2020年11月30日時点の日本の首相のファミリーネーム(ローマ字で回答)を繋げて下さい。例えば「noda」なら、「2010-07-29_virtualstore.trackbacknoda」です。これは機械的なトラックバックスパムを防止するための措置です。
writeback message: Ready to post a comment.