Cách đọc tệp văn bản tài nguyên nhúng


693

Làm cách nào để đọc tài nguyên nhúng (tệp văn bản) bằng cách sử dụng StreamReadervà trả lại dưới dạng chuỗi? Tập lệnh hiện tại của tôi sử dụng biểu mẫu và hộp văn bản Windows cho phép người dùng tìm và thay thế văn bản trong tệp văn bản không được nhúng.

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

Câu trả lời:


1194

Bạn có thể sử dụng Assembly.GetManifestResourceStreamPhương thức :

  1. Thêm các cách sử dụng sau

    using System.IO;
    using System.Reflection;
  2. Đặt thuộc tính của tệp có liên quan:
    Tham số Build Actioncó giá trịEmbedded Resource

  3. Sử dụng mã sau

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

resourceNamelà tên của một trong những tài nguyên được nhúng vào assembly. Ví dụ, nếu bạn nhúng một tệp văn bản có tên "MyFile.txt"được đặt trong thư mục gốc của một dự án với không gian tên mặc định "MyCompany.MyProduct", thì đó resourceName"MyCompany.MyProduct.MyFile.txt". Bạn có thể lấy danh sách tất cả các tài nguyên trong một cụm bằng cách sử dụng Assembly.GetManifestResourceNamesPhương thức .


Không có trí tuệ thông minh để chỉ lấy resourceNametừ tên tệp (bằng cách vượt qua các công cụ không gian tên):

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

Một ví dụ hoàn chỉnh:

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

5
@ Me.C Đóng: Hãy xem Environment.SpecialFolderđể có được thư mục máy tính để bàn. Bạn cần lưu ý rằng tài nguyên sẽ được đặt tên dựa trên đường dẫn của nó trong dự án, vì vậy tên của nó có thể không phải là chính xác file1.txt.
adrianbanks

15
Đối số GetManifestResourceStreamcần đường dẫn như @adrian chỉ ra. Nếu nó giúp được bất cứ ai, đường dẫn đó giống như những gì @SimpleCoder hiển thị trong ví dụ : MyNamespace.Filename.Ext. Tôi đã thử trước đó MyNamespace.Resources.Filename.Extnhưng kết quả là null.
JYelton

61
Nếu bạn có tài nguyên của mình không trực tiếp trong thư mục gốc của dự án, nhưng trong một số thư mục con, đừng quên đặt tên thư mục này vào resourceName (ví dụ: "MyProjectNameSpace.MyProjectSubFolder.FileName.FileExtention")
Sasha

19
Đáng nói là tài nguyên "Xây dựng hành động" phải được đặt thành "Tài nguyên nhúng"
Illidan

7
Một điểm quan trọng không được đề cập ở đây. Nếu bạn đã lưu tệp của mình dưới dạng loại mã hóa thay thế để đối phó với các ký tự lẻ (trong trường hợp của tôi là UTF8), bạn có thể lấy lại một tệp trống khi bạn đọc luồng. Khắc phục sự cố này bằng cách chỉ định loại mã hóa trong hàm tạo của trình đọc luồng:using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
Kinetic

140

Bạn có thể thêm một tệp dưới dạng tài nguyên bằng hai phương thức riêng biệt.

Mã C # cần thiết để truy cập tệp là khác nhau , tùy thuộc vào phương thức được sử dụng để thêm tệp ở vị trí đầu tiên.

Phương pháp 1: Thêm tệp hiện có, đặt thuộc tính thành Embedded Resource

Thêm tệp vào dự án của bạn, sau đó đặt loại thành Embedded Resource.

LƯU Ý: Nếu bạn thêm tệp bằng phương pháp này, bạn có thể sử dụng GetManifestResourceStreamđể truy cập tệp (xem câu trả lời từ @dtb ).

nhập mô tả hình ảnh ở đây

Phương pháp 2: Thêm tệp vào Resources.resx

Mở Resources.resxtệp, sử dụng hộp thả xuống để thêm tệp, đặt Access Modifierthành public.

LƯU Ý: Nếu bạn thêm tệp bằng phương pháp này, bạn có thể sử dụng Properties.Resourcesđể truy cập tệp (xem câu trả lời từ @Night Walker ).

nhập mô tả hình ảnh ở đây


5
Phương pháp thứ ba là thêm tệp vào dự án, sau đó đặt "Sao chép vào thư mục đầu ra" thành "Đúng". Khi biên dịch, tệp được sao chép vào thư mục đầu ra và bạn có thể đọc tệp bằng các phương tiện thông thường. Ví dụ: trong ứng dụng WPF khi bạn muốn hiển thị hình ảnh.
Contango

Vì vậy, thiết lập hành động xây dựng để Resourcekhông làm gì cho phép bạn đọc mục này dưới dạng tài nguyên? bạn phải sử dụng EmbeddedResourcehoặc thêm vào một Resources.resxtập tin?
Maslow

3
@Maslow Đặt hành động xây dựng thành 'Tài nguyên' sẽ tạo tài nguyên được liên kết, trong khi đặt hành động xây dựng thành 'Tài nguyên nhúng' sẽ biên dịch tài nguyên vào tổ hợp đầu ra. Thuật ngữ 'tài nguyên được liên kết' là một thuật ngữ ưa thích để 'sao chép tệp vào thư mục đầu ra khi biên dịch' (sau đó bạn có thể đọc tệp khi chạy bằng bất kỳ phương thức bình thường nào). Để biết thêm về sự khác biệt giữa hai loại này, hãy xem Thêm và chỉnh sửa tài nguyên (Visual C #) tại msdn.microsoft.com/en-us/l Library / 7k989cfy (v = vs.90 ) .aspx .
Contango

Nếu bạn muốn sử dụng tài nguyên theo cách này, nhưng một cách linh hoạt, chỉ thay vì điều này: Properties.Resources.Your_resource_name viết này : Properties.Resources.ResourceManager.GetObject("Your_resource_name").
Lkor

86

Về cơ bản, bạn sử dụng System.Reflectionđể có được một tài liệu tham khảo cho hội hiện tại. Sau đó, bạn sử dụng GetManifestResourceStream().

Ví dụ, từ trang tôi đã đăng:

Lưu ý : cần thêm using System.Reflection;để làm việc này

   Assembly _assembly;
   StreamReader _textStreamReader;

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

32
+1 Để bao gồm cả namespacemột phần của tên tài nguyên
Kirk Broadhurst

41
var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); Phương pháp này có thể rất hữu ích khi bạn muốn tìm hiểu tên tài nguyên chính xác. (Lấy từ câu hỏi stackoverflow.com/questions/27757/
Oscar Foley

69

Trong Visual Studio, bạn có thể nhúng trực tiếp quyền truy cập vào tài nguyên tệp thông qua tab Tài nguyên của thuộc tính Dự án ("Analytics" trong ví dụ này). chụp màn hình phòng thu trực quan - tab Tài nguyên

Sau đó, tệp kết quả có thể được truy cập dưới dạng một mảng byte

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

Nếu bạn cần nó như một luồng, thì (từ https://stackoverflow.com/a/4736185/432976 )

Stream stream = new MemoryStream(jsonSecrets)

11
Bạn cũng có thể sử dụng tệp này với tệp văn bản, trong trường hợp đó bạn sẽ có: chuỗi jsonSecrets = YourNameSpace.ProperIES.Resource.YourFileName;
ngerak

30

Khi bạn đã thêm tệp vào tài nguyên, bạn nên chọn Công cụ điều chỉnh truy cập của nó ở chế độ công khai hơn là bạn có thể thực hiện một số thứ như sau.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 là tên của tệp nhúng.

Trên thực tế, bạn có thể truy cập vào tài nguyên.Designer.cs và xem tên của getter là gì.


5
Bạn có thể vui lòng giải thích điều này nhiều hơn? Khi tôi nhấp chuột phải-> thuộc tính trên một tệp trong trình khám phá giải pháp, rồi đặt Actionthành Incorporated ressource, tôi không có bất kỳ Access Modifierstrường nào trong bảng thuộc tính. Ngoài ra, tôi không có Propersites.Resourceslớp, tôi gặp The name 'Properties' does not exist in the current contextlỗi khi biên dịch mã của bạn.
Suzanne Dupéron

2
Điều này sẽ chỉ hoạt động nếu bạn nhúng tệp vào Resources.resx, xem câu trả lời của tôi về các phương pháp khác nhau để nhúng tệp vào một dự án.
Contango

13

thêm ví dụ: Menu Dự án Testfile.sql -> Thuộc tính -> Tài nguyên -> Thêm tệp hiện có

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

nhập mô tả hình ảnh ở đây


2
Nó sẽ trả về byte [], cho các tệp văn bản sử dụng `Encoding.UTF8.GetString (Properties.Resource.Testfile)`
MikeTheCoder

12

Tôi biết đó là một chủ đề cũ, nhưng đây là những gì làm việc cho tôi:

  1. thêm tệp văn bản vào tài nguyên dự án
  2. đặt công cụ sửa đổi truy cập thành công khai, như được hiển thị ở trên bởi Andrew Hill
  3. đọc văn bản như thế này:

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

Văn bản mà tôi đã thêm vào tài nguyên: 'someText.txt'


8

Bạn cũng có thể sử dụng phiên bản đơn giản này của câu trả lời của @ 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();
    }
}

bạn có chắc chắn về điều đó không? Theo liên kết này, có vẻ như tôi là .... stackoverflow.com/questions/1065168/iêu
Timmerz

8

Một điều tôi vừa học được là tập tin của bạn không được phép có "." (dấu chấm) trong tên tệp.

Một "."  trong tên tệp là không tốt.

Mẫu.plainEmailBodyTemplate-en.txt -> Hoạt động !!!
Mẫu.plainEmailBodyTemplate.en.txt -> không hoạt động thông qua GetManifestResourceStream ()

Có lẽ bởi vì khung bị nhầm lẫn giữa không gian tên và tên tệp ...


3
Lấy làm tiếc. Cái này sai. Dấu chấm làm việc. (ít nhất là nó hoạt động với tôi, NET4.5) Tôi không biết tại sao bạn lại gặp lỗi này.
Felix Keil

Có họ làm việc nhưng họ hoạt động như phân tách thư mục. Mẫu.plainEmailBodyTemplate.en.txt sẽ tìm tài nguyên "\ Mẫu \ plainEmailBodyTemplate \ en.txt"
Peter Gfader

Không, tôi đã thử nó. GetManifestResourceStream có thể truy cập các tài nguyên được nhúng với nhiều hơn một dấu chấm trong tên tệp. (NET4.5)
Felix Keil

1
Tôi đã có một vấn đề tương tự trong .NET 4.5. Các tệp có dấu chấm trong tên thậm chí không được thêm vào bộ sưu tập tài nguyên. Phương thức assembly.GetManifestResourceNames () trả về danh sách trống cho tôi. Tôi đã phát hiện ra rằng vấn đề chỉ xảy ra với mã ngôn ngữ. ca.abcd.sk.crt không được thêm vào tài nguyên trong khi ca.abcd.crt được thêm vào mà không gặp vấn đề gì.
a.farkas2508

1
Vẫn đúng vào năm 2020. Cảm ơn rất nhiều vì điều này, tôi đã phát điên với điều này.
ZeRemz

8

Bằng tất cả sức mạnh của bạn kết hợp, tôi sử dụng lớp trình trợ giúp này để đọc tài nguyên từ bất kỳ hội đồng và bất kỳ không gian tên nào theo cách chung.

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

3
cộng một cho hành tinh đội trưởng: P
Alok

4

Tôi đọc một tệp văn bản tài nguyên nhúng sử dụng:

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

Mẫu vật:

var template = GetLines(Properties.Resources.LasTemplate /* resource name */);

template.ForEach(ln =>
{
    Debug.WriteLine(ln);
});

3

Tôi biết điều này đã cũ, nhưng tôi chỉ muốn chỉ ra NETMF (.Net MicroFramework), bạn có thể dễ dàng làm điều này:

string response = Resources.GetString(Resources.StringResources.MyFileName);

NETMF không cóGetManifestResourceStream


3

Sau khi đọc tất cả các giải pháp được đăng ở đây. Đây là cách tôi giải quyết nó:

// 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 "";      
}

3

Câu trả lời khá đơn giản, chỉ cần làm điều này nếu bạn thêm tệp trực tiếp từ resource.resx.

string textInResourceFile = fileNameSpace.Properties.Resources.fileName;

Với dòng mã đó, văn bản từ tệp được đọc trực tiếp từ tệp và đưa vào biến chuỗi.


2

Tôi đã rất khó chịu khi bạn phải luôn bao gồm không gian tên và thư mục trong chuỗi. Tôi muốn đơn giản hóa việc truy cập vào các tài nguyên được nhúng. Đây là lý do tại sao tôi viết lớp học nhỏ này. Hãy sử dụng và cải thiện!

Sử dụng:

using(Stream stream = EmbeddedResources.ExecutingResources.GetStream("filename.txt"))
{
 //...
}

Lớp học:

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

}

1
Và những gì về giải pháp siêu đơn giản: var resName = assembly.GetManifestResourceNames (). Trong đó (i => i.EndsWith (fileName)). FirstOrDefault (); Nó sẽ không hoạt động nếu bạn đặt toàn bộ thư mục vào tập hợp, nhưng nếu không thì nó chỉ là một dòng;)
Harry

@Harry chắc chắn bạn có thể làm điều này. Làm thế nào điều này tương quan với câu trả lời của tôi? Bạn có muốn cải thiện Phương thức GetStream không? Và làm thế nào để bạn xử lý sự mơ hồ sau đó?
Felix Keil

1
@Estevez sử dụng Hệ thống; sử dụng System.IO; sử dụng System.Linq; sử dụng System.Reflection;
Felix Keil

2
Đối với một số lý do lớp không hoạt động khi được đặt trong một dự án khác. Cả hai cuộc gọi và thực hiện các hội đồng đều đề cập đến hội đồng với lớp này, không phải là hội đồng thực sự thực hiện các bài kiểm tra. Không có tĩnh và lười khởi tạo tất cả tốt, tho.
Nẹp xoăn

1
@CurlyBrace Cảm ơn bạn. Đánh giá lười biếng là một lỗ hổng thực sự trong câu trả lời này, bởi vì các hội đồng gọi và thực hiện thay đổi phụ thuộc vào bối cảnh. Họ cần được giải quyết trên mọi truy cập.
Felix Keil

2

Một số loại dự án VS .NET không tự động tạo tệp .NET (.resx). Các bước sau đây thêm tệp Tài nguyên vào dự án của bạn:

  1. Nhấp chuột phải vào nút dự án và chọn Thêm / Mục mới, cuộn đến Tệp tài nguyên. Trong hộp Tên, chọn một tên thích hợp, ví dụ Tài nguyên và nhấp vào nút Thêm.
  2. Tệp tài nguyên Resources.resx được thêm vào dự án và có thể được xem như là một nút trong trình khám phá giải pháp.
  3. Trên thực tế, hai tệp được tạo, cũng có một lớp Tài nguyên được tạo tự động C.D.Derer.cs. Đừng chỉnh sửa nó, nó được duy trì bởi VS. Các tập tin có chứa một lớp có tên Resources.

Bây giờ bạn có thể thêm tệp văn bản dưới dạng tài nguyên, ví dụ: tệp xml:

  1. Bấm đúp vào Tài nguyên.resx. Chọn Thêm tài nguyên> Thêm tệp hiện có và cuộn đến tệp bạn muốn đưa vào. Để lại giá trị mặc định Internal cho Access Modify.
  2. Một biểu tượng đại diện cho mục tài nguyên mới. Nếu được chọn, khung thuộc tính hiển thị các thuộc tính của nó. Đối với các tệp xml, trong phần Mã hóa thuộc tính, chọn Unicode (UTF-8) - Codepage 65001 thay vì bảng mã cục bộ mặc định. Đối với các tệp văn bản khác, chọn mã hóa chính xác của tệp này, ví dụ codepage 1252.
  3. Đối với các tệp văn bản như tệp xml, lớp Resourcescó thuộc tính loại stringđược đặt tên theo tệp được bao gồm. Nếu tên tệp là eg RibbonManifest.xml, thì thuộc tính sẽ có tênRibbonManifest . Bạn tìm thấy tên chính xác trong tệp mã Resources.Designer.cs.
  4. Sử dụng thuộc tính chuỗi như bất kỳ thuộc tính chuỗi nào khác, ví dụ : string xml = Resources.RibbonManifest. Hình thức chung là ResourceFileName.IncludedTextFileName. Không sử dụng ResourceManager.GetStringvì hàm get của thuộc tính chuỗi đã thực hiện điều đó rồi.

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

0

Đây là một lớp mà bạn có thể thấy rất thuận tiện để đọc các tệp tài nguyên được nhúng từ hiện tại Assembly:

using System.IO;
using System.Linq;
using System.Text;
using static System.IO.Path;
using static System.Reflection.Assembly;

public static class EmbeddedResourceUtils
{
    public static string ReadFromResourceFile(string endingFileName)
    {
        var 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 = GetDirectoryName(stringBuilder.ToString());
        return fileName == null ? null : new string(fileName.Reverse().ToArray());
    }
}

0

Đối với tất cả những người chỉ muốn nhanh chóng văn bản của một tệp được mã hóa cứng trong winforms;

  1. Bấm chuột phải vào ứng dụng của bạn trong trình khám phá giải pháp> Tài nguyên> Thêm tệp của bạn.
  2. Nhấp vào nó và trong tab thuộc tính, đặt "Loại tệp" thành "Văn bản".
  3. Trong chương trình của bạn chỉ cần làm Resources.<name of resource>.toString();để đọc các tập tin.

Tôi sẽ không đề xuất điều này như là cách thực hành tốt nhất hoặc bất cứ điều gì, nhưng nó hoạt động nhanh chóng và làm những gì nó cần làm.


0

Đối với người dùng đang sử dụng VB.Net

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()

Ở đâu MyApplicationName là không gian tên của ứng dụng của tôi. Nó không phải là tên lắp ráp. Tên này được xác định trong thuộc tính của dự án (tab Ứng dụng).

Nếu bạn không tìm thấy tên tài nguyên chính xác, bạn có thể sử dụng GetManifestResourceNames()chức năng

Dim resourceName() As String = ass.GetManifestResourceNames()

hoặc là

Dim sName As String 
    = ass.GetManifestResourceNames()
        .Single(Function(x) x.EndsWith("JavaScript.js"))

hoặc là

Dim sNameList 
    = ass.GetManifestResourceNames()
        .Where(Function(x As String) x.EndsWith(".js"))

-1

Đọc FILE TXT nhúng về sự kiện tải biểu mẫu.

Đặt các biến động.

string f1 = "AppName.File1.Ext";
string f2 = "AppName.File2.Ext";
string f3 = "AppName.File3.Ext";

Gọi một thử bắt.

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.
}

Tạo Void cho Bao gồm (), Visual Studio Làm điều này cho bạn. Nhấp vào Lightbulb để AutoGenerate CodeBlock.

Đặt phần sau vào Khối mã đã tạo

Tài nguyên 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 );
}

Tài nguyên 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 );
}

Tài nguyên 3

var assembly = Assembly.GetExecutingAssembly();
using (Stream stream = assembly.GetManifestResourceStream(file3))

using (StreamReader reader = new StreamReader(stream))
{
    string result3 = reader.ReadToEnd();
    richTextBox1.AppendText(result3);
}

Nếu bạn muốn gửi biến trả về ở nơi khác, chỉ cần gọi hàm khác và ...

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

}

Điều này đạt được là điều này, một phương pháp để kết hợp nhiều tệp txt và đọc dữ liệu nhúng của chúng, bên trong một hộp văn bản có định dạng. đó là hiệu ứng mong muốn của tôi với mẫu Mã này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.