Bagaimana cara menyematkan file teks dalam rakitan .NET?

118

Saya ingin menyematkan file teks dalam sebuah assembly sehingga saya dapat memuat teks tanpa harus membacanya dari disk, dan agar semua yang saya butuhkan ada di dalam exe. (Agar lebih portabel)

Apakah ada cara untuk melakukan ini? Saya berasumsi sesuatu dengan file sumber daya?

Dan jika Anda bisa, bagaimana Anda melakukannya dan bagaimana Anda secara terprogram memuat teks ke dalam string?

Adam Haile
sumber

Jawaban:

147

Klik kanan file proyek, pilih Properties.

Di jendela yang terbuka, buka tab Sumber Daya, dan jika hanya ada tautan biru di tengah halaman tab, klik, untuk membuat sumber daya baru.

masukkan deskripsi gambar di sini

Kemudian dari toolbar di atas tab-halaman, pilih untuk menambahkan file teks baru, beri nama, itu akan ditambahkan ke proyek Anda dan dibuka.

Jika Anda sudah sampai sejauh ini, maka dalam kode Anda, Anda dapat mengetikkan Resources.TheNameYouGaveTheTextFileHere dan Anda dapat mengakses isinya. Perhatikan bahwa pertama kali Anda menggunakan kelas Sumber daya di kelas, Anda perlu menambahkan direktif using (tekan Ctrl +. Setelah mengetik Sumber Daya untuk mendapatkan menu agar VS melakukannya untuk Anda).

Jika ada yang kurang jelas tentang uraian di atas, silakan tinggalkan komentar dan saya akan mengeditnya hingga selesai atau masuk akal :)

Lasse V. Karlsen
sumber
1
Seperti apa kode direktif 'menggunakan', saya kesulitan untuk membuat ini berfungsi. Saya telah menambahkan solutions.txt sebagai sumber daya, tetapi tidak dapat menemukan Resources.solutions - Saya merasa saya kehilangan arahan penggunaan.
Spedge
3
Ah-hah, yang perlu saya lakukan hanyalah menambahkan My. ke depan (yaitu My.Resources.solutions) Simples!
Spedge
2
Menambahkan sumber daya menghasilkan dan menyertakan Properties\Resources.Designer.csdengan namespace YourProjectRootNamespace.Properties, jadi Anda harus menggunakan YourProjectRootNamespace.Properties. ProjectRootNamespacedidefinisikan dalam properti proyek Anda di VisualStudio.
ilyaigpetrov
1
Jika saya menambahkan file teks dengan cara ini, dan mengatakan bahwa file teks adalah bagian dari solusi saya ... jika file itu diperbarui dan saya membangun kembali rakitan, apakah sumber daya yang disematkan juga akan diperbarui? Atau apakah saya perlu menghapus / menambahkan kembali file secara manual jika saya mengubahnya?
Peter Tirrell
3
File dikemas ke dalam sumber daya pada waktu kompilasi, bukan saat Anda menambahkannya. Anda dapat dengan bebas mengubah file di alat apa pun yang Anda suka dan membangun kembali, perubahan akan menjadi bagian dari perakitan Anda.
Lasse V. Karlsen
38

Dalam Visual Studio 2003, Visual Studio 2005 dan kemungkinan versi sebelumnya (ini bekerja pada tahun 2008 juga) Anda dapat menyertakan file teks dalam proyek Anda, lalu di panel 'Properti', atur tindakan ke 'Sumber Daya Tertanam'. Kemudian Anda dapat mengakses file sebagai aliran menggunakan Assembly.GetManifestResourceStream(string).

Jawaban lain di sini lebih nyaman. Saya menyertakan ini untuk kelengkapan.

Perhatikan bahwa pendekatan ini akan berfungsi untuk menyematkan jenis file lain seperti gambar, ikon, suara, dll ...

Drew Noakes
sumber
8
Catatan: Gunakan namespace + nama file sebagai parameter untuk GetManifestResourceStream (), misalnya "MyNamespace.MyTextfile.txt". Anda juga bisa memanggil GetManifestResourceNames () untuk mendapatkan daftar semua nama.
Stiefel
32

Setelah menyematkan file teks, gunakan file itu di mana saja dalam kode seperti ini ...

global::packageName.Properties.Resources.ThatFileName
Narottam Goyal
sumber
3
Ini adalah pendekatan yang jauh lebih baik karena akan memunculkan kesalahan kompiler jika sumber daya dihapus. Ini juga menghilangkan kesalahan ketik. Terima kasih atas kirimannya.
Ben Gripka
+5. Dapatkah saya menuliskannya kembali ke file dalam level C # DLL?
Prajwal Bhat
1
Bagaimana jika saya ingin menentukan ThatFileNamedari variabel?
c00000fd
4

Ya, Anda benar - buat file sumber daya. Saat Anda melakukannya, Anda tidak perlu "memuat" string, itu akan direferensikan sebagai Resource.WhateverStringYouDefined.

Otávio Décio
sumber
2

Inilah yang berhasil untuk saya. (Saya perlu membaca konten file yang disematkan ke file gambar .NET yang dapat dieksekusi.)

Sebelum melakukan apa pun, sertakan file Anda ke dalam solusi Anda di Visual Studio. (Dalam kasus saya Komunitas VS 2017.) Saya beralih ke Solution Explorer, lalu mengklik kanan Propertiesfolder, memilih Add Existing Itemdan memilih file. (Katakan FileName.txt,.) Kemudian saat masih dalam Solution Explorer, klik kanan pada file yang disertakan, pilih Properties, dan pilih Build ActionsebagaiEmbedded Resource .

Kemudian gunakan kode ini untuk membaca byte-nya:

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

Perhatikan, bahwa dalam kasus ini Anda tidak perlu menambahkan file tersebut sebagai sumber daya seperti yang diusulkan dalam jawaban yang diterima .

c00000fd
sumber
1

Inilah yang saya lakukan:

  1. Menambahkan file saya (sumber daya) di Visual Studio dengan mengklik kanan pada proyek.
  2. Klik kanan pada setiap file yang telah Anda tambahkan dan ubah "Build Type" menjadi Embedded Resource.
  3. Untuk mengakses sumber daya:

    Sebuah. Punya perakitan saat ini menggunakan fungsi:GetExecutingAssembly()

    b. Sumber daya yang saya tambahkan adalah file teks jadi saya membacanya menjadi aliran menggunakan GetManifestResourceStream(fileName). Cara saya mengakses nama file adalah dengan meneleponGetManifestResourceNames()

    c. Sekarang gunakan StreamReader()kelas untuk membaca sampai akhir file menjadi variabel jika itu yang Anda inginkan.

Pavan
sumber
0

Menambah jawaban Pavan, untuk mendapatkan perakitan saat ini (di bagian umum):

Assembly _assembly;

GetManifestResourceStream (fileName) (dalam kode, di mana sumber daya harus dibaca):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
Narjis Hasan
sumber