사용하여 포함 된 리소스 (텍스트 파일)를 읽고 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
방법을 사용할 수 있습니다 :
-
다음 용도를 추가하십시오
using System.IO; using System.Reflection;
-
관련 파일의 속성 설정 : 값이있는
매개 변수Build Action
Embedded Resource
-
다음 코드를 사용하십시오
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.GetManifestResourceNames
Method를 사용하여 어셈블리의 모든 리소스 목록을 얻을 수 있습니다 .
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();
답변
나는 그것이 오래된 실이라는 것을 알고 있지만 이것이 나를 위해 일한 것입니다.
- 텍스트 파일을 프로젝트 리소스에 추가
- Andrew Hill이 위에서 설명한 것처럼 액세스 수정자를 공개로 설정하십시오.
-
다음과 같은 텍스트를 읽으십시오.
textBox1 = new TextBox(); textBox1.Text = Properties.Resources.SomeText;
리소스에 추가 한 텍스트 : ‘SomeText.txt’