Existe uma maneira menos complicada de comparar versões de arquivo?
Eu escrevi uma função para comparar versões de arquivo entre o que um cliente possui atualmente e a versão mais recente do arquivo em um servidor. O cliente passa o número da versão "quad" (Major.Minor.Build.Private) como uma sequência para o servidor e, em seguida, o servidor usa 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)));
}
Mas então percebi que minha declaração de retorno megabooleana falharia se, digamos, a versão do cliente fosse 2.1.1.1 e a versão do servidor 1.1.2.1
IOW, isso indicaria que a versão do servidor era mais nova quando, na verdade (é claro) não é.
Então, pensei em adicionar mais lógica booleana, como:
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)));
}
... mas como você pode ver, está se transformando em uma grande bola de loucura de bagunça louca / espaguete.
Existe uma maneira melhor, mais fácil e mais fácil de manter / comparar duas versões de arquivos. Mas o que / como?
ATUALIZARUsando a resposta de Servy, este é o método agora:
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;
}
Limpo como um apito não revelado, conciso como a testemunha dos sonhos de Joe Friday e tão elegante quanto Grace Kelley.