2013-07-19 1 views
0

여기에 포함 된 리소스의 배치 파일을 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]; 
+0

[doco] (http://msdn.microsoft.com/en-us/library/5kx66y1a.aspx). 매니페스트 리소스. 컴파일 중에 자원이 지정되어 있지 않은지, 자원이 호출 해 옆에 가시가 아닌 경우는 null –

+0

@ darkstarohio 이러한 제안에 대한 의견은 무엇입니까? –

답변

1

당신은 내부적으로, 그것을 포함 된 파일 내용의 콘텐츠를하기 위해 정적 메서드를 생성 자원을 포함하는 경우 ResourceManager.GetString 방법으로 전화하여 문의하십시오.

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

고맙습니다. 이 작업 예제. 테스트 됨. –

0

어떻게 되나요? 너를 위해 일하면서?

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); 
         } 
        } 
       } 

      } 
     } 
0

스트림이 반환되지 않거나 길이가보고되지 않는 것처럼 들립니다.

또한 전체 스트림을 한 번에 읽지 않아도 메모리 효율이 좋지 않으며 실제로 실제 길이가보고되지 않는 네트워크 스트림이나 대용량 파일을 사용할 때 따라야 할 최상의 패턴이 아닙니다.

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); 
     } 
    } 
} 
관련 문제