Làm thế nào để nhúng một tệp văn bản vào một hợp ngữ .NET?


118

Tôi muốn nhúng một tệp văn bản vào một hội đồng để tôi có thể tải văn bản mà không cần phải đọc nó từ đĩa và để mọi thứ tôi cần đều được chứa trong exe. (Vì vậy, nó dễ di động hơn)

Có cách nào để làm việc này không? Tôi giả sử điều gì đó với các tệp tài nguyên?

Và nếu bạn có thể, bạn phải làm như thế nào và làm cách nào để lập trình tải văn bản thành một chuỗi?

Câu trả lời:


147

Nhấp chuột phải vào tệp dự án, chọn Thuộc tính.

Trong cửa sổ mở ra, hãy chuyển đến tab Tài nguyên và nếu nó chỉ có một liên kết màu xanh lam ở giữa trang tab, hãy nhấp vào nó, để tạo một tài nguyên mới.

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

Sau đó, từ thanh công cụ phía trên trang tab, hãy chọn để thêm một tệp văn bản mới, đặt tên cho nó, nó sẽ được thêm vào dự án của bạn và mở ra.

Nếu bạn hiểu được điều này, thì trong mã của bạn, bạn có thể nhập vào Resources.TheNameYouGaveTheTextFileHere và bạn có thể truy cập nội dung của nó. Lưu ý rằng lần đầu tiên bạn sử dụng lớp Tài nguyên trong một lớp, bạn cần thêm chỉ thị sử dụng (nhấn Ctrl +. Sau khi nhập Tài nguyên để nhận menu để VS làm việc đó cho bạn).

Nếu có điều gì không rõ ràng về mô tả trên, vui lòng để lại nhận xét và tôi sẽ chỉnh sửa nó cho đến khi nó hoàn chỉnh hoặc có ý nghĩa :)


1
Mã chỉ thị 'using' sẽ trông như thế nào, tôi đang đấu tranh để làm cho nó hoạt động. Tôi đã thêm tệp Solutions.txt làm tài nguyên, nhưng nó không thể tìm thấy Tài nguyên.solutions - Tôi cảm thấy mình thiếu chỉ thị sử dụng.
Spedge

3
Ah-hah, tất cả những gì tôi cần làm là thêm My. ở phía trước (tức là My.Resources.solutions) Các mẫu!
Spedge

2
Thêm một tài nguyên sẽ tạo ra và bao gồm Properties\Resources.Designer.csvới namespace YourProjectRootNamespace.Properties, vì vậy bạn phải sử dụng YourProjectRootNamespace.Properties. ProjectRootNamespaceđược định nghĩa trong các thuộc tính của dự án của bạn trong VisualStudio.
ilyaigpetrov

1
Nếu tôi thêm một tệp văn bản theo cách này và nói rằng tệp văn bản đó là một phần của giải pháp của tôi ... nếu tệp đó được cập nhật và tôi xây dựng lại hợp ngữ thì tài nguyên nhúng có được cập nhật không? Hay tôi sẽ cần xóa / thêm lại tệp theo cách thủ công nếu tôi thay đổi nó?
Peter Tirrell

3
Các tệp được đóng gói thành tài nguyên tại thời điểm biên dịch, không phải khi bạn thêm chúng. Bạn có thể tự do thay đổi tệp trong bất kỳ công cụ nào bạn thích và xây dựng lại, những thay đổi sẽ là một phần của lắp ráp của bạn.
Lasse V. Karlsen

38

Trong Visual Studio 2003, Visual Studio 2005 và có thể các phiên bản trước đó (bản này cũng hoạt động trong năm 2008), bạn có thể đưa tệp văn bản vào dự án của mình, sau đó trong bảng điều khiển 'Thuộc tính', đặt hành động thành 'Tài nguyên được nhúng'. Sau đó, bạn có thể truy cập tệp dưới dạng một luồng bằng cách sử dụng Assembly.GetManifestResourceStream(string).

