Имате проблеми с извличането на вграден ресурс от C# приложение

Идеята тук е да извлечете партиден файл от вграден ресурс във временна директория на C устройството, след което да стартирате извлечения пакетен файл. Проблемът, с който се сблъсквам, е грешка „Препратката към обект не е зададена към екземпляр на обект“.

Кодът е:

public static void ExtractResource()
    {
        using (Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(Namespace.Properties.Resources.Backup))
        {
            byte[] buffer = new byte[s.Length];
            s.Read(buffer, 0, buffer.Length);
            using (var sw = new BinaryWriter(File.Open(@"C:\test.bat", FileMode.OpenOrCreate)))
            {
                sw.Write(buffer);
            }
        }
    }

Грешката възниква на този ред:

byte[] buffer = new byte[s.Length];

person darkstarohio    schedule 19.07.2013    source източник
comment
Според doco. Манифестният ресурс; или null, ако не са посочени ресурси по време на компилирането или ако ресурсът не е видим за извикващия.   -  person Taras Alenin    schedule 19.07.2013
comment
@darkstarohio какви са отзивите за тези предложения?   -  person Mechanical Object    schedule 28.07.2013


Отговори (3)


ако сте вградили ресурс, тогава той ще генерира статичен метод, за да получи съдържание на съдържанието на вграден файл, вътрешно извиква метода ResourceManager.GetString, така че опитайте по-долу

using (var sw = new BinaryWriter(File.Open(@"C:\test.bat", FileMode.OpenOrCreate)))
{
   writer.Write(Namespace.Properties.Resources.Backup);
}
person Damith    schedule 19.07.2013

Изглежда, че потокът не се връща или не отчита дължина.

Също така, не четете целия поток наведнъж, това не е много ефективно за паметта и не е най-добрият модел, който да следвате, когато започнете да използвате мрежови потоци или големи файлове, които всъщност може да не отчитат действителната си дължина.

public void WriteResrouce(string resourcePath, string targetPath)
{
    var buffer = new byte[64 * 1024]; //i've picked 64k as a reasonable sized block
    using (Stream s = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourcePath))
    using (var sw = new BinaryWriter(File.Open(targetPath, FileMode.OpenOrCreate)))
    {
        var readCount = -1;
        while (0 < (readCount = s.Read(buffer, 0, buffer.Length)))
        {
            sw.Write(buffer, 0, readCount);
        }
    }
}
person Rhys Bevilaqua    schedule 19.07.2013

Как ви действа следното?

    public static  class Program
        {
            public static void Main()
            {
                ExtractResource();
            }

            public static void ExtractResource()
            {
                //replace your embedded file by yours 
                using (var inputStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ConsoleApplication1.XMLFile1.xml"))
                {
                    using(var outputStream = File.Create(@"D:\test.bat"))
                    {
                        /// fix your buffer size 8192,4096 etc.
                        var buffer = new byte[8192];

                        int numberOfBytesRead;
                        while (inputStream != null && (numberOfBytesRead = inputStream.Read(buffer, 0, buffer.Length)) > 0)
                        {
                            outputStream.Write(buffer, 0, numberOfBytesread);
                        }
                    }
                }

            }
       }
person Mechanical Object    schedule 19.07.2013