0

我有一个带有 FileSystemWatcher 的程序,它监视自己被外部程序更新到新版本(这涉及重命名当前的可执行文件并在其位置复制一个新的可执行文件)。

问题是,当它正在观看的文件位于 Program Files 目录中时,FileVersionInfo.GetVersionInfo() 不会获取新的版本信息,它会返回与第一次相同的内容。因此,如果它从 1.1 更新到 1.2,它会说“从 1.1 升级到 1.1”而不是“从 1.1 升级到 1.2”。它在调试目录中正常工作,但在 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

0

我正在回答我自己的问题,因为似乎没有太大的兴趣。如果有人有更好的答案,我会接受...

据我所知,没有办法让它刷新。相反,我解决了这个问题:

return AssemblyName.GetAssemblyName(fullpath).Version.ToString();

结合确保它只被调用一次的代码,它似乎工作得很好。

于 2013-05-23T20:09:08.003 回答