2013-05-20 11 views
0

J'ai un programme avec un FileSystemWatcher qui s'auto-vérifie pour être mis à jour vers une nouvelle version par un programme externe (qui consiste à renommer l'exécutable actuel et à en copier un nouveau à sa place). Le problème est que, lorsque le fichier qu'il regarde est dans le répertoire Program Files, FileVersionInfo.GetVersionInfo() n'obtient pas les informations de la nouvelle version, il retourne la même chose que la première fois. Donc, s'il était mis à jour de 1.1 à 1.2, il dirait "Mis à jour de 1.1 à 1.1" au lieu de "Mis à jour de 1.1 à 1.2". Cela fonctionne correctement dans le répertoire de débogage, mais sous Program Files, il n'obtiendra pas la valeur correcte.Rafraîchir FileVersionInfo dans le répertoire Program Files

est ici l'essence de ce qu'il fait, sans toute la gestion des exceptions et l'élimination et en invoquant l'exploitation forestière et du fil et tels:

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); 
     } 
    } 
} 

Comment puis-je faire GetVersionInfo() rafraîchir pour voir la nouvelle version? Y a-t-il autre chose que je devrais appeler à la place?

Répondre

0

Je réponds à ma propre question car il ne semble pas y avoir beaucoup d'intérêt. Si quelqu'un a une meilleure réponse, je l'accepterai ...

Pour autant que je sache, il n'y a aucun moyen de le faire rafraîchir. Au lieu de cela, j'ai travaillé autour de la question:

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

combiné avec le code qui assure qu'il ne s'appelé une fois, il semble fonctionner très bien.

Questions connexes