Home > Latest topics

Latest topics > Windows 7のVirtualStoreに泣かされた

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

宣伝2。Firefox Hacks Rebooted発売中。本書の1/3を使って、再起動不要なアドオンの作り方のテクニックや非同期処理の効率のいい書き方などを解説しています。既刊のFirefox 3 Hacks拡張機能開発チュートリアルと併せてどうぞ。

Firefox Hacks Rebooted ―Mozillaテクノロジ徹底活用テクニック
浅井 智也 池田 譲治 小山田 昌史 五味渕 大賀 下田 洋志 寺田 真 松澤 太郎
オライリージャパン

Windows 7のVirtualStoreに泣かされた - Jul 29, 2010

「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にあたるような、そう頻繁に書き換える訳じゃないけど可変のパラメータを外部ファイルで定義できるようにしておくためのファイルをいじってテストしてた時に遭遇した話なので、結構イラッとしました。

分類:出来事・雑感, , 時刻:11:28 | Comments/Trackbacks (8) | Edit

Comments/Trackbacks

権限の問題?

「管理者として実行」すれば秀丸エディタでも VirtualStore じゃなくて実体のほうを開けますよ。

MBSA とか Program Files 内に手書きで修正するような設定ファイルを持つアプリケーションではまりました。

Commented by Cai at 2010/07/29 (Thu) 12:05:08

no title

期待している結果としては、こういう場面では「管理者権限がないので書き込めません。なのでリードオンリーで開きます。」っていう風になってて欲しいんですよね。
本来できないはずの事を無理矢理プラットフォームの側で吸収しようとするから泥沼になるんですよ……

Commented by Piro at 2010/07/29 (Thu) 13:24:49

no title

VirtualStoreってXPではAdministratorがデフォルトでProgram Filesに書き込み放題だったことを前提とした行儀の悪いアプリを何とかするためなので多分メッセージを出すべきとかではなさそうです。
例えばゲームとかでProgram Files以下に保存するやつとかたくさんありますが、「セーブできませんでした」っていわれてもどうすれば…?じゃあProgram Filesに書き込み権をつけさせるの?またまたご冗談を…みたいな話なわけで一律オフにすれば良いといってしまうのは微妙かなと。
まあこれはこれで確かにはまると混乱するので悩ましいですが。

理想的にはそういうアプリケーション(秀丸とか)が「私は書く場所を理解している礼儀をわきまえたアプリなのでVirtualStoreを利用しません」ってマニフェストをくっつけてくれる事なんですけどね。

VirtualStoreを使わないようにすると保存ダイアログとかでは書けませんよって一応警告でますし。

ちなみにタスクマネージャーで仮想化という列を表示するとどれがVirtualStoreを使うかどうかわかります(有効・無効もコンテキストメニューから切り替えられる)。

Commented by 沢渡真雪 at 2010/07/30 (Fri) 00:00:42

no title

同感。VirtualStorに泣きました。次は切る。

Commented by roro at 2012/03/25 (Sun) 11:18:54

助かりました

毎週あるネット生放送をデスクトップキャプチャで保存しているのですが、先日たまたまいつも使っている外付けHDDを学校に忘れて、パソコン単体でキャプチャしたことがあったんです。その時に書き出し先をC直下にしたら、録画中は正常に録画が進んでいくのに、後で見たら保存されていないことがありました。

録画失敗↓orzと思っていましたが、今日SpaceMongerというソフトでCドライブを解析していたら、失敗したはずのファイルが直下とVirtualStore両方に見つかりました。

こんな回りくどいことせずに、エラーメッセージ返してくれた方が嬉しかったです。同フォルダには、失敗したと思った後に行った録画テストの動画ファイルが大量に残っていました。未圧縮のaviファイルが大量に。Cドライブの容量が妙に圧迫されていると思ったらこれでした。

Commented by 宵闇の烏 at 2013/10/02 (Wed) 15:01:14

ふざけた仕様

VirtualStoreに書き込むんならVirtualStoreから読み込んでくれればいいだけなのに。
XP置き換えでメールソフトの中身をぐちゃぐちゃにされた。

Commented by 肉太郎 at 2014/03/27 (Thu) 17:08:44

こんな仕様はサンドボックス化とかいう次元の話ではない。

ユーザーに「ドン引きされないための付け焼き刃」としか思えない。

Commented by rastasan at 2014/09/08 (Mon) 15:59:43

no title

クソ、これで10日ぐらい時間をすてた。
原因がわかった。ありがとうございます。

Commented by at 2017/07/16 (Sun) 16:33:34

TrackBack ping me at


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

Post a comment

writeback message: Ready to post a comment.

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

Powered by blosxom 2.0 + starter kit
Home

カテゴリ一覧

過去の記事

1999.2~2005.8

最近のつぶやき

オススメ

Mozilla Firefox ブラウザ無料ダウンロード