【问题标题】:Store files in C# EXE file将文件存储在 C# EXE 文件中
【发布时间】:2011-02-28 16:25:48
【问题描述】:

将一些文件存储在 EXE 中以复制到选定的位置对我来说实际上很有用。 我正在生成 HTML 和 JS 文件,需要复制一些 CSS、JS 和 GIF。

片段

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

不适合我!

在“WriteAllBytes”上它说: “无法从 'System.Drawing.Bitmap' 转换为 'byte[]'” 对于图像和 “无法从 'string' 转换为 'byte[]'” 用于文本文件。

救命!

更新:已解决。

【问题讨论】:

  • 如果您已经解决了问题,请单击最有帮助的答案旁边的绿色复选标记。

标签: c# file executable


【解决方案1】:

将您想要的文件添加到您的解决方案中,然后将其Build Action 属性设置为Embedded Resource。这会将文件嵌入到您的 exe 中。 (msdn)

那么你只需要编写代码在执行exe时将文件写入磁盘。

类似:

File.Copy("resource.bmp", @"C:\MyFile.bin");

resource.bmp 替换为您的文件名。

附录:

如果您将文件保存在解决方案的子文件夹中,则需要将该子文件夹作为resource.bmp 路径的一部分。例如:

File.Copy(@"NewFolder1\resource.bmp", @"C:\MyFile.bin");

另外,您可能需要将Copy To Output Directory 属性设置为Copy AlwaysCopy If Newer

【讨论】:

  • 没错,它必须是“嵌入式资源”,但只是 File.Copy() 在这里不起作用。我找到了解决方案。
  • 它对我有用...您是否将“resource.bmp”更改为正确的文件名?
  • 舒尔。但事实并非如此。似乎 File.Copy() 仅适用于文本文件。我把我的解决方案留在这里了。
  • 如果不复制文本文件会怎样?我用 bmp 尝试了上述方法。
  • 不知道。我在下面发布了我的通用解决方案,它适用于任何类型的文件。复制粘贴+设置“构建操作”即可。
【解决方案2】:

我假设您是通过“项目属性”窗口添加文件的。这不允许您添加任意文件,但它确实支持 TextFiles、Bitmaps 等。

对于嵌入的文本文件,使用

  File.WriteAllText(@"C:\MyFile.bin", Properties.Resources.TextFile1);

对于图像,使用

  Properties.Resources.Image1.Save(@"C:\MyFile.bin");

【讨论】:

    【解决方案3】:

    可以在 .resx 文件中嵌入二进制文件。将它们放在 Files 部分(看起来您使用的是 Images 部分)。如果您的 .resx 文件生成 .Designer.cs 文件,它应该可以作为字节数组访问。

    File.WriteAllBytes(@"C:\foobar.exe", Properties.Resources.foobar);
    

    【讨论】:

      【解决方案4】:

      将文件添加到项目资源并将其“构建操作”设置为“嵌入式资源”。

      现在使用这个 sn-p 提取任何文件(文本或二进制文件):

      WriteResourceToFile("Project_Namespace.Resources.filename_as_in_resources.extension", "extractedfile.txt");
      
      
      public static void WriteResourceToFile(string resourceName, string fileName)
      {
          int bufferSize = 4096; // set 4KB buffer
          byte[] buffer = new byte[bufferSize];
          using (Stream input = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
          using (Stream output = new FileStream(fileName, FileMode.Create))
          {
              int byteCount = input.Read(buffer, 0, bufferSize);
              while (byteCount > 0)
              {
                  output.Write(buffer, 0, byteCount);
                  byteCount = input.Read(buffer, 0, bufferSize);
              }
          }
      }
      

      不知道根据这篇文章到底有多正确:http://www.yoda.arachsys.com/csharp/readbinary.html 但它有效。

      【讨论】:

        猜你喜欢
        • 2010-10-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-15
        • 2012-11-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多