Cara membaca file teks sumber daya tertanam

693

Bagaimana cara membaca sumber daya yang disematkan (file teks) menggunakan StreamReaderdan mengembalikannya sebagai string? Skrip saya saat ini menggunakan formulir Windows dan kotak teks yang memungkinkan pengguna menemukan dan mengganti teks dalam file teks yang tidak disematkan.

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();
}
Saya. Tutup
sumber

Jawaban:

1194

Anda dapat menggunakan Assembly.GetManifestResourceStreamMetode :

  1. Tambahkan usings berikut

    using System.IO;
    using System.Reflection;
    
  2. Setel properti file yang relevan:
    Parameter Build Actiondengan nilaiEmbedded Resource

  3. Gunakan kode berikut

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

resourceNameadalah nama salah satu sumber daya yang disematkan di assembly. Misalnya, jika Anda menyematkan file teks bernama "MyFile.txt"yang ditempatkan di root proyek dengan namespace default "MyCompany.MyProduct", maka resourceNameadalah "MyCompany.MyProduct.MyFile.txt". Anda bisa mendapatkan daftar semua sumber daya dalam perakitan menggunakan Assembly.GetManifestResourceNamesMetode .


A no brainer cerdik untuk mendapatkan resourceNamedari nama file saja (dengan melewatkan hal namespace):

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

Contoh lengkap:

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();
    }
}
dtb
sumber
5
@ Me.Tutup: Lihat Environment.SpecialFolderuntuk mendapatkan folder desktop. Anda harus ingat bahwa sumber daya akan diberi nama berdasarkan jalurnya dalam proyek, sehingga namanya mungkin tidak adil file1.txt.
adrianbank
15
Argumen untuk GetManifestResourceStreammembutuhkan path seperti yang ditunjukkan oleh @adrian. Jika membantu siapa pun, jalan itu seperti menunjukkan apa yang @SimpleCoder dalam contoh: MyNamespace.Filename.Ext. Saya sebelumnya sudah mencoba MyNamespace.Resources.Filename.Exttetapi hasilnya nol.
JYelton
61
Jika Anda memiliki sumber daya Anda tidak secara langsung di root proyek, tetapi di beberapa subfolder, jangan lupa untuk memasukkan nama folder ini di resourceName juga (misalnya "MyProjectNameSpace.MyProjectSubFolder.FileName.FileExtention")
Sasha
19
Layak untuk mengatakan bahwa sumber daya "Bangun Tindakan" harus ditetapkan sebagai "Sumber Daya Tertanam"
Illidan
7
Satu poin penting yang tidak dibahas di sini. Jika Anda menyimpan file Anda sebagai jenis penyandian alternatif untuk mengatasi karakter aneh (dalam kasus saya UTF8), Anda mungkin mendapatkan file kosong kembali ketika Anda membaca aliran. Perbaiki ini dengan menentukan jenis penyandian di konstruktor pembaca aliran:using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
Kinetic
140

Anda dapat menambahkan file sebagai sumber daya menggunakan dua metode terpisah.

Kode C # yang diperlukan untuk mengakses file berbeda , tergantung pada metode yang digunakan untuk menambahkan file di tempat pertama.

Metode 1: Tambahkan file yang ada, atur properti ke Embedded Resource

Tambahkan file ke proyek Anda, lalu setel jenisnya ke Embedded Resource.

CATATAN: Jika Anda menambahkan file menggunakan metode ini, Anda dapat menggunakannya GetManifestResourceStreamuntuk mengaksesnya (lihat jawaban dari @dtb ).

masukkan deskripsi gambar di sini

Metode 2: Tambahkan file ke Resources.resx

Buka Resources.resxfile, gunakan kotak dropdown untuk menambahkan file, atur Access Modifierke public.

CATATAN: Jika Anda menambahkan file menggunakan metode ini, Anda dapat menggunakannya Properties.Resourcesuntuk mengaksesnya (lihat jawaban dari @Night Walker ).

masukkan deskripsi gambar di sini

Contango
sumber
5
Metode ketiga adalah menambahkan file ke proyek, lalu mengatur "Salin ke Direktori Output" ke "Benar". Pada kompilasi, file disalin ke dir output, dan Anda dapat membaca file menggunakan cara normal. Contoh: di aplikasi WPF ketika Anda ingin menampilkan gambar.
Contango
jadi mengatur tindakan build untuk Resourcetidak melakukan apa pun yang memungkinkan Anda membaca item sebagai sumber daya? Anda harus menggunakan EmbeddedResourceatau menambah Resources.resxfile?
Maslow
3
@Maslow Mengatur aksi build ke 'Resource' menciptakan sumber daya yang ditautkan, sedangkan mengatur aksi build untuk 'Resource Tertanam' mengkompilasi sumber daya ke dalam unit output. Istilah 'sumber daya tertaut' adalah istilah umum untuk 'menyalin file ke direktori output pada kompilasi' (Anda kemudian dapat membaca file saat runtime menggunakan metode normal apa pun). Untuk lebih lanjut tentang perbedaan antara kedua jenis ini, lihat Menambahkan dan Mengedit Sumber Daya (Visual C #) di msdn.microsoft.com/en-us/library/7k989cfy(v=vs.90).aspx .
Contango
Jika Anda ingin menggunakan sumber daya dengan cara ini, tetapi dinamis, hanya bukan ini: Properties.Resources.Your_resource_name menulis ini: Properties.Resources.ResourceManager.GetObject("Your_resource_name").
Lkor
86

Pada dasarnya, Anda menggunakan System.Reflectionuntuk mendapatkan referensi ke Majelis saat ini. Lalu, Anda gunakan GetManifestResourceStream().

Contoh, dari halaman yang saya posting:

Catatan : perlu ditambahkan using System.Reflection;agar ini berfungsi

   Assembly _assembly;
   StreamReader _textStreamReader;

   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }
Chris Laplante
sumber
32
+1 Untuk memasukkan namespacesebagai bagian dari nama sumber daya
Kirk Broadhurst
41
var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); Metode ini bisa sangat berguna ketika Anda ingin mempelajari nama sumber daya yang tepat. (Diambil dari pertanyaan stackoverflow.com/questions/27757/… )
Oscar Foley
69

Di Visual Studio Anda dapat langsung menyematkan akses ke sumber daya file melalui tab Resources di properti Project ("Analytics" dalam contoh ini). tangkapan layar studio visual - Sumber Daya tab

File yang dihasilkan kemudian dapat diakses sebagai array byte dengan

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

Jika Anda memerlukannya sebagai streaming, maka (dari https://stackoverflow.com/a/4736185/432976 )

Stream stream = new MemoryStream(jsonSecrets)
Andrew Hill
sumber
11
Anda juga dapat menggunakan ini dengan file teks, dalam hal ini Anda akan memiliki: string jsonSecrets = YourNameSpace.Properties.Resources.YourFileName;
ouflak
30

Saat Anda menambahkan file ke sumber daya, Anda harus memilih Access Modifiers sebagai publik daripada yang bisa Anda buat seperti mengikuti.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 adalah nama file yang disematkan.

Sebenarnya Anda bisa pergi ke resources.designer.cs dan lihat apa nama pembuatnya.

Walker Malam
sumber
5
Bisakah Anda jelaskan hal ini lebih lanjut? Ketika saya klik kanan-> properti pada file di explorer solusi, dan kemudian diatur Actionke Incorporated ressource, saya tidak memiliki Access Modifiersbidang di panel properti. Juga, saya tidak memiliki Propersites.Resourceskelas, saya mendapatkan The name 'Properties' does not exist in the current contextkesalahan saat mengkompilasi kode Anda.
Suzanne Dupéron
2
Ini hanya akan berfungsi jika Anda menanamkan file ke dalam Resources.resx, lihat jawaban saya pada metode yang berbeda untuk menanamkan file ke dalam proyek.
Contango
13

menambahkan mis. Projectfile.sql Menu Project -> Properties -> Resources -> Add Existing file

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

masukkan deskripsi gambar di sini

miciry89
sumber
2
Ini akan mengembalikan byte [], untuk file teks menggunakan `Encoding.UTF8.GetString (Properties.Resources.Testfile)`
MikeTheCoder
12

Saya tahu ini adalah utas lama, tetapi ini yang berhasil bagi saya:

  1. tambahkan file teks ke sumber daya proyek
  2. atur pengubah akses ke publik, seperti ditunjukkan di atas oleh Andrew Hill
  3. baca teks seperti ini:

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

Teks yang saya tambahkan ke sumber: 'SomeText.txt'

S_Teo
sumber
8

Anda juga dapat menggunakan versi sederhana jawaban @ dtb ini:

public string GetEmbeddedResource(string ns, string res)
{
    using (var reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Format("{0}.{1}", ns, res))))
    {
        return reader.ReadToEnd();
    }
}
Timmerz
sumber
Apa kamu yakin akan hal itu? menurut tautan ini, sepertinya saya .... stackoverflow.com/questions/1065168/
Timmerz
8

Sesuatu yang saya pelajari sekarang adalah bahwa file Anda tidak diizinkan memiliki "." (titik) dalam nama file.

SEBUAH "."  dalam nama file tidak baik.

Templates.plainEmailBodyTemplate-en.txt -> Works !!!
Templates.plainEmailBodyTemplate.en.txt -> tidak berfungsi melalui GetManifestResourceStream ()

Mungkin karena kerangka kerja menjadi bingung atas ruang nama vs nama file ...

Peter Gfader
sumber
3
Maaf. Ini salah. Titik-titik bekerja. (setidaknya itu berhasil untuk saya, NET4.5) Saya tidak tahu mengapa Anda memiliki bug ini.
Felix Keil
Ya mereka berfungsi tetapi mereka bertindak sebagai pemisah Direktori. Templates.plainEmailBodyTemplate.en.txt akan mencari sumber daya "\ Templates \ plainEmailBodyTemplate \ en.txt"
Peter Gfader
Tidak, saya mencobanya. GetManifestResourceStream dapat mengakses sumber daya yang disematkan dengan lebih dari satu titik di nama file. (NET4.5)
Felix Keil
1
Saya punya masalah yang sama di .NET 4.5. File dengan titik-titik dalam nama bahkan tidak ditambahkan ke pengumpulan sumber daya. Method assembly.GetManifestResourceNames () mengembalikan daftar kosong kepada saya. Kemudian saya mengetahui bahwa masalahnya hanya dengan kode bahasa. ca.abcd.sk.crt tidak ditambahkan ke sumber daya sementara ca.abcd.crt ditambahkan tanpa masalah.
a.farkas2508
1
Masih benar pada tahun 2020. Terima kasih banyak untuk ini, saya sudah gila dengan ini.
ZeRemz
8

Dengan semua kekuatan Anda digabungkan, saya menggunakan kelas penolong ini untuk membaca sumber daya dari setiap majelis dan ruang nama dengan cara yang umum.

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();
            }
        }
    }
}
t3chb0t
sumber
3
plus satu untuk planet kapten: P
Alok
4

Saya membaca penggunaan file teks sumber daya tertanam:

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

Sampel:

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

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

Saya tahu ini sudah tua, tetapi saya hanya ingin menunjukkan untuk NETMF (.Net MicroFramework), Anda dapat dengan mudah melakukan ini:

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

Karena NETMF tidak punyaGetManifestResourceStream

dreamwork801
sumber
3

Setelah membaca semua solusi yang diposting di sini. Inilah cara saya menyelesaikannya:

// 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 "";      
}
Bill Moore
sumber
3

Jawabannya cukup sederhana, cukup lakukan ini jika Anda menambahkan file langsung dari resources.resx.

string textInResourceFile = fileNameSpace.Properties.Resources.fileName;

Dengan baris kode itu, teks dari file langsung dibaca dari file dan dimasukkan ke dalam variabel string.

Jamisco
sumber
2

Saya kesal karena Anda harus selalu menyertakan namespace dan folder dalam string. Saya ingin menyederhanakan akses ke sumber daya yang tertanam. Inilah sebabnya saya menulis kelas kecil ini. Jangan ragu untuk menggunakan dan meningkatkan!

Pemakaian:

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

Kelas:

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

}
Felix Keil
sumber
1
Dan bagaimana dengan solusi super sederhana: var resName = assembly.GetManifestResourceNames (). Di mana (i => i.EndsWith (fileName)). FirstOrDefault (); Ini tidak akan berfungsi jika Anda menempatkan seluruh direktori ke dalam rakitan, tetapi sebaliknya hanya satu baris;)
Harry
@ Harry yakin kamu bisa melakukan ini. Bagaimana ini berkorelasi dengan jawaban saya? Apakah Anda ingin meningkatkan Metode GetStream? Dan bagaimana Anda menangani ambiguitas?
Felix Keil
1
@Estevez menggunakan Sistem; menggunakan System.IO; menggunakan System.Linq; menggunakan System.Reflection;
Felix Keil
2
Untuk beberapa alasan, kelas tidak berfungsi ketika ditempatkan di proyek lain. Majelis Panggilan dan Pelaksana sama-sama merujuk pada majelis dengan kelas ini, bukan yang benar-benar melaksanakan tes. Tanpa inisialisasi statis dan malas semuanya baik, tho.
Curly Brace
1
@CurlyBrace Terima kasih. Evaluasi malas adalah kesalahan nyata dalam jawaban ini, karena majelis pemanggilan & pelaksanaan bergantung pada konteksnya. Mereka harus diselesaikan pada setiap akses.
Felix Keil
2

Beberapa jenis proyek VS .NET tidak menghasilkan file .NET (.resx) secara otomatis. Langkah-langkah berikut menambahkan file Resource ke proyek Anda:

  1. Klik kanan node proyek dan pilih Tambah / Item Baru, gulir ke File Sumber Daya. Di kotak Nama pilih nama yang sesuai, misalnya Sumber Daya dan klik tombol Tambah.
  2. File sumber daya Resources.resx ditambahkan ke proyek dan dapat dilihat sebagai simpul dalam solusi explorer.
  3. Sebenarnya, dua file dibuat, ada juga C # class Resources.Designer.cs yang dihasilkan secara otomatis. Jangan diedit, itu dikelola oleh VS. File berisi kelas bernama Resources.

Sekarang Anda dapat menambahkan file teks sebagai sumber daya, misalnya file xml:

  1. Klik dua kali Resources.resx. Pilih Tambah Sumber Daya> Tambahkan File Yang Ada dan gulir ke file yang ingin Anda sertakan. Biarkan nilai default Internal untuk Access Modify.
  2. Ikon mewakili item sumber daya baru. Jika dipilih, panel properti menunjukkan propertinya. Untuk file xml, di bawah properti Encoding pilih Unicode (UTF-8) - Codepage 65001 alih-alih codepage lokal default. Untuk file teks lainnya pilih penyandian file yang benar, misalnya codepage 1252.
  3. Untuk file teks seperti file xml, kelas Resourcesmemiliki properti tipe stringyang dinamai setelah file yang disertakan. Jika nama file mis. RibbonManifest.xml, maka properti tersebut harus memiliki nama RibbonManifest. Anda menemukan nama persis di file kode Resources.Designer.cs.
  4. Gunakan properti string seperti properti string lain, misalnya: string xml = Resources.RibbonManifest. Bentuk umumnya adalah ResourceFileName.IncludedTextFileName. Jangan gunakan ResourceManager.GetStringkarena fungsi get dari properti string sudah melakukannya.
Dietrich Baumgarten
sumber
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;
    }
}
bytedev
sumber
0

Ini adalah kelas yang menurut Anda sangat nyaman untuk membaca file sumber daya tertanam dari saat ini 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());
    }
}
BullyWiiPlaza
sumber
0

Untuk semua orang yang hanya ingin teks file hardcoded dalam winforms;

  1. Klik kanan aplikasi Anda di explorer solusi> Sumber Daya> Tambahkan file Anda.
  2. Klik di atasnya, dan di tab properti atur "FileType" ke "Text".
  3. Dalam program Anda cukup lakukan Resources.<name of resource>.toString();membaca file.

Saya tidak akan merekomendasikan ini sebagai praktik terbaik atau apa pun, tetapi ini bekerja dengan cepat dan melakukan apa yang perlu dilakukan.

SwatDoge
sumber
0

Untuk pengguna yang menggunakan 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()

di mana MyApplicationNamenamespace dari aplikasi saya. Itu bukan nama majelis. Nama ini didefinisikan dalam properti proyek (tab Aplikasi).

Jika Anda tidak menemukan nama sumber daya yang benar, Anda dapat menggunakan GetManifestResourceNames()fungsi

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

atau

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

atau

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

Baca Embedded TXT FILE pada Acara Muat Formulir.

Atur Variabel Secara Dinamis.

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

Sebut Try Try.

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

Buat Void untuk IncludeText (), Visual Studio Melakukan ini untuk Anda. Klik Bola Lampu untuk Secara Otomatis Menghasilkan CodeBlock.

Masukkan yang berikut ini di dalam Blok Kode yang Dihasilkan

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

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

Sumber daya 3

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

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

Jika Anda ingin mengirim variabel yang dikembalikan ke tempat lain, panggil saja fungsi lain dan ...

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

}

Apa yang dicapai ini adalah ini, metode untuk menggabungkan beberapa file txt, dan membaca data yang disematkan, di dalam satu kotak teks kaya. yang merupakan efek yang saya inginkan dengan contoh kode ini.

MasterCassidy
sumber