[.net] 임베디드 리소스 텍스트 파일을 읽는 방법

사용하여 포함 된 리소스 (텍스트 파일)를 읽고 StreamReader문자열로 반환하려면 어떻게합니까? 현재 스크립트는 Windows 양식과 텍스트 상자를 사용하여 사용자가 포함되지 않은 텍스트 파일에서 텍스트를 찾아서 바꿀 수 있도록합니다.

private void button1_Click(object sender, EventArgs e)
{
    StringCollection strValuesToSearch = new StringCollection();
    strValuesToSearch.Add("Apple");
    string stringToReplace;
    stringToReplace = textBox1.Text;

    StreamReader FileReader = new StreamReader(@"C:\MyFile.txt");
    string FileContents;
    FileContents = FileReader.ReadToEnd();
    FileReader.Close();
    foreach (string s in strValuesToSearch)
    {
        if (FileContents.Contains(s))
            FileContents = FileContents.Replace(s, stringToReplace);
    }
    StreamWriter FileWriter = new StreamWriter(@"MyFile.txt");
    FileWriter.Write(FileContents);
    FileWriter.Close();
}



답변

당신은 Assembly.GetManifestResourceStream방법을 사용할 수 있습니다 :

  1. 다음 용도를 추가하십시오

    using System.IO;
    using System.Reflection;
    
  2. 관련 파일의 속성 설정 : 값이있는
    매개 변수Build ActionEmbedded Resource

  3. 다음 코드를 사용하십시오

    var assembly = Assembly.GetExecutingAssembly();
    var resourceName = "MyCompany.MyProduct.MyFile.txt";
    
    using (Stream stream = assembly.GetManifestResourceStream(resourceName))
    using (StreamReader reader = new StreamReader(stream))
    {
        string result = reader.ReadToEnd();
    }
    

    resourceName에 포함 된 리소스 중 하나의 이름입니다 assembly. 라는 이름의 텍스트 파일을 포함 할 경우 예를 들어, "MyFile.txt"기본 네임 스페이스 프로젝트의 루트에 위치 "MyCompany.MyProduct"하고 resourceName있습니다 "MyCompany.MyProduct.MyFile.txt". Assembly.GetManifestResourceNamesMethod를 사용하여 어셈블리의 모든 리소스 목록을 얻을 수 있습니다 .


resourceName파일 이름에서만 (이름 공간 항목을 전달하여) 가져 오기를 꺼려하는 사람은 없습니다 .

string resourceName = assembly.GetManifestResourceNames()
  .Single(str => str.EndsWith("YourFileName.txt"));

완전한 예 :

public string ReadResource(string name)
{
    // Determine path
    var assembly = Assembly.GetExecutingAssembly();
    string resourcePath = name;
    // Format: "{Namespace}.{Folder}.{filename}.{Extension}"
    if (!name.StartsWith(nameof(SignificantDrawerCompiler)))
    {
        resourcePath = assembly.GetManifestResourceNames()
            .Single(str => str.EndsWith(name));
    }

    using (Stream stream = assembly.GetManifestResourceStream(resourcePath))
    using (StreamReader reader = new StreamReader(stream))
    {
        return reader.ReadToEnd();
    }
}


답변

두 가지 방법으로 파일을 리소스로 추가 할 수 있습니다.

파일에 액세스하는 데 필요한 C # 코드 는 처음에 파일을 추가하는 데 사용 된 방법에 따라 다릅니다.

방법 1 : 기존 파일 추가, 속성 설정 Embedded Resource

파일을 프로젝트에 추가 한 다음 유형을로 설정하십시오 Embedded Resource.

참고 :이 방법을 사용하여 파일을 추가하면 파일 GetManifestResourceStream에 액세스 할 수 있습니다 ( @dtb의 답변 참조 ).

여기에 이미지 설명을 입력하십시오

방법 2 : 파일 추가 Resources.resx

Resources.resx파일을 열고 드롭 다운 상자를 사용 하여 파일을 추가하고로 설정 Access Modifier하십시오 public.

참고 :이 방법을 사용하여 파일을 추가하면 파일 Properties.Resources에 액세스 할 수 있습니다 ( @Night Walker의 답변 참조 ).

여기에 이미지 설명을 입력하십시오


답변

기본적으로 System.Reflection현재 어셈블리에 대한 참조를 얻는 데 사용 합니다. 그런 다음을 사용 GetManifestResourceStream()합니다.

예를 들어, 내가 게시 한 페이지에서 :

참고 : 추가해야 할 using System.Reflection;일이 위해를

   Assembly _assembly;
   StreamReader _textStreamReader;

   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }


답변

Visual Studio에서는 프로젝트 속성 (이 예에서는 “분석”)의 리소스 탭을 통해 파일 리소스에 직접 액세스 할 수 있습니다.
비주얼 스튜디오 스크린 샷-리소스 탭

그런 다음 결과 파일에 의해 바이트 배열로 액세스 할 수 있습니다

byte[] jsonSecrets = GoogleAnalyticsExtractor.Properties.Resources.client_secrets_reporter;

스트림으로 필요하면 ( https://stackoverflow.com/a/4736185/432976 )

Stream stream = new MemoryStream(jsonSecrets)


답변

파일을 리소스에 추가 할 때 다음과 같이 만들 수있는 것보다 Access 수정자를 공개로 선택해야합니다.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01은 포함 된 파일의 이름입니다.

실제로 resources.Designer.cs로 이동하여 getter의 이름이 무엇인지 확인할 수 있습니다.


답변

Testfile.sql 프로젝트 메뉴 추가-> 속성-> 리소스-> 기존 파일 추가

    string queryFromResourceFile = Properties.Resources.Testfile.ToString();

여기에 이미지 설명을 입력하십시오


답변

나는 그것이 오래된 실이라는 것을 알고 있지만 이것이 나를 위해 일한 것입니다.

  1. 텍스트 파일을 프로젝트 리소스에 추가
  2. Andrew Hill이 위에서 설명한 것처럼 액세스 수정자를 공개로 설정하십시오.
  3. 다음과 같은 텍스트를 읽으십시오.

    textBox1 = new TextBox();
    textBox1.Text = Properties.Resources.SomeText;

리소스에 추가 한 텍스트 : ‘SomeText.txt’