Bir metin dosyası bir .NET derlemesine nasıl gömülür?


118

Metni diskten okumak zorunda kalmadan yükleyebilmek ve böylece ihtiyacım olan her şeyin exe içinde yer alması için bir derlemeye bir metin dosyası yerleştirmek istiyorum. (Böylece daha taşınabilir olur)

Bunu yapmanın bir yolu var mı? Kaynak dosyalarıyla ilgili bir şey varsayıyorum?

Ve eğer yapabiliyorsanız, bunu nasıl yaparsınız ve metni programatik olarak nasıl bir dizeye yüklersiniz?

Yanıtlar:


147

Proje dosyasına sağ tıklayın, Özellikler'i seçin.

Açılan pencerede Kaynaklar sekmesine gidin ve sekme sayfasının ortasında sadece mavi bir bağlantı varsa, yeni bir kaynak oluşturmak için bu bağlantıya tıklayın.

görüntü açıklamasını buraya girin

Ardından sekme sayfasının üzerindeki araç çubuğundan yeni bir metin dosyası eklemeyi seçin, ona bir isim verin, projenize eklenecek ve açılacaktır.

Buraya kadar gelirseniz, kodunuzda Resources.TheNameYouGaveTheTextFileHere yazabilir ve içeriğine erişebilirsiniz. Bir sınıfta Resources sınıfını ilk kez kullandığınızda, bir kullanma yönergesi eklemeniz gerektiğini unutmayın (VS'nin bunu sizin için yapması için menüye ulaşmak için Resources yazdıktan sonra Ctrl +. Tuşlarına basın).

Yukarıdaki açıklamayla ilgili net olmayan bir şey varsa, lütfen bir yorum bırakın ve tamamlanana veya mantıklı olana kadar düzenleyeceğim :)


1
Yönerge kodu 'kullanma' neye benzerdi, ben bunun işe yaraması için uğraşıyorum. Solutions.txt dosyasını bir kaynak olarak ekledim, ancak Resources.solutions bulamıyor - using yönergesini kaçırdığımı hissediyorum.
Spedge

3
Ah-hah, tek yapmam gereken bir My eklemekti. öne (yani My.Resources.solutions) Simples!
Spedge

2
Bir kaynak eklemek, Properties\Resources.Designer.csile oluşturur ve içerir namespace YourProjectRootNamespace.Properties, bu yüzden kullanmanız gerekir YourProjectRootNamespace.Properties. ProjectRootNamespaceVisualStudio'daki projenizin özelliklerinde tanımlanır.
ilyaigpetrov

1
Bu şekilde bir metin dosyası eklersem ve metin dosyasının çözümümün bir parçası olduğunu söylersem ... bu dosya güncellenir ve derlemeyi yeniden oluşturursam, gömülü kaynak da güncellenir mi? Veya değiştirirsem dosyayı manuel olarak kaldırmam / yeniden eklemem gerekir mi?
Peter Tirrell

3
Dosyalar, siz onları eklediğinizde değil, derleme zamanında kaynaklara paketlenir. Dosyayı istediğiniz herhangi bir araçta özgürce değiştirebilir ve yeniden oluşturabilirsiniz, değişiklikler montajınızın bir parçası olacaktır.
Lasse V. Karlsen

38

Visual Studio 2003, Visual Studio 2005 ve muhtemelen daha önceki sürümlerde (bu 2008'de de çalışır) metin dosyasını projenize dahil edebilir, ardından 'Özellikler' panelinde eylemi 'Gömülü Kaynak' olarak ayarlayabilirsiniz. Ardından dosyaya bir akış olarak erişebilirsiniz.Assembly.GetManifestResourceStream(string) .

Buradaki diğer cevaplar daha uygundur. Bunu eksiksizlik için ekliyorum.

Bu yaklaşımın resimler, simgeler, sesler vb. Gibi diğer dosya türlerini gömmek için işe yarayacağını unutmayın.


8
Not: GetManifestResourceStream () için parametre olarak ad alanı + dosya adını kullanın, örneğin "MyNamespace.MyTextfile.txt". Tüm adların bir listesini almak için GetManifestResourceNames () 'i de çağırabilirsiniz.
Stiefel

32

Bir metin dosyasını yerleştirdikten sonra, bu dosyayı kodun herhangi bir yerinde bunun gibi kullanın ...

global::packageName.Properties.Resources.ThatFileName

3
Bu çok daha iyi bir yaklaşımdır çünkü kaynak kaldırılırsa bir derleyici hatası verir. Ayrıca yazım hatalarını da ortadan kaldırır. Gönderi için teşekkürler.
Ben Gripka

5. C # DLL düzeyinde dosyaya geri yazabilir miyim?
Prajwal Bhat

1
ThatFileNameBir değişkenden belirtmek istersem ne olur ?
c00000fd

4

Evet, haklısınız - bir kaynak dosyası oluşturun. Bunu yaptığınızda, dizeyi "yüklemenize" gerek kalmaz, buna Resource.WhateverStringYouDefined olarak başvurulur.


2

İşte benim için işe yarayan şey. (Yürütülebilir bir .NET görüntü dosyasına yerleştirilmiş bir dosyanın içeriğini okumam gerekiyordu.)

Herhangi bir şey yapmadan önce dosyanızı Visual Studio'daki çözümünüze dahil edin. (Benim durumumda VS 2017 Topluluğu.) Klasöre Solution Explorergeçip sağ tıkladım , dosyayı seçip Propertiesseçtim Add Existing Item. (Deyin FileName.txt.) Ardından Solution Explorer, dahil edilen dosyaya sağ tıklayın, seçin Propertiesve şu şekilde seçin Build Action:Embedded Resource .

Ardından baytlarını okumak için bu kodu kullanı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();
    }
}

Bu durumda , kabul edilen yanıtta önerildiği gibi bu dosyayı bir kaynak olarak eklemenize gerek olmadığını unutmayın .


1

İşte yaptığım şey:

  1. Projeye sağ tıklayarak dosyalarımı (kaynakları) Visual Studio'da ekledim.
  2. Eklediğiniz her dosyaya sağ tıklayın ve "Yapı Türü" nü Yerleşik Kaynak olarak değiştirin.
  3. Kaynağa erişmek için:

    a. Şu işlevi kullanarak mevcut derlemeyi aldım:GetExecutingAssembly()

    b. Eklediğim kaynak bir metin dosyasıydı, bu yüzden kullanarak onu bir akışa okudum GetManifestResourceStream(fileName). Dosya adlarına erişme şeklimGetManifestResourceNames()

    c. Şimdi StreamReader(), eğer istediğiniz buysa, dosyanın sonuna kadar bir değişkene okumak için bir sınıf kullanın.


0

Mevcut meclisi elde etmek için Pavan'ın cevabına ek olarak (genel bölümde):

Assembly _assembly;

GetManifestResourceStream (fileName) (kaynaktan okumanın gerekli olduğu kodda):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.