Обновление FileVersionInfo в каталоге Program Files
У меня есть программа с 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 () обновиться, чтобы увидеть новую версию? Есть ли что-то еще, что я должен звонить вместо этого?
1 ответ
Я отвечаю на свой вопрос, потому что, кажется, нет большого интереса. Если у кого-то есть лучший ответ, я приму это...
Насколько я могу судить, нет способа заставить его обновиться. Вместо этого я работал над вопросом:
return AssemblyName.GetAssemblyName(fullpath).Version.ToString();
В сочетании с кодом, который гарантирует, что он вызывается только один раз, он, кажется, работает просто отлично.