Хранить файлы в C # EXE-файл - PullRequest
2 голосов
/ 07 июня 2010

На самом деле для меня полезно хранить некоторые файлы в EXE для копирования в выбранное место. Я генерирую файлы HTML и JS, и мне нужно скопировать некоторые CSS, JS и GIF.

Отрывок

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

у меня не работает!

На «WriteAllBytes» написано: "невозможно преобразовать из 'System.Drawing.Bitmap' в 'byte []'" для изображения и msgstr "не могу конвертировать из 'строки' в 'byte []'" для текстового файла.

Помощь!

ОБНОВЛЕНИЕ: решено ниже.

Ответы [ 4 ]

7 голосов
/ 07 июня 2010

Добавьте нужные файлы в ваше решение, а затем установите для их свойства Build Action значение Embedded Resource. Это вставит файл в ваш exe. ( * 1004 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 Always или Copy If Newer.

1 голос
/ 07 июня 2010

Полагаю, вы добавили файлы через окно свойств проекта. Это не позволяет вам добавлять произвольный файл, но поддерживает текстовые файлы, растровые изображения и т. Д.

Для встроенного текстового файла используйте

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

Для изображения используйте

  Properties.Resources.Image1.Save(@"C:\MyFile.bin");
0 голосов
/ 08 июня 2010

Добавьте файлы в ресурсы проекта и установите для них «Build Action» как «Embedded Resource».

Теперь извлеките любой файл (текстовый или двоичный), используя этот фрагмент:

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 но это работает.

0 голосов
/ 07 июня 2010

Вы можете вставлять двоичные файлы в файл .resx. Поместите их в раздел Files (похоже, вы использовали вместо него раздел Images ). Он должен быть доступен в виде массива байтов, если ваш файл .resx создает файл .Designer.cs.

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