有没有更简单的方法来比较文件版本?

2023-11-24

我编写了一个函数来比较客户端当前拥有的文件版本和服务器上文件的最新版本之间的文件版本。客户端将“quad”(Major.Minor.Build.Private)版本号作为字符串传递给服务器,然后服务器使用 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)));
}

但后来我意识到,如果客户端版本是 2.1.1.1,服务器版本是 1.1.2.1,我的 megaboolean return 语句将会失败

IOW,这表明服务器版本较新,但实际上(当然)并非如此。

所以我想我应该添加更多布尔逻辑,例如:

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

...但正如你所看到的,它正在变成一个疯狂/意大利面条混乱的大球。

必须有一种更好、更简单、更易于理解/可维护的方法来比较两个文件版本。但什么/如何?

UPDATE

使用 Servy 的答案,现在的方法是:

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

像未吹响的哨子一样干净,像乔·星期五的梦想见证人一样简洁,像格蕾丝·凯利一样优雅。


Use the Version class:

Version first = new Version("1.1.2.1");
Version second = new Version("2.1.1.1");
bool b = first >= second;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有更简单的方法来比较文件版本? 的相关文章

  • 在模板类中声明模板友元类时出现编译器错误

    我一直在尝试实现我自己的链表类以用于教学目的 我在迭代器声明中指定了 List 类作为友元 但它似乎无法编译 这些是我使用过的 3 个类的接口 Node h define null Node
  • 在 xaml 中编写嵌套类型时出现设计时错误

    我创建了一个用户控件 它接受枚举类型并将该枚举的值分配给该用户控件中的 ComboBox 控件 很简单 我在数据模板中使用此用户控件 当出现嵌套类型时 问题就来了 我使用这个符号来指定 EnumType x Type myNamespace
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 根据属性的类型使用文本框或复选框

    如果我有这样的结构 public class Parent public string Name get set public List
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 随着时间的推移,添加到 List 变得非常慢

    我正在解析一个大约有 1000 行的 html 表 我从一个字符串中添加 10 个字符串 td 每行到一个list td
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • 实例化类时重写虚拟方法

    我有一个带有一些虚函数的类 让我们假设这是其中之一 public class AClassWhatever protected virtual string DoAThingToAString string inputString retu
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • 现代编译器是否优化乘以 1 和 -1

    如果我写 template
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 在 C 语言中编译时评估的预处理器函数

    我想编写在以下位置评估的预处理器函数 数组 编译时间 例如 如果我定义 define MYARR 5 4 3 2 1 0 然后 代码 int x R 0 应表示为 int x 5 给编译器 当然索引中只能使用文字 如果代码大小 内存很关键并
  • 如何控制 Ember.js 在何处附加渲染的应用程序模板?

    我正在尝试将我的 Ember 应用程序切换为使用 Ember Router 但在附加应用程序模板的位置上遇到问题 当我调用 App initialize 时 它会在文档末尾呈现模板 有没有办法指定渲染的应用程序模板附加到的位置 我的应用程序
  • 关闭WinAPI HANDLE的正确方法(避免重复关闭)

    我有一些句柄 我需要关闭它 代码中的某些地方可能会关闭句柄 那么 这是关闭句柄的正确方法吗 HANDLE h if h INVALID HANDLE VALUE CloseHandle h h INVALID HANDLE VALUE 关于
  • 如何在 AVD 4.2 中启用多用户支持

    有没有办法在 Android 4 2 ADT 版本 21 的新 模拟器 AVD 中启用多用户支持 在真实设备上 设置 中应该有 用户 菜单项 但在我的 AVD 上缺少 我知道此功能仅针对某些平板电脑设备启用 但在新的设备定义部分中创建 AV
  • 从 UEFI 应用程序内部运行 UEFI shell 命令

    我是 UEFI 应用程序开发新手 我的要求是 我需要从 UEFI 应用程序运行 UEFI shell 命令 app efi 源代码 需要指导我如何做到这一点 Example cpUEFI shell 中的命令用于将文件从一个路径复制到 其他
  • UpdatePanel 内的 FileUpload.PostedFile 始终为 null

    我在 UpdatePanel 中有一个 FileUpload 控件 我已成功向脚本管理器注册上传按钮以进行完整的回发 我遇到的唯一问题是 FileUpload HasFile 始终返回 null 注意 当我将 FileUpload 控件移到
  • 在 Mongoose / MongoDB 中创建多字段索引

    我试图找到有关如何在 Mongoosejs 中创建多字段索引的文档 但无济于事 特别是我有两个需要索引和唯一的字段 将两个字段一起索引的猫鼬模式示例是什么 你打电话给index方法对你的Schema对象这样做如图所示here 对于你的情况
  • Java 中的 IntPtr (C#) 相当于什么?

    Java JNA 中的 IntPtr C 相当于什么 com sun jna ptr IntByReference
  • Javascript regexObj.exec() 说 TypeError:pattern.exec 不是函数

    我想使用正则表达式从 img 标签中提取图像名称javascript 我的问题是console log 抛出异常 TypeError pattern exec is not a function JS label btn danger on
  • 固定维数 (N=9)、对称、正半定稠密线性系统的快速求解

    您会推荐哪种算法来快速求解固定维数 N 9 的密集线性系统 矩阵是对称的 半正定的 高斯消去法 LU分解 乔列斯基分解 etc 类型为 32 位和 64 位浮点 这样的系统将被解决数百万次 因此算法在维度 n 9 方面应该相当快 附 示例r
  • Scala 方法类型和作为参数的方法

    在下面的代码示例中 我不明白为什么函数 fun 可以作为参数传递给方法addAction 方法fun属于类型Unit 而该方法addAction需要类型的函数 gt Unit If fun属于类型 gt Unit 那么为什么编译器会抱怨fu
  • AngularJS:段落元素的换行符

    在 Angular 中 我需要从包含换行符的文本块生成一系列段落元素 我可以想出几种方法来做到这一点 然而我想知道是否存在 官方 Angular 方式 或者在 AngularJS 上下文中最优雅的方法是什么 一个例子 From Lorem
  • 如何通过 cypress.io 使用 vue.js v-select 查找元素并选择?

    抱歉 我需要有关 cypress io 查找元素 v select 和 select 选项的帮助
  • 根据视差图进行 OpenCv 深度估计

    我正在尝试使用 OpenCV 估计立体图像对的深度 我有视差图 深度估计可以通过以下方式获得 Baseline focal depth disparity SensorSize 我使用块匹配技术在两个校正图像中找到相同的点 OpenCV 允
  • Xamarin iOS 模拟器运行旧代码

    当我从 Visual Studio 调试 Xamarin iOS 项目时 它会在模拟器上构建 安装并启动应用程序 不会出现任何问题 但在启动时 我看到了来自某个方法的大量调试跟踪 而该方法甚至不再存在于我的 C 代码中 我还可以在删除该方法
  • 使用 SAM 创建 API 网关代理资源

    我有一个看似简单的要求 即在 SAM 亚马逊的无服务器应用程序模型 中创建代理资源 事实上非常简单 以至于亚马逊的文档似乎将其保留为exercise致读者 我想创建一个 AWS API Gateway 包罗万象的终端节点来将所有内容代理到另
  • isNew() 如何判断会话是新会话还是已在使用中?

    如何调用isNew 在会话对象上 检查会话是否是新会话或已在使用中 我读到了isNew 如果客户端尚未响应会话 ID 则返回 true 但是这是什么意思 请解释 我读到 如果客户端尚未响应会话 ID 则 isNew 返回 true 但是这是
  • 从 .h5 文件加载权重时出现 Tensorflow 2.0 ValueError

    我有一个VAE架构脚本如下 import numpy as np import tensorflow as tf from tensorflow keras layers import Input Conv2D Flatten Dense
  • 从 Laravel 访问查询字符串值

    有谁知道是否可以在 Laravel 中使用 URL 查询 Example 我有以下路线 Route get text TextController index 该页面上的文本基于以下 url 查询 http example com text
  • 有没有更简单的方法来比较文件版本?

    我编写了一个函数来比较客户端当前拥有的文件版本和服务器上文件的最新版本之间的文件版本 客户端将 quad Major Minor Build Private 版本号作为字符串传递给服务器 然后服务器使用 FileVersionInfo cl