如何将文件存储在EXE文件中

34

好的,我正在使用C#编程制作自己的安装程序,我想做的是将文件放在.exe文件中,这样我就可以使用File.Copy(file, filedir);进行复制。

如果不可能实现这个,是否有其他方法可以实现我所尝试的目标?


出于好奇,你为什么要编写自己的安装程序? - Serge Wautier
39
如果你想学习一门编程语言,人们总是会告诉你“多写代码”,但当你真的写了些东西之后,他们又会说“别重复发明轮子”。 - Rayne
1
编程学习时编写代码没有问题,但在编写生产代码时,不应该重复造轮子。 - Erik Funkenbusch
1
当你编写安装程序时,这并不是在重新发明轮子,因为“轮子”尚未被发明。所有的安装程序都只是方形的,还没有人发明出完美的安装程序。 - Bitterblue
3
@Rayne,感谢您的评论!我最喜欢的下一个是当他们说:“你为什么要那样做?” - mathgenius
4个回答

33

我不会写自己的安装程序,但如果你真的想将文件嵌入到你的程序集中,你可以使用强类型资源。在项目的属性对话框中打开“资源”选项卡,然后添加你的文件。然后你就可以使用以下代码获取该文件:

ProjectNamespace.Properties.Resources.MyFile

然后,您可以使用以下代码将嵌入资源写入磁盘:

System.IO.File.WriteAllBytes(@"C:\MyFile.bin", ProjectNamespace.Properties.Resources.MyFile);

谢谢您的回复,这正是我要找的。 好的,所以我正在使用File.Copy();,我需要一个字符串重载来处理文件路径。 有什么建议吗?PS- 已尝试.ToString(); - S3THST4
上面我给你链接的 C# 项目有什么问题,附带源代码?那不是你要找的吗? - Erik Funkenbusch
更新后,您可以使用System.IO.File.WriteAllBytes将文件写入磁盘。 - Shawn Miller
谢谢您,我可能会将其用于配置工具中,让用户在不同的DLL覆盖之间进行选择。这样我就可以确保不需要操作应用程序文件夹中的外部文件,而用户可能会搞砸或删除它们。 - Nyerguds

9
老实说,我建议你不要创建自己的安装程序。 创建安装程序存在许多问题。 即使是大型安装程序制造商也不再制作自己的实际安装程序,而只是创建自定义MSI包。
使用Microsoft Installer(MSI)。 这是正确的做法。 为其创建自定义前端,但不要重新创建已经存在的非常复杂的轮子。
更新:如果您只是出于学习目的这样做,那么我会远离将其视为“安装程序”。 你可能会在某些时候被诱惑使用你的“研究”,坦白地说,这就是当新版本的Windows推出时我们遇到如此多问题的原因。 人们基于无效假设创建自己的轮子。
您真正想做的是“打包”,因为您正在谈论更改磁盘上PE映像的结构。 您可以通过将文件放入资源中来模拟它,但那并不是安装程序或自解压程序所做的事情。
这里是Self-Extractor教程链接,但它不是C#。
我不了解.NET PE要求的足够多,以知道是否可以使用托管代码可执行文件完成此操作。
更新2:这可能更符合您的需求,它将文件嵌入资源中,但正如我所说,这不是专业安装程序或自解压程序的方式。 我认为有各种限制可以嵌入资源。 但这里是用C#编写的Self-Extractor Demo链接。

1
在编写自己的安装程序之前,我肯定会先研究所有可用的安装程序。这就是我在“不要重复造轮子,除非你打算更多地了解轮子”中所说的内容。http://www.codinghorror.com/blog/archives/001145.html - Jeff Atwood
我这么做的唯一原因是想看看我能不能做到。 我并不想让它变得复杂,只是想创建一个表单,当你点击“安装”时,它会将文件放入一个目录中。 - S3THST4
1
S3thst4, 一定要研究可用的安装程序,但不要让那些否定者打消你的信心,大多数可用的安装程序都有很大的改进空间,特别是MSI,安装程序并不是易如反掌的事情,准备好努力工作吧。 - Tim Jarvis

4
我猜测你想在编译之前将资源存储在应用程序中,你可以在项目资源管理器中右键单击要添加的文件,选择属性,然后将类型更改为嵌入式资源。之后,您可以使用此 KB 中的说明访问嵌入式资源:http://support.microsoft.com/kb/319292

0

如果您只是想将多个文件存储在单个文件存储中(并从中提取文件、交互等),您可能还想查看 NFileStorage,一个.net file storage。它是用100% .NET C#编写的,并且包含所有源代码。它还带有一个命令行解释器,允许从命令行进行交互。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接