Các câu trả lời khác ở đây thuận tiện hơn. Tôi bao gồm điều này cho đầy đủ.

Lưu ý rằng cách tiếp cận này sẽ hoạt động để nhúng các loại tệp khác như hình ảnh, biểu tượng, âm thanh, v.v.


8
Lưu ý: Sử dụng không gian tên + tên tệp làm tham số cho GetManifestResourceStream (), ví dụ: "MyNamespace.MyTextfile.txt". Bạn cũng có thể gọi GetManifestResourceNames () để nhận danh sách tất cả các tên.
Stiefel

32

Sau khi nhúng một tệp văn bản, hãy sử dụng tệp đó bất kỳ ở đâu trong mã như thế này ...

global::packageName.Properties.Resources.ThatFileName

3
Đây là một cách tiếp cận tốt hơn nhiều vì nó sẽ gây ra lỗi trình biên dịch nếu tài nguyên bị xóa. Nó cũng loại bỏ lỗi chính tả. Cảm ơn vì bài đăng.
Ben Gripka 14/12/12

+5. Tôi có thể ghi nó trở lại tệp trong cấp C # DLL không?
Prajwal Bhat

1
Điều gì xảy ra nếu tôi muốn chỉ định ThatFileNametừ một biến?
c00000fd

4

Vâng, bạn đã chính xác - hãy tạo một tệp tài nguyên. Khi bạn làm điều đó mà bạn không cần phải "tải" chuỗi, nó sẽ được tham chiếu là Resource.W AnythingStringYouDefined.


2

Đây là những gì đã làm việc cho tôi. (Tôi cần đọc nội dung của tệp được nhúng vào tệp hình ảnh .NET có thể thực thi.)

Trước khi làm bất cứ điều gì, hãy đưa tệp của bạn vào giải pháp của bạn trong Visual Studio. (Trong trường hợp của tôi là VS 2017 Community.) Tôi chuyển sang thư mục, Solution Explorersau đó nhấp chuột phải Properties, chọn Add Existing Itemvà chọn tệp. (Nói FileName.txt,.) Sau đó, khi vẫn ở trong Solution Explorer, nhấp chuột phải vào tệp được bao gồm, chọn Propertiesvà chọn Build ActionlàmEmbedded Resource .

Sau đó, sử dụng mã này để đọc các byte của nó:

string strResourceName = "FileName.txt";

Assembly asm = Assembly.GetExecutingAssembly();
using( Stream rsrcStream = asm.GetManifestResourceStream(asm.GetName().Name + ".Properties." + strResourceName))
{
    using (StreamReader sRdr = new StreamReader(rsrcStream))
    {
        //For instance, gets it as text
        string strTxt = sRdr.ReadToEnd();
    }
}

Lưu ý rằng trong trường hợp này, bạn không cần thêm tệp đó làm tài nguyên như đã được đề xuất trong câu trả lời được chấp nhận .


1

Đây là những gì tôi đã làm:

  1. Đã thêm tệp (tài nguyên) của tôi vào Visual Studio bằng cách nhấp chuột phải vào dự án.
  2. Nhấp chuột phải vào mọi tệp bạn đã thêm và thay đổi "Loại bản dựng" thành Tài nguyên được nhúng.
  3. Để truy cập tài nguyên:

    a. Có lắp ráp hiện tại bằng cách sử dụng chức năng:GetExecutingAssembly()

    b. Tài nguyên mà tôi đã thêm là một tệp văn bản nên tôi có thể đọc nó thành một luồng bằng cách sử dụng GetManifestResourceStream(fileName). Cách tôi truy cập tên tệp là bằng cách gọiGetManifestResourceNames()

    c. Bây giờ hãy sử dụng một StreamReader()lớp để đọc đến cuối tệp thành một biến nếu đó là những gì bạn muốn.


0

Thêm vào câu trả lời của Pavan, để có được lắp ráp hiện tại (trong phần chung):

Assembly _assembly;

GetManifestResourceStream (fileName) (trong mã, nơi cần đọc từ tài nguyên):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
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.