내장된 리소스 텍스트 파일을 읽는 방법
다을사텍내리를소스장읽방(텍스트 파일)을 사용하여 텍스트 )를 읽는 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();
}
방법을 사용할 수 있습니다.
다음 사용법 추가
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"
메소드를 사용하여 어셈블리의 모든 리소스 목록을 가져올 수 있습니다.
그것을 얻기 위한 영리한 방법이 없습니다.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();
}
}
또는 비동기 확장 방법으로:
internal static class AssemblyExtensions
{
public static async Task<string> ReadResourceAsync(this Assembly assembly, string name)
{
// Determine path
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(stream);
return await reader.ReadToEndAsync();
}
}
// Usage
string resourceText = await Assembly.GetExecutingAssembly().ReadResourceAsync("myResourceName");
두 가지 다른 방법을 사용하여 파일을 리소스로 추가할 수 있습니다.
파일에 액세스하는 데 필요한 C# 코드는 파일을 처음에 추가하는 데 사용된 방법에 따라 다릅니다.
방법 1: 기존 파일을 추가하고 속성을 다음으로 설정합니다.Embedded Resource
후을 " 젝트에파추다가음유형다설을한음다정니합로으일을프로다설▁the니"로 합니다.Embedded Resource
.
에는 " " " " " " " " 을 할 수 .GetManifestResourceStream
액세스할 수 있습니다(@dtb의 답변 참조).
2: 2: 파일 추가Resources.resx
.Resources.resx
하고, " " " 를 설정합니다. 설정Access Modifier
public
.
에는 " " " " " " " " 을 할 수 .Properties.Resources
액세스할 수 있습니다(@NightWalker의 답변 참조).
기적으, 당은신을 합니다.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)
파일을 리소스에 추가할 때 다음과 같은 작업을 수행하기 전에 액세스 수정자를 공용으로 선택해야 합니다.
byte[] clistAsByteArray = Properties.Resources.CLIST01;
CLIST01은 포함된 파일의 이름입니다.
사실 당신은 자원에 갈 수 있습니다.Designer.cs 에서 getter의 이름이 무엇인지 확인합니다.
추가(예:테스트 파일.sql 프로젝트 메뉴 -> 속성 -> 리소스 -> 기존 파일 추가
string queryFromResourceFile = Properties.Resources.Testfile.ToString();
오래된 스레드인 것은 알지만, 이것이 저에게 효과가 있었습니다.
- 프로젝트 리소스에 텍스트 파일 추가
- 위에 Andrew Hill이 표시한 것처럼 액세스 한정자를 public으로 설정합니다.
다음과 같이 텍스트를 읽습니다.
textBox1 = new TextBox(); textBox1.Text = Properties.Resources.SomeText;
리소스에 추가한 텍스트: 'SomeText'.txt'
제가 방금 알게 된 것은 당신의 파일이 파일 이름에 "."(점)을 가질 수 없다는 것입니다.
Templates.plainEmailBodyTemplate-en.txt --> 작니다합동!
Templates.plainEmailBodyTemplate.en.txt --> GetManifestResourceStream() 파일입니다.
프레임워크가 네임스페이스와 파일 이름을 혼동하기 때문일 것입니다.
@dtb의 답변 중 이 단순화된 버전을 사용할 수도 있습니다.
public string GetEmbeddedResource(string ns, string res)
{
using (var reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Format("{0}.{1}", ns, res))))
{
return reader.ReadToEnd();
}
}
사용자의 모든 권한을 결합하여 이 도우미 클래스를 사용하여 모든 어셈블리 및 네임스페이스의 리소스를 일반적인 방식으로 읽습니다.
public class ResourceReader
{
public static IEnumerable<string> FindEmbededResources<TAssembly>(Func<string, bool> predicate)
{
if (predicate == null) throw new ArgumentNullException(nameof(predicate));
return
GetEmbededResourceNames<TAssembly>()
.Where(predicate)
.Select(name => ReadEmbededResource(typeof(TAssembly), name))
.Where(x => !string.IsNullOrEmpty(x));
}
public static IEnumerable<string> GetEmbededResourceNames<TAssembly>()
{
var assembly = Assembly.GetAssembly(typeof(TAssembly));
return assembly.GetManifestResourceNames();
}
public static string ReadEmbededResource<TAssembly, TNamespace>(string name)
{
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
return ReadEmbededResource(typeof(TAssembly), typeof(TNamespace), name);
}
public static string ReadEmbededResource(Type assemblyType, Type namespaceType, string name)
{
if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
if (namespaceType == null) throw new ArgumentNullException(nameof(namespaceType));
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
return ReadEmbededResource(assemblyType, $"{namespaceType.Namespace}.{name}");
}
public static string ReadEmbededResource(Type assemblyType, string name)
{
if (assemblyType == null) throw new ArgumentNullException(nameof(assemblyType));
if (string.IsNullOrEmpty(name)) throw new ArgumentNullException(nameof(name));
var assembly = Assembly.GetAssembly(assemblyType);
using (var resourceStream = assembly.GetManifestResourceStream(name))
{
if (resourceStream == null) return null;
using (var streamReader = new StreamReader(resourceStream))
{
return streamReader.ReadToEnd();
}
}
}
}
오래된 버전이지만 NETMF(.Net MicroFramework)의 경우 다음 작업을 쉽게 수행할 수 있습니다.
string response = Resources.GetString(Resources.StringResources.MyFileName);
NETMF에는 없기 때문에.GetManifestResourceStream
내장된 리소스 텍스트 파일을 읽었습니다.
/// <summary>
/// Converts to generic list a byte array
/// </summary>
/// <param name="content">byte array (embedded resource)</param>
/// <returns>generic list of strings</returns>
private List<string> GetLines(byte[] content)
{
string s = Encoding.Default.GetString(content, 0, content.Length - 1);
return new List<string>(s.Split(new[] { Environment.NewLine }, StringSplitOptions.None));
}
샘플:
var template = GetLines(Properties.Resources.LasTemplate /* resource name */);
template.ForEach(ln =>
{
Debug.WriteLine(ln);
});
약간 VS.NET 프로젝트 유형은 a를 자동으로 생성하지 않습니다.NET(.resx) 파일입니다.다음 단계에서는 프로젝트에 리소스 파일을 추가합니다.
- 프로젝트 노드를 마우스 오른쪽 버튼으로 클릭하고 항목 추가/새로 선택한 다음 리소스 파일로 스크롤합니다.Name 박스에서 Resources와 같은 적절한 이름을 선택하고 Add 버튼을 클릭합니다.
- 리소스 파일 Resources.resx는 프로젝트에 추가되며 솔루션 탐색기에서 노드로 볼 수 있습니다.
- 실제로 두 개의 파일이 생성되고 자동으로 생성된 C# 클래스 리소스도 있습니다.Designer.cs . 합니다.편집하지 마십시오. VS에서 유지 관리합니다.에는 파에이지정클있라는 이름의 .
Resources
.
이제 xml 파일과 같은 텍스트 파일을 리소스로 추가할 수 있습니다.
- Resources.resx를 두 번 클릭합니다.리소스 추가 > 기존 파일 추가를 선택하고 포함할 파일로 스크롤합니다.액세스 수정에 대한 기본값은 내부로 둡니다.
- 아이콘은 새 리소스 항목을 나타냅니다.이 옵션을 선택하면 속성 창에 속성이 표시됩니다.xml 파일의 경우 인코딩 속성에서 기본 로컬 코드 페이지 대신 유니코드(UTF-8) – 코드 페이지 65001을 선택합니다.다른 텍스트 파일의 경우 코드 페이지 1252와 같이 이 파일의 올바른 인코딩을 선택합니다.
- xml 파일과 같은 텍스트 파일의 경우 클래스
Resources
유형 속성이 있습니다.string
포함된 파일의 이름을 따서 명명됩니다.파일 이름이 e.g.인 경우.RibbonManifest.xml의 경우 속성의 이름이 다음과 같아야 합니다.RibbonManifest
정확한 이름은 코드 파일 리소스에서 찾을 수 있습니다.Designer.cs . - 문자열 속성을 다른 문자열 속성과 마찬가지로 사용합니다. 예:
string xml = Resources.RibbonManifest
일반적인 형태는ResourceFileName.IncludedTextFileName
사용 안 함ResourceManager.GetString
문자열 속성의 get-function이 이미 그렇게 했기 때문입니다.
이 클래스는 현재에서 내장된 리소스 파일을 읽는 데 매우 편리할 수 있습니다.Assembly
:
using System.IO;
using System.Linq;
using System.Text;
using System.Reflection;
public static class EmbeddedResourceUtils
{
public static string ReadFromResourceFile(string endingFileName)
{
var assembly = Assembly.GetExecutingAssembly();
var manifestResourceNames = assembly.GetManifestResourceNames();
foreach (var resourceName in manifestResourceNames)
{
var fileNameFromResourceName = _GetFileNameFromResourceName(resourceName);
if (!fileNameFromResourceName.EndsWith(endingFileName))
{
continue;
}
using (var manifestResourceStream = assembly.GetManifestResourceStream(resourceName))
{
if (manifestResourceStream == null)
{
continue;
}
using (var streamReader = new StreamReader(manifestResourceStream))
{
return streamReader.ReadToEnd();
}
}
}
return null;
}
// https://stackoverflow.com/a/32176198/3764804
private static string _GetFileNameFromResourceName(string resourceName)
{
var stringBuilder = new StringBuilder();
var escapeDot = false;
var haveExtension = false;
for (var resourceNameIndex = resourceName.Length - 1;
resourceNameIndex >= 0;
resourceNameIndex--)
{
if (resourceName[resourceNameIndex] == '_')
{
escapeDot = true;
continue;
}
if (resourceName[resourceNameIndex] == '.')
{
if (!escapeDot)
{
if (haveExtension)
{
stringBuilder.Append('\\');
continue;
}
haveExtension = true;
}
}
else
{
escapeDot = false;
}
stringBuilder.Append(resourceName[resourceNameIndex]);
}
var fileName = Path.GetDirectoryName(stringBuilder.ToString());
return fileName == null ? null : new string(fileName.Reverse().ToArray());
}
}
여기에 게시된 모든 솔루션을 읽은 후.이렇게 해결했습니다.
// How to embedded a "Text file" inside of a C# project
// and read it as a resource from c# code:
//
// (1) Add Text File to Project. example: 'myfile.txt'
//
// (2) Change Text File Properties:
// Build-action: EmbeddedResource
// Logical-name: myfile.txt
// (note only 1 dot permitted in filename)
//
// (3) from c# get the string for the entire embedded file as follows:
//
// string myfile = GetEmbeddedResourceFile("myfile.txt");
public static string GetEmbeddedResourceFile(string filename) {
var a = System.Reflection.Assembly.GetExecutingAssembly();
using (var s = a.GetManifestResourceStream(filename))
using (var r = new System.IO.StreamReader(s))
{
string result = r.ReadToEnd();
return result;
}
return "";
}
resources.resx에서 직접 파일을 추가한 경우 이 작업을 수행하면 됩니다.
string textInResourceFile = fileNameSpace.Properties.Resources.fileName;
이 코드 행을 사용하면 파일의 텍스트가 파일에서 직접 읽혀져 문자열 변수에 들어갑니다.
저는 내장된 리소스를 바이트 배열처럼 읽고 싶었습니다(특정 인코딩을 가정하지 않고). 그리고 저는 결국MemoryStream
이는 매우 단순합니다.
using var resStream = assembly.GetManifestResourceStream(GetType(), "file.txt");
var ms = new MemoryStream();
await resStream .CopyToAsync(ms);
var bytes = ms.ToArray();
public class AssemblyTextFileReader
{
private readonly Assembly _assembly;
public AssemblyTextFileReader(Assembly assembly)
{
_assembly = assembly ?? throw new ArgumentNullException(nameof(assembly));
}
public async Task<string> ReadFileAsync(string fileName)
{
var resourceName = _assembly.GetManifestResourceName(fileName);
using (var stream = _assembly.GetManifestResourceStream(resourceName))
{
using (var reader = new StreamReader(stream))
{
return await reader.ReadToEndAsync();
}
}
}
}
public static class AssemblyExtensions
{
public static string GetManifestResourceName(this Assembly assembly, string fileName)
{
string name = assembly.GetManifestResourceNames().SingleOrDefault(n => n.EndsWith(fileName, StringComparison.InvariantCultureIgnoreCase));
if (string.IsNullOrEmpty(name))
{
throw new FileNotFoundException($"Embedded file '{fileName}' could not be found in assembly '{assembly.FullName}'.", fileName);
}
return name;
}
}
// To use the code above:
var reader = new AssemblyTextFileReader(assembly);
string text = await reader.ReadFileAsync(@"MyFile.txt");
저는 당신이 항상 네임스페이스와 폴더를 문자열에 포함시켜야 한다는 것에 짜증이 났습니다.내장된 리소스에 대한 액세스를 단순화하고 싶었습니다.이것이 제가 이 작은 수업을 쓴 이유입니다.자유롭게 사용하고 개선하세요!
용도:
using(Stream stream = EmbeddedResources.ExecutingResources.GetStream("filename.txt"))
{
//...
}
클래스:
public class EmbeddedResources
{
private static readonly Lazy<EmbeddedResources> _callingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetCallingAssembly()));
private static readonly Lazy<EmbeddedResources> _entryResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetEntryAssembly()));
private static readonly Lazy<EmbeddedResources> _executingResources = new Lazy<EmbeddedResources>(() => new EmbeddedResources(Assembly.GetExecutingAssembly()));
private readonly Assembly _assembly;
private readonly string[] _resources;
public EmbeddedResources(Assembly assembly)
{
_assembly = assembly;
_resources = assembly.GetManifestResourceNames();
}
public static EmbeddedResources CallingResources => _callingResources.Value;
public static EmbeddedResources EntryResources => _entryResources.Value;
public static EmbeddedResources ExecutingResources => _executingResources.Value;
public Stream GetStream(string resName) => _assembly.GetManifestResourceStream(_resources.Single(s => s.Contains(resName)));
}
SonarCloud에 따르면 다음을 수행하는 것이 좋습니다.
public class Example
{
public static void Main()
{
// Compliant: type of the current class
Assembly assembly = typeof(Example).Assembly;
Console.WriteLine("Assembly name: {0}", assem.FullName);
// Non-compliant
Assembly assembly = Assembly.GetExecutingAssembly();
Console.WriteLine("Assembly name: {0}", assem.FullName);
}
}
하드코딩된 파일의 텍스트를 winform 형식으로 빠르게 원하는 모든 사용자를 위한 것입니다.
- 솔루션 탐색기 > 리소스 > 파일 추가에서 응용프로그램을 마우스 오른쪽 단추로 클릭합니다.
- 클릭한 후 속성 탭에서 "파일 유형"을 "텍스트"로 설정합니다.
- 당신의 프로그램에서 그냥 하라.
Resources.<name of resource>.toString();
파일을 읽습니다.
베스트 프랙티스나 다른 것으로 권장하지는 않지만, 신속하게 작동하고 필요한 작업을 수행합니다.
양식 로드 이벤트에서 내장된 TXT 파일을 읽습니다.
변수를 동적으로 설정합니다.
string f1 = "AppName.File1.Ext";
string f2 = "AppName.File2.Ext";
string f3 = "AppName.File3.Ext";
트라이 캐치를 호출합니다.
try
{
IncludeText(f1,f2,f3);
/// Pass the Resources Dynamically
/// through the call stack.
}
catch (Exception Ex)
{
MessageBox.Show(Ex.Message);
/// Error for if the Stream is Null.
}
텍스트 포함(), Visual Studio에서 이 작업을 수행합니다.전구를 클릭하여 코드 블록을 자동 생성합니다.
생성된 코드 블록 안에 다음을 넣습니다.
리소스 1
var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file1))
using (StreamReader reader = new StreamReader(stream))
{
string result1 = reader.ReadToEnd();
richTextBox1.AppendText(result1 + Environment.NewLine + Environment.NewLine );
}
리소스 2
var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file2))
using (StreamReader reader = new StreamReader(stream))
{
string result2 = reader.ReadToEnd();
richTextBox1.AppendText(
result2 + Environment.NewLine +
Environment.NewLine );
}
리소스 3
var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file3))
using (StreamReader reader = new StreamReader(stream))
{
string result3 = reader.ReadToEnd();
richTextBox1.AppendText(result3);
}
반환된 변수를 다른 곳으로 보내고 싶다면 다른 함수를 호출하면 됩니다.
using (StreamReader reader = new StreamReader(stream))
{
string result3 = reader.ReadToEnd();
///richTextBox1.AppendText(result3);
string extVar = result3;
/// another try catch here.
try {
SendVariableToLocation(extVar)
{
//// Put Code Here.
}
}
catch (Exception ex)
{
Messagebox.Show(ex.Message);
}
}
이것은 여러 개의 txt 파일을 결합하고 하나의 리치 텍스트 상자 안에 내장된 데이터를 읽는 방법입니다. 이것이 코드 샘플로 제가 원하는 효과였습니다.
VB를 사용하는 사용자용입니다.그물
Imports System.IO
Imports System.Reflection
Dim reader As StreamReader
Dim ass As Assembly = Assembly.GetExecutingAssembly()
Dim sFileName = "MyApplicationName.JavaScript.js"
Dim reader = New StreamReader(ass.GetManifestResourceStream(sFileName))
Dim sScriptText = reader.ReadToEnd()
reader.Close()
MyApplicationName
응용 프로그램의 네임스페이스입니다.어셈블리 이름이 아닙니다.이 이름은 프로젝트의 속성(응용프로그램 탭)에 정의되어 있습니다.
이름을 수 없는 에는 리이찾을수없경사다수있다용습니할음을우를 할 수 .GetManifestResourceNames()
를 수행
Dim resourceName() As String = ass.GetManifestResourceNames()
또는
Dim sName As String
= ass.GetManifestResourceNames()
.Single(Function(x) x.EndsWith("JavaScript.js"))
또는
Dim sNameList
= ass.GetManifestResourceNames()
.Where(Function(x As String) x.EndsWith(".js"))
언급URL : https://stackoverflow.com/questions/3314140/how-to-read-embedded-resource-text-file
'programing' 카테고리의 다른 글
UI 텍스트 필드에서 반환 키를 누를 때 키보드를 숨기는 방법은 무엇입니까? (0) | 2023.05.07 |
---|---|
SQL 절에서 WHERE 1=1 AND를 사용하는 이유는 무엇입니까? (0) | 2023.05.07 |
WPF 창을 내 앱의 다른 모든 창 위에 표시하는 방법(시스템 전체가 아님)? (0) | 2023.05.07 |
숫자 표를 만들고 채우는 가장 좋은 방법은 무엇입니까? (0) | 2023.05.07 |
Bash를 사용하여 날짜를 반복하는 방법은 무엇입니까? (0) | 2023.05.07 |