外部プログラムによって新しいバージョンに更新されるのを監視する FileSystemWatcher を備えたプログラムがあります (現在の実行可能ファイルの名前を変更し、その場所に新しい実行可能ファイルをコピーする必要があります)。
問題は、監視しているファイルが Program Files ディレクトリにある場合、FileVersionInfo.GetVersionInfo() が新しいバージョン情報を取得せず、最初に取得したものと同じものを返すことです。したがって、1.1 から 1.2 に更新した場合、「1.1 から 1.2 にアップグレード」ではなく「1.1 から 1.1 にアップグレード」と表示されます。デバッグ ディレクトリでは正しく動作しますが、Program Files では正しい値が得られません。
例外処理、破棄、ロギング、スレッド呼び出しなどをすべて除いた、それが行っていることの本質は次のとおりです。
string oldVersion;
long oldSize;
DateTime oldLastModified;
FileSystemWatcher fs;
string fullpath;
public void Watch()
{
fullpath = Assembly.GetEntryAssembly().Location;
oldVersion = FileVersionInfo.GetVersionInfo(fullpath).ProductVersion;
var fi = new FileInfo(fullpath);
oldSize = fi.Length;
oldLastModified = fi.LastWriteTime;
fs = new FileSystemWatcher(
Path.GetDirectoryName(fullpath), Path.GetFileName(file));
fs.Changed += FileSystemEventHandler;
fs.Created += FileSystemEventHandler;
fs.EnableRaisingEvents = true;
}
void FileSystemEventHandler(object sender, FileSystemEventArgs e)
{
if (string.Equals(e.FullPath, fullpath, StringComparison.OrdinalIgnoreCase))
{
var fi = new FileInfo(fullpath);
if (fi.Length != oldSize
|| fi.LastWriteTime != oldLastModified)
{
var newversion = FileVersionInfo.GetVersionInfo(fullpath).ProductVersion;
NotifyUser(oldVersion, newversion);
}
}
}
GetVersionInfo() を更新して新しいバージョンを表示するにはどうすればよいですか? 代わりに呼び出す必要があるものは他にありますか?