0

外部プログラムによって新しいバージョンに更新されるのを監視する 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() を更新して新しいバージョンを表示するにはどうすればよいですか? 代わりに呼び出す必要があるものは他にありますか?

4

1 に答える 1