Gibt es eine weniger komplizierte Möglichkeit, Dateiversionen zu vergleichen?
Ich habe eine Funktion geschrieben, um Dateiversionen zwischen dem, was ein Client derzeit hat, und der neuesten Version der Datei auf einem Server zu vergleichen. Der Client übergibt die Versionsnummer "quad" (Major.Minor.Build.Private) als Zeichenfolge an den Server. Anschließend verwendet der Server FileVersionInfo:
// clientFileVersion will be in "quad" format, a la "3.1.4.1"
private bool ServerFileIsNewer(string clientFileVersion, FileVersionInfo serverFile)
{
// Don't say I never learned nuthin' from Steve McConnell
const int MAJOR_INDEX = 0;
const int MINOR_INDEX = 1;
const int BUILD_INDEX = 2;
const int PRIVATE_INDEX = 3;
string[] versionStrArray = clientFileVersion.Split('.');
int FileMajorPartClient;
Int32.TryParse(versionStrArray[MAJOR_INDEX], out FileMajorPartClient);
int FileMinorPartClient;
Int32.TryParse(versionStrArray[MINOR_INDEX], out FileMinorPartClient);
int FileBuildPartClient;
Int32.TryParse(versionStrArray[BUILD_INDEX], out FileBuildPartClient);
int FilePrivatePartClient;
Int32.TryParse(versionStrArray[PRIVATE_INDEX], out FilePrivatePartClient);
int FileMajorPartServer = serverFile.FileMajorPart;
int FileMinorPartServer = serverFile.FileMinorPart;
int FileBuildPartServer = serverFile.FileBuildPart;
int FilePrivatePartServer = serverFile.FilePrivatePart;
return ((FileMajorPartClient < FileMajorPartServer) ||
((FileMajorPartClient == FileMajorPartServer) && (FileMinorPartClient < FileMinorPartServer)) ||
((FileMinorPartClient == FileMinorPartServer) && (FileBuildPartClient < FileBuildPartServer)) ||
((FileBuildPartClient == FileBuildPartServer) && (FilePrivatePartClient < FilePrivatePartServer)));
}
Aber dann wurde mir klar, dass meine megaboolesche return-Anweisung fehlschlagen würde, wenn beispielsweise die Client-Version 2.1.1.1 und die Server-Version 1.1.2.1 wäre
IOW, es würde anzeigen, dass die Serverversion neuer war, obwohl dies (natürlich) nicht der Fall ist.
Also dachte ich, ich würde mehr boolesche Logik hinzufügen, wie zum Beispiel:
if (FileMajorClient > FileMajorServer) ||
((FileMajorClient == FileMajorServer) && (FileMinorClient > FileMinorServer)) ||
((FileMajorClient == FileMajorServer) && (FileMinorClient == FileMinorServer) && (FileBuildClient > FileBuildServer))
{
return false;
}
else
{
return ((FileMajorPartClient < FileMajorPartServer) ||
((FileMajorPartClient == FileMajorPartServer) && (FileMinorPartClient < FileMinorPartServer)) ||
((FileMinorPartClient == FileMinorPartServer) && (FileBuildPartClient < FileBuildPartServer)) ||
((FileBuildPartClient == FileBuildPartServer) && (FilePrivatePartClient < FilePrivatePartServer)));
}
... aber wie Sie sehen, verwandelt es sich in eine große Kugel aus Wahnsinn / Spaghetti-Chaos.
Es muss eine bessere, einfachere und besser zu wartende Möglichkeit geben, zwei Dateiversionen zu vergleichen. Aber was / wie?
AKTUALISIERENMit Servys Antwort ist dies nun die Methode:
private bool ServerFileIsNewer(string clientFileVersion, FileVersionInfo serverFile)
{
Version client = new Version(clientFileVersion);
Version server = new Version(string.Format("{0}.{1}.{2}.{3}", serverFile.FileMajorPart, serverFile.FileMinorPart, serverFile.FileBuildPart, serverFile.FilePrivatePart));
return server > client;
}
Sauber wie eine Pfeife, prägnant wie Joe Freitags Traumzeuge und elegant wie Grace Kelley.