Копирование встроенного ресурса в виде файла на диск в C # - PullRequest
9 голосов
/ 10 декабря 2010

У меня есть INF-файл, сохраненный как встроенный ресурс в моем проекте C #.Я пытаюсь сохранить этот файл в локальном местоположении по требованию.Я использую этот метод.

public static void SaveResourceToDisk(string ResourceName, string FileToExtractTo)
{
    Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(ResourceName);
    FileStream resourceFile = new FileStream(FileToExtractTo, FileMode.Create);

    byte[] b = new byte[s.Length + 1];
    s.Read(b, 0, Convert.ToInt32(s.Length));
    resourceFile.Write(b, 0, Convert.ToInt32(b.Length - 1));
    resourceFile.Flush();
    resourceFile.Close();

    resourceFile = null;
}

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

Ссылка на объектне установлен экземпляр объекта

Что я здесь не так делаю?

Ответы [ 3 ]

9 голосов
/ 10 декабря 2010

Вы можете позвонить

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();

И проверьте, какие встроенные ресурсы доступны. Затем вы можете сравнить это с тем, что вы проходите, чтобы увидеть, действительно ли вы выполняете то, что ожидали.

Кроме того, вы должны рассмотреть использование ключевого слова для удаления ваших потоков:

using(FileStream ResourceFile = new FileStream(FileToExtractTo, FileMode.Create))
{
    //do stuff
}

Удачи.

3 голосов
/ 02 октября 2015

Это самый простой способ сохранить встроенный ресурс:

  var stream = assembly.GetManifestResourceStream("name of the manifest resourse");
  var fileStream = File.Create(@"C:\Test.xml");
  stream.Seek(0, SeekOrigin.Begin);
  stream.CopyTo(fileStream);
  fileStream.Close();
1 голос
/ 04 июля 2016

Распаковывает все встроенные ресурсы в сборке и сохраняет их вместе со сборкой, содержащей этот класс, сохраняя при этом структуру каталогов. Этот код не требует от вас ничего знать о файлах, содержащихся в сборке, и является более общим решением, но он предполагает, что все файлы имеют расширения.

public class EmbeddedResources
{
    private bool isUnpacked = false;

    public async Task EnsureUnpacked(string saveDirectory)
    {
        if (!this.isUnpacked)
        {
            var assembly = Assembly.GetExecutingAssembly();
            var assemblyDirectory = Path.GetDirectoryName(assembly.Location);
            foreach (var name in assembly.GetManifestResourceNames())
            {
                var stream = assembly.GetManifestResourceStream(name);

                var stringBuilder = new StringBuilder();
                var parts = name
                    .Replace(typeof(EmbeddedResources).Namespace + ".", string.Empty)
                    .Split('.')
                    .ToList();
                for (int i = 0; i < parts.Count; ++i)
                {
                    var part = parts[i];
                    if (string.Equals(part, string.Empty))
                    {
                        stringBuilder.Append(".");      // Append '.' in file name.
                    }
                    else if (i == parts.Count - 2)
                    {
                        stringBuilder.Append(part);     // Append file name and '.'.
                        stringBuilder.Append('.');
                    }
                    else if (i == parts.Count - 1)
                    {
                        stringBuilder.Append(part);     // Append file extension.
                    }
                    else
                    {
                        stringBuilder.Append(part);     // Append file path.
                        stringBuilder.Append('\\');
                    }
                }

                var filePath = Path.Combine(saveDirectory, stringBuilder.ToString());
                using (FileStream fileStream = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite))
                {
                    await stream.CopyToAsync(fileStream);
                }
            }

            this.isUnpacked = true;
        }
    }
}
...