内容简介:程序如何自己更新自己呢?你可能会想到启动一个新的程序或者脚本来更新自己。然而 Windows 操作系统允许一个应用程序在运行期间修改自己的名称甚至移动自己到另一个文件夹中。利用这一点,我们可以很简单直接地做程序的 OTA 自动更新。本文将介绍示例程序运行期间改名并解释其原理。我们写一个简单的程序。
程序如何自己更新自己呢?你可能会想到启动一个新的程序或者脚本来更新自己。然而 Windows 操作系统允许一个应用程序在运行期间修改自己的名称甚至移动自己到另一个文件夹中。利用这一点,我们可以很简单直接地做程序的 OTA 自动更新。
本文将介绍示例程序运行期间改名并解释其原理。
在程序运行期间手工改名
我们写一个简单的程序。
将它运行起来,然后删除。我们会发现无法删除它。
但是,我们却可以很轻松地在资源管理器中对它进行改名,甚至将它从一个文件夹中移动到另一个文件夹中。
值得注意的是,你不能跨驱动器移动此文件。
为什么 Windows 上的可执行程序可以在运行期间改名?
Windows 的文件系统由两个主要的表示结构:一个是目录信息,它保存有关文件的元数据(如文件名、大小、属性和时间戳);第二个是文件的数据链。
当运行程序加载一个程序集的时候,会为此程序集创建一个内存映射文件。为了优化性能,往往只有实际用到的部分才会被加入到内存映射文件中;当需要用到程序集文件中的某块数据时,Windows 操作系统就会将需要的部分加载到内存中。但是,内存映射文件只会锁定文件的数据部分,以保证文件文件的数据不会被其他的进程修改。
这里就是关键,内存映射文件只会锁定文件的数据部分,而不会锁住文件元数据信息。这意味着你可以随意修改这些元数据信息而不会影响程序的正常运行。这就包括你可以修改文件名,或者把程序从一个文件夹下移动到另一个文件夹去。
但是跨驱动器移动文件,就意味着需要在原来的驱动器下删除文件,而这个操作会影响到文件的数据部分,所以此操作不被允许。
编写一个程序在运行期间自动改名
一般来说,需要 OTA 更新的程序是客户端程序,所以实际上真正需要此代码的是客户端应用。以下代码中我使用 .NET Core 3.0 来编写一个给自己改名的 WPF 程序。
using System.Diagnostics; using System.IO; using System.Windows; namespace Walterlv.Windows.Updater { public partial class App : Application { protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var fileName = Process.GetCurrentProcess().MainModule.FileName; var newFileName = Path.Combine(Path.GetDirectoryName(fileName), "OldUpdater.exe"); File.Move(fileName, newFileName); // 省略的代码:将新下载下载的程序改名成 fileName。 } } }
于是,程序自己在运行后会改名。
顺便的,以上代码仅适用于 .NET Framework 的桌面应用程序或者 .NET Core 3.0 的桌面应用程序。如果是 .NET Core 2.x,那么以上代码在获取到进程名称的时候可能是 dotnet.exe(已发布的 .NET Core 程序除外)。
参考资料
以上所述就是小编给大家介绍的《Windows 上的应用程序在运行期间可以给自己改名(可以做 OTA 自我更新)》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- NIPS改名被否,而在改名分歧之外我们能做的还有很多
- 改名之后的 Java EE,现在有什么新进展?
- Windows 10 Spring Creators 更新改名为 April Update
- NIPS不改名引发学界大佬联名抗议,Jeff Dean领衔!
- Java EE 改名 Jakarta EE 后,又要换 Logo 了
- Java EE 改名 Jakarta EE 后,又要换 Logo 了
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Effective Modern C++ 简体中文版
Scott Meyers / 高博 / 中国电力出版社 / 2018-4-23 / 99
想要彻底理解C++11和C++14,不可止步于熟悉它们引入的语言特性(例如,auto型别推导、移动语义、lambda表达式以及并发支持)。挑战在于高效地运用这些特性——从而使你的软件具备正确性、高效率、可维护性和可移植性。这正是这本实用的图书意欲达成的定位。它描述的正是使用C++11和C++14——现代C++来撰写真正卓越的软件之道。 涵盖以下主题: 大括号初始化、noexcept规格......一起来看看 《Effective Modern C++ 简体中文版》 这本书的介绍吧!