Vistaでは%ProgramData% (=私の環境ではC:\ProgramData)
という特殊フォルダがあるのですが、不思議な現象にハマってしまいました…
2007/12/21追記:UACによる仮想化で特殊フォルダの書き込みがリダイレクトされているだけでした。つまり私が無知なだけでした。
言い訳すると私も当時ProgramFilesはそうなること知っていましたがProgramDataでもそうなるとは知りませんでした。恥ずかしいかぎりです。
再現してみます。
VistaのPCに管理者(Administrators)のアカウントでログオンします。
テキストファイルの新規作成・読み込みのできるテキストエディタを用意します。
12/21追記&訂正:Vista対応マニフェストが入っていない某有名テキストエディタでも再現できます。参考リンク→中さんのエントリ「WZ Editor Vista対応!!」有名なのがこれでは…。
今回はC#プログラムで簡単に作成しました。(TextEditor.exe)

書き込む方
using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, Encoding.Unicode)) {
sw.Write(textBox1.Text);
sw.Flush();
}
読み込む方
using (StreamReader sr = new StreamReader(openFileDialog1.FileName, Encoding.Unicode)) {
textBox1.Text = sr.ReadToEnd();
}
本題ではないので、残りは略します。
.NETアプリでなくてNativeアプリでも構いません(と思います、たぶん)。
自作でなくてもよいです。フリーウェア、シェアウェアとかでもよいです。
さてテキストエディタのexeをコピーします。
片方に別の名前をつけておきます。(例:TextEditorAsAdmin.exe)

Explorerでこのexeを右クリックしてコンテクストメニューから「プロパティ」を選択します。
開いた「exeのプロパティ」ダイアログの「互換性」タブを選択します。
「特権レベル」の「管理者としてこのプログラムを実行する」のチェックボックスをチェックします。

「OK」ボタンでダイアログを閉じます。するとアイコンに盾のマークがつきます。

こちら盾のマークのついたのほうのexeを起動します。
UACのダイアログが出るので「許可」をします。
このテキストエディタで何か適当にテキストを書きます。

%ProgramData% (C:\ProgramData)の配下に保存します。

テキストエディタを終了します。
次に、もう一方盾のマークのない方を起動します。
このテキストエディタで何か適当に先ほどとは異なるテキストを書きます。

そして先ほどと同じフォルダの同じファイルに保存します。

「…置き換えますか?」には「はい」と答えます。
テキストエディタを終了します。
さて、もう一度盾のマークのついたのほうのexeを起動します。
もちろんUACのダイアログが出るので「許可」をします。
今度は、先ほど保存したテキストファイルを開きます。
一体何が表示されるのかと思ったら…
なんと、置き換えてしまった(消えた)はずのテキストが表示されています!
確認のためににもう一方盾のマークのない方を起動します。
同じテキストファイルを開くと、確かに置き換えた内容が表示されています!
どなたかこの現象についてご存じの方は詳細を教えてください。
実はWindows Vistaの開発の世界では常識だったりするのでしょうか?
追記:
ちゃっぴさんに即答していただきました。
Vistaのユーザアカウント制御(UAC)の機能の一つ「仮想化」という機能でした。
多くの方々に情報をいただきました。本当にありがとうございました。
常識でした…(恥)
-
アクセス対象のフォルダのアクセス制御のUsersグループに変更権限があれば「仮想化」されません。
-
「仮想化」が適用されるプロセスかどうかはタスクマネージャで該当プロセスを右クリックで確認できます。オンオフもできるみたいです。
-
12/21追記:Vista対応v3マニフェストをexeと一緒に配布するか、exeに埋め込むと「仮想化」されません。埋め込むにはVS2008では「アプリケーション マニフェスト ファイル」追加してrequestedExecutionLevel levelを編集するだけで簡単にできます。VS2005ではその後ビルドイベントのビルド後のコマンドラインでたとえば「"$(DevEnvDir)..\..\SDK\v2.0\bin\mt.exe" -manifest "$(ProjectDir)$(TargetName).exe.manifest" -outputresource:"$(ProjectDir)binまたはobj\$(ConfigurationName)\$(TargetName).exe;#1"」と記述します。