Katıştırılmış kaynak metin dosyası nasıl okunur


694

Katıştırılmış bir kaynağı (metin dosyası) kullanarak nasıl okurum StreamReaderve dize olarak döndürürüm? Geçerli komut dosyamda, kullanıcının gömülü olmayan bir metin dosyasındaki metni bulmasını ve değiştirmesini sağlayan bir Windows formu ve metin kutusu kullanılıyor.

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

Yanıtlar:


1197

Assembly.GetManifestResourceStreamYöntemi kullanabilirsiniz :

  1. Aşağıdaki kullanımları ekleyin

    using System.IO;
    using System.Reflection;
    
  2. İlgili dosyanın özelliğini ayarla: Değerli
    parametreBuild ActionEmbedded Resource

  3. Aşağıdaki kodu kullanın

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

    resourceNamegömülü kaynaklardan birinin adıdır assembly. Örneğin, "MyFile.txt"varsayılan ad alanı olan bir projenin kök dizinine yerleştirilmiş adlı bir metin dosyasını gömerseniz "MyCompany.MyProduct", o zaman resourceNameolur "MyCompany.MyProduct.MyFile.txt". Assembly.GetManifestResourceNamesYöntemi kullanarak bir montajdaki tüm kaynakların bir listesini alabilirsiniz .


resourceNameYalnızca dosya adından almak için bir beyin fırtınası yok (ad alanı öğelerini geçerek):

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

Tam bir örnek:

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.Close: Environment.SpecialFolderMasaüstü klasörünü almak için bir göz atın . Kaynağın, proje içindeki yoluna bağlı olarak ad boşluklandırılacağını aklınızda bulundurmanız gerekir, bu nedenle adı sadece olmayabilir file1.txt.
adrianbanks

15
Argümanı GetManifestResourceStreamihtiyaçları @adrian olarak yol gösterir. O kimseyi yardımcı olursa, bu yol örnekte ne @SimpleCoder gösterileri gibi: MyNamespace.Filename.Ext. Daha önce denemiştim MyNamespace.Resources.Filename.Extama bu bir null sonuç veriyor.
JYelton

61
Kaynağınız doğrudan proje köküne değil, bazı alt klasörlere sahipseniz, bu klasör adını kaynakAdı'na da koymayı unutmayın (ör. "MyProjectNameSpace.MyProjectSubFolder.FileName.FileExtention")
Sasha

19
"Eylem Oluştur" kaynağının "Gömülü Kaynak" olarak ayarlanması gerektiğini söylemeye değer
Illidan

7
Burada ele alınmayan önemli bir nokta. Dosyanızı tek karakterlerle başa çıkmak için alternatif bir kodlama türü olarak kaydettiyseniz (benim durumumda UTF8), akışı okuduğunuzda boş bir dosya alabilirsiniz. Akış okuyucusunun yapıcısında kodlama türünü belirterek bunu düzeltin:using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
Kinetic

140

İki ayrı yöntem kullanarak bir dosyayı kaynak olarak ekleyebilirsiniz.

Dosyaya erişmek için gereken C # kodu , dosyayı ilk etapta eklemek için kullanılan yönteme bağlı olarak farklıdır .

Yöntem 1: Varolan dosyayı ekleyin, özelliği olarak ayarlayın Embedded Resource

Dosyayı projenize ekleyin, ardından türü olarak ayarlayın Embedded Resource.

Not: dosyayı bu yöntemi kullanarak eklerseniz, GetManifestResourceStreamerişmek için kullanabilirsiniz ( @dtb yanıt ).

resim açıklamasını buraya girin

Yöntem 2: Dosya ekle Resources.resx

Resources.resx, set dosyası eklemek için açılır kutuyu kullanın dosyayı Access Modifieriçin public.

NOT: Dosyayı bu yöntemi kullanarak eklerseniz, Properties.Resourceserişmek için kullanabilirsiniz ( @Night Walker'ın yanıtına bakın ).

resim açıklamasını buraya girin


5
Üçüncü yöntem dosyayı projeye eklemektir, sonra "Çıktı Dizine Kopyala" yı "Doğru" olarak ayarlamaktır. Derlemede, dosya çıktı dizinine kopyalanır ve dosyayı normal yollarla okuyabilirsiniz. Örnek: bir görüntüyü görüntülemek istediğinizde bir WPF uygulamasında.
Contango

bu yüzden derleme eylemini Resourceöğeyi kaynak olarak okumanıza izin veren hiçbir şey yapmaz mı? kullanmak EmbeddedResourceveya bir Resources.resxdosyaya eklemek zorunda mısınız?
Maslow

3
@Maslow Derleme eylemini 'Kaynak' olarak ayarlamak bağlantılı bir kaynak yaratırken, derleme eylemini 'Gömülü Kaynak' olarak ayarlamak kaynağı çıktı derlemesine derler. 'Bağlı kaynak' terimi, 'dosyayı derleme sırasında çıktı dizinine kopyala' için süslü bir terimdir (daha sonra dosyayı herhangi bir normal yöntemi kullanarak çalışma zamanında okuyabilirsiniz). Bu iki tür arasındaki fark hakkında daha fazla bilgi için bkz . Msdn.microsoft.com/en-us/library/7k989cfy(v=vs.90).aspx adresinde Kaynak Ekleme ve Düzenleme (Visual C #) .
Contango

Eğer kaynakları bu şekilde kullanmak ister ama istiyorsanız dinamik, sadece bunun yerine: Properties.Resources.Your_resource_name bu yazın: Properties.Resources.ResourceManager.GetObject("Your_resource_name").
Lkor

86

Temel olarak, System.Reflectionmevcut Meclise bir referans almak için kullanılır . Sonra kullanın GetManifestResourceStream().

Örnek, gönderdiğim sayfadan:

Not : using System.Reflection;Bunun çalışması için eklemeniz gerekir

   Assembly _assembly;
   StreamReader _textStreamReader;

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

32
+1 namespaceKaynak adının bir parçası olarak dahil etmek için
Kirk Broadhurst

41
var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); Kaynak adını tam olarak öğrenmek istediğinizde bu yöntem çok faydalı olabilir. (Soru stackoverflow.com/questions/27757/…
Oscar Foley

69

Visual Studio'da, bir dosya kaynağına erişimi Proje özelliklerinin Kaynaklar sekmesi aracılığıyla doğrudan yerleştirebilirsiniz (bu örnekte "Analytics"). visual studio ekran görüntüsü - Kaynaklar sekmesi

Sonuçta elde edilen dosyaya byte dizisi olarak

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

Bir akış olarak ihtiyacınız varsa, ( https://stackoverflow.com/a/4736185/432976 adresinden )

Stream stream = new MemoryStream(jsonSecrets)

11
Bunu bir metin dosyasıyla da kullanabilirsiniz; bu durumda: string jsonSecrets = Adınız \ Space.Properties.Resources.YourFileName;
ouflak

30

Dosyayı kaynaklara eklediğinizde, Access Değiştiricilerini herkese açık olarak aşağıdaki gibi bir şey yapabileceğinizden seçmelisiniz.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 katıştırılmış dosyanın adıdır.

Aslında kaynaklara gidebilirsiniz.Designer.cs ve alıcının adının ne olduğunu görebilirsiniz.


5
Lütfen daha fazla açıklayabilir misiniz? Sağ Click i> çözüm explorer bir dosya üzerinde özellikleri ve sonra ayarlandığında Actioniçin Incorporated ressource, ben hiç yok Access Modifiersözellikler panelinde alanını. Ayrıca, bir Propersites.Resourcessınıf yok, The name 'Properties' does not exist in the current contextkodunuzu derlerken bir hata alıyorum.
Suzanne Dupéron

2
Bu, yalnızca dosyayı içine yerleştirdiğinizde işe yarar Resources.resx, dosyaları bir projeye gömmek için farklı yöntemler hakkındaki cevabımı görün.
Contango

13

ekleme örneğin Testfile.sql Proje Menüsü -> Özellikler -> Kaynaklar -> Mevcut Dosya Ekle

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

resim açıklamasını buraya girin


2
Bayt [] döndürecektir, metin dosyaları için `Encoding.UTF8.GetString (Properties.Resources.Testfile)`
MikeTheCoder

12

Eski bir iş parçacığı olduğunu biliyorum, ama bu benim için çalıştı:

  1. metin dosyasını proje kaynaklarına ekleme
  2. erişim değiştiriciyi yukarıda gösterilen Andrew Hill tarafından herkese açık olarak ayarla
  3. metni şu şekilde okuyun:

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

Kaynaklara eklediğim metin: 'SomeText.txt'


8

@ Dtb'nin yanıtının bu basitleştirilmiş sürümünü de kullanabilirsiniz:

public string GetEmbeddedResource(string ns, string res)
{
    using (var reader = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(string.Format("{0}.{1}", ns, res))))
    {
        return reader.ReadToEnd();
    }
}

bundan emin misin? Bu bağlantıya göre ben
gibiyim

8

Şu anda öğrendiğim bir şey, dosyanızın "." (nokta) olarak adlandırın.

Bir "."  dosya adında iyi değil.

Templates.plainEmailBodyTemplate-en.txt -> Çalışır !!!
Templates.plainEmailBodyTemplate.en.txt -> GetManifestResourceStream () ile çalışmaz

Muhtemelen çerçeve isim alanları vs dosyaadı üzerinde karıştığı için ...


3
Afedersiniz. Bu yanlış. Noktalar çalışır. (en azından benim için çalıştı, NET4.5) Neden bu hataya sahip olduğunu bilmiyorum.
Felix Keil

Evet çalışıyorlar ama Dizin ayırıcı gibi davranıyorlar. Templates.plainEmailBodyTemplate.en.txt "\ Templates \ plainEmailBodyTemplate \ en.txt" kaynağını
arayacaktır

Hayýr. Denedim. GetManifestResourceStream, dosya adında birden fazla noktalı gömülü kaynaklara erişebilir. (NET4.5)
Felix Keil

1
.NET 4.5'te de aynı sorunla karşılaştım. Nokta adında dosyalar kaynak koleksiyonuna bile eklenmedi. Method assembly.GetManifestResourceNames () bana boş liste döndürür.Daha sonra sorunun yalnızca dil kodu ile olduğunu öğrendim. ca.abcd.sk.crt kaynaklara eklenmedi, ca.abcd.crt sorunsuz bir şekilde eklendi.
a.farkas2508

1
2020'de hala doğru. Bunun için çok teşekkürler, bununla deliriyordum.
ZeRemz

8

Tüm güçleriniz birleşince, bu yardımcı sınıfı, herhangi bir derlemeden ve herhangi bir ad alanından kaynakları genel bir şekilde okumak için kullanıyorum.

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
artı bir Kaptan gezegeni için: P
Alok

4

Gömülü kaynak metin dosyası kullanımını okudum:

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

Örneklem:

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

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

3

Bu eski olduğunu biliyorum, ama sadece NETMF (.Net MicroFramework) için işaret etmek istedim , bunu kolayca yapabilirsiniz:

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

Yana NETMF yokGetManifestResourceStream


3

Burada yayınlanan tüm çözümleri okuduktan sonra. Ben bu şekilde çözdüm:

// 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

Yanıt oldukça basittir, dosyayı doğrudan resources.resx'den eklediyseniz bunu yapın.

string textInResourceFile = fileNameSpace.Properties.Resources.fileName;

Bu kod satırıyla, dosyadaki metin doğrudan dosyadan okunur ve string değişkenine konur.


2

Her zaman dizede ad alanını ve klasörü dahil etmek zorunda olduğum için rahatsız oldum. Yerleşik kaynaklara erişimi basitleştirmek istedim. Bu yüzden bu küçük sınıfı yazdım. Kullanmak ve geliştirmek için çekinmeyin!

Kullanımı:

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

Sınıf:

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
Peki ya süper basit çözüm: var resName = assembly.GetManifestResourceNames (). Nerede (i => i.EndsWith (dosyaAdı)). FirstOrDefault (); Tüm dizinleri bir araya getirirseniz işe yaramaz, ancak aksi halde sadece bir satırdır;)
Harry

@Bunu yapabileceğinden emin ol. Bu benim cevabımla nasıl korele? GetStream Yöntemini geliştirmek istiyor musunuz? Peki belirsizliği nasıl ele alıyorsunuz?
Felix Keil

1
@Estevez Sistemi kullanarak; System.IO kullanarak; System.Linq kullanarak; System.Reflection kullanarak;
Felix Keil

2
Bazı nedenlerden dolayı sınıf başka bir projeye yerleştirildiğinde çalışmaz. Çağırma ve Yürütme derlemeleri, gerçekte sınamaları gerçekleştiren derlemeye değil, bu sınıftaki derlemeye başvurur. Statik ve tembel başlatma olmadan hepsi iyi, tho.
Curly Brace

1
@CurlyBrace Teşekkürler. Tembel değerlendirme bu cevapta gerçek bir kusurdur, çünkü çağrı ve yürütme meclisleri bağlama bağlı olarak değişir. Her erişimde çözülmeleri gerekir.
Felix Keil

2

Bazı VS .NET proje türleri otomatik olarak bir .NET (.resx) dosyası oluşturmaz. Aşağıdaki adımlar projenize bir Kaynak dosyası ekler:

  1. Proje düğümüne sağ tıklayın ve Öğe Ekle / Yeni Öğe'yi seçin, Kaynaklar Dosyasına gidin. Ad kutusunda uygun bir ad seçin, örneğin Kaynaklar ve Ekle düğmesini tıklayın.
  2. Resources.resx kaynak dosyası projeye eklenir ve çözüm gezgininde bir düğüm olarak görülebilir.
  3. Aslında, iki dosya oluşturulur, ayrıca otomatik olarak oluşturulan bir C # sınıfı Resources.Designer.cs vardır. Düzenleme, VS tarafından korunur. Dosya adlı bir sınıf içeriyor Resources.

Artık kaynak olarak bir metin dosyası, örneğin bir xml dosyası ekleyebilirsiniz:

  1. Resources.resx dosyasına çift tıklayın. Kaynak Ekle> Mevcut Dosya Ekle'yi seçin ve dahil etmek istediğiniz dosyaya gidin. Access Değiştir için varsayılan değeri Dahili olarak bırakın.
  2. Bir simge yeni kaynak öğesini temsil eder. Seçilirse, özellik bölmesi özelliklerini gösterir. Xml dosyaları için, Kodlama özelliği altında varsayılan yerel kod sayfası yerine Unicode (UTF-8) - Kod sayfası 65001'i seçin. Diğer metin dosyaları için bu dosyanın doğru kodlamasını seçin, örneğin kod sayfası 1252.
  3. Xml dosyaları gibi metin dosyaları için sınıf Resources, stringdahil edilen dosyadan sonra adlandırılan türde bir özelliğe sahiptir . Dosya adı örneğin RibbonManifest.xml ise, özelliğin adı olmalıdır RibbonManifest. Tam adı Resources.Designer.cs kod dosyasında bulabilirsiniz.
  4. Örneğin, herhangi bir başka özellik dizgesi gibi dize özelliğini kullanın: string xml = Resources.RibbonManifest. Genel biçimidir ResourceFileName.IncludedTextFileName. Kullanmayın ResourceManager.GetStringdize özelliğinin get fonksiyonlu zaten yapmıştım beri.

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

Bu, gömülü kaynak dosyalarını geçerli dosyadan okumak için çok uygun bulabileceğiniz bir sınıftır 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

Winform'larda sabit kodlu bir dosyanın metnini hızla isteyen tüm insanlar için;

  1. Çözüm gezgininde> Kaynaklar> Dosyanızı ekleyin uygulamasına sağ tıklayın.
  2. Üzerine tıklayın ve özellikler sekmesinde "Dosya Tipi" ni "Metin" olarak ayarlayın.
  3. Programınızda sadece Resources.<name of resource>.toString();dosyayı okumak için yapın.

Bunu en iyi uygulama veya herhangi bir şey olarak tavsiye etmem, ancak hızlı bir şekilde çalışır ve yapılması gerekenleri yapar.


0

VB.Net kullanan kullanıcılar için

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

MyApplicationNameuygulamamın ad alanı nerede . Derleme adı değil. Bu ad, projenin özelliklerinde tanımlanır (Uygulama sekmesi).

Doğru kaynak adını bulamazsanız, GetManifestResourceNames()işlevi kullanabilirsiniz

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

veya

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

veya

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

-1

Form Yükleme Olayında Gömülü TXT DOSYASI'nı okuyun.

Değişkenleri Dinamik Olarak Ayarlayın.

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

Bir Try Catch arayın.

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

IncludeText () için Void Oluştur, Visual Studio Bunu sizin için yapar. CodeBlock'u Otomatik Oluşturmak için Ampul'ü tıklatın.

Aşağıdakileri Oluşturulan Kod Bloğu'nun içine koyun

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

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

Kaynak 3

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

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

Döndürülen değişkeni başka bir yere göndermek istiyorsanız, başka bir işlevi çağırmanız ve ...

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

}

Bu, tek bir zengin metin kutusunun içinde birden fazla txt dosyasını birleştirmek ve gömülü verilerini okumak için bir yöntemdi. Bu Kod örneğiyle istediğim etkiydi.

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.