Jak czytać osadzony plik tekstowy zasobu

694

Jak odczytać osadzony zasób (plik tekstowy), używając go StreamReaderi zwracając jako ciąg? Mój obecny skrypt używa formularza Windows i pola tekstowego, które pozwalają użytkownikowi znaleźć i zamienić tekst w pliku tekstowym, który nie jest osadzony.

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();
}
Me.Close
źródło

Odpowiedzi:

1197

Możesz użyć Assembly.GetManifestResourceStreammetody :

  1. Dodaj następujące zastosowania

    using System.IO;
    using System.Reflection;
  2. Ustaw właściwość odpowiedniego pliku:
    parametr Build Actionz wartościąEmbedded Resource

  3. Użyj następującego kodu

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

    resourceNameto nazwa jednego z zasobów osadzonych w assembly. Na przykład, jeśli osadzisz plik tekstowy o nazwie "MyFile.txt"umieszczony w katalogu głównym projektu z domyślną przestrzenią nazw "MyCompany.MyProduct", wówczas resourceNamejest "MyCompany.MyProduct.MyFile.txt". Możesz uzyskać listę wszystkich zasobów w zestawie za pomocą Assembly.GetManifestResourceNamesmetody .


Nie ma wątpliwości, że można uzyskać tylko resourceNamez nazwy pliku (pomijając przestrzeń nazw):

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

Kompletny przykład:

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
źródło
5
@ Me.Close: spójrz, Environment.SpecialFolderaby uzyskać folder na pulpicie. Należy pamiętać, że zasób będzie miał przestrzeń nazw na podstawie ścieżki w projekcie, więc jego nazwa może nie być sprawiedliwa file1.txt.
adrianbanks
15
Argument dla GetManifestResourceStreamwymaga ścieżki, jak wskazuje @adrian. Jeśli to pomoże nikomu, że ścieżka jest jak co @SimpleCoder wystawach w przykładzie: MyNamespace.Filename.Ext. Wcześniej próbowałem, MyNamespace.Resources.Filename.Extale to kończy się na zero.
JYelton
61
Jeśli Twój zasób nie znajduje się bezpośrednio w katalogu głównym projektu, ale w jakimś podfolderze, nie zapomnij również umieścić tej nazwy folderu w nazwa_zasobu (np. „MyProjectNameSpace.MyProjectSubFolder.FileName.FileExtention”)
Sasha
19
Warto powiedzieć, że zasób „Kompilacja działania” musi być ustawiony jako „Zasób osadzony”
Illidan
7
Jeden ważny punkt, który nie został tutaj omówiony. Jeśli zapisałeś plik jako alternatywny typ kodowania, aby poradzić sobie z nieparzystymi znakami (w moim przypadku UTF8), możesz odzyskać pusty plik podczas czytania strumienia. Napraw to, określając typ kodowania w konstruktorze czytnika strumienia:using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
Kinetic
140

Możesz dodać plik jako zasób, używając dwóch osobnych metod.

Kod C # wymagany do uzyskania dostępu do pliku jest inny , w zależności od metody użytej do dodania pliku w pierwszej kolejności.

Metoda 1: Dodaj istniejący plik, ustaw właściwość na Embedded Resource

Dodaj plik do projektu, a następnie ustaw typ na Embedded Resource.

UWAGA: Jeśli dodasz plik za pomocą tej metody, możesz użyć go, GetManifestResourceStreamaby uzyskać do niego dostęp (patrz odpowiedź z @dtb ).

wprowadź opis zdjęcia tutaj

Metoda 2: Dodaj plik do Resources.resx

Otwórz Resources.resxplik, użyj menu rozwijanego, aby dodać plik, ustaw Access Modifierna public.

UWAGA: Jeśli dodasz plik za pomocą tej metody, możesz użyć go, Properties.Resourcesaby uzyskać do niego dostęp (patrz odpowiedź z @Night Walker ).

wprowadź opis zdjęcia tutaj

Contango
źródło
5
Trzecią metodą jest dodanie pliku do projektu, a następnie ustawienie „Kopiuj do katalogu wyjściowego” na „Prawda”. Podczas kompilacji plik jest kopiowany do katalogu wyjściowego i można go odczytać w zwykły sposób. Przykład: w aplikacji WPF, gdy chcesz wyświetlić obraz.
Contango,
więc ustawienie działania kompilacji na Resourcenic nie pozwala na odczytanie elementu jako zasobu? musisz użyć EmbeddedResourcelub dodać do Resources.resxpliku?
Masłów
3
@Maslow Ustawienie działania kompilacji na „Zasób” tworzy połączony zasób, a ustawienie akcji kompilacji na „Osadzony zasób” kompiluje zasób do zestawu wyjściowego. Termin „połączony zasób” jest wymyślnym terminem na „skopiuj plik do katalogu wyjściowego podczas kompilacji” (możesz następnie odczytać plik w czasie wykonywania przy użyciu dowolnej normalnej metody). Aby uzyskać więcej informacji na temat różnicy między tymi dwoma typami, zobacz Dodawanie i edycja zasobów (Visual C #) pod adresem msdn.microsoft.com/en-us/library/7k989cfy(v=vs.90).aspx .
Contango
Jeśli chcesz korzystać z zasobów w ten sposób, ale dynamicznie, tylko zamiast tego: Properties.Resources.Your_resource_name napisać to: Properties.Resources.ResourceManager.GetObject("Your_resource_name").
Lkor
86

Zasadniczo służy System.Reflectiondo uzyskania odniesienia do bieżącego zestawu. Następnie używasz GetManifestResourceStream().

Przykład ze strony, którą opublikowałem:

Uwaga : należy dodać, using System.Reflection;aby to działało

   Assembly _assembly;
   StreamReader _textStreamReader;

   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }
Chris Laplante
źródło
32
+1 Za włączenie namespacejako części nazwy zasobu
Kirk Broadhurst
41
var auxList= System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); Ta metoda może być bardzo przydatna, gdy chcesz poznać dokładną nazwę zasobu. (Zaczerpnięte z pytania stackoverflow.com/questions/27757/… )
Oscar Foley,
69

W programie Visual Studio możesz bezpośrednio osadzić dostęp do zasobu pliku za pomocą karty Zasoby we właściwościach projektu (w tym przykładzie „Analytics”). zrzut ekranu ze studia wizualnego - karta Zasoby

Do pliku wynikowego można następnie uzyskać dostęp jako tablicę bajtów

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

Jeśli potrzebujesz go jako strumienia, to (od https://stackoverflow.com/a/4736185/432976 )

Stream stream = new MemoryStream(jsonSecrets)
Andrew Hill
źródło
11
Możesz także użyć tego z plikiem tekstowym, w którym to przypadku miałbyś: string jsonSecrets = YourNameSpace.Properties.Resources.YourFileName;
ouflak
30

Po dodaniu pliku do zasobów powinieneś wybrać jego modyfikatory dostępu jako publiczne, niż możesz zrobić coś takiego.

byte[] clistAsByteArray = Properties.Resources.CLIST01;

CLIST01 to nazwa osadzonego pliku.

W rzeczywistości możesz przejść do resources.Designer.cs i zobaczyć, jak nazywa się getter.

Night Walker
źródło
5
Czy mógłbyś wyjaśnić to więcej? Kiedy klikam prawym przyciskiem myszy-> właściwości pliku w eksploratorze rozwiązań, a następnie ustawiam Actionopcję Incorporated ressource, nie mam żadnego Access Modifierspola w panelu właściwości. Ponadto nie mam Propersites.Resourcesklasy, pojawia się The name 'Properties' does not exist in the current contextbłąd podczas kompilowania kodu.
Suzanne Dupéron
2
Działa to tylko wtedy, gdy osadzisz plik Resources.resx, zobacz moją odpowiedź na temat różnych metod osadzania plików w projekcie.
Contango
13

dodanie np. Testfile.sql Menu projektu -> Właściwości -> Zasoby -> Dodaj istniejący plik

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

wprowadź opis zdjęcia tutaj

miciry89
źródło
2
Zwróci
12

Wiem, że to stary wątek, ale to działało dla mnie:

  1. dodaj plik tekstowy do zasobów projektu
  2. ustaw modyfikator dostępu na publiczny, jak pokazał powyżej Andrew Hill
  3. przeczytaj tekst w ten sposób:

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

Tekst, który dodałem do zasobów: „SomeText.txt”

S_Teo
źródło
8

Możesz także użyć tej uproszczonej wersji odpowiedzi @ dtb:

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
źródło
jesteś pewien? zgodnie z tym linkiem wygląda na to, że jestem .... stackoverflow.com/questions/1065168/…
Timmerz
8

Nauczyłem się teraz, że w twoim pliku nie może znajdować się „.” (kropka) w nazwie pliku.

„”.  w nazwie pliku nie jest dobra.

Templates.plainEmailBodyTemplate-en.txt -> Działa !!!
Templates.plainEmailBodyTemplate.en.txt -> nie działa za pośrednictwem GetManifestResourceStream ()

Prawdopodobnie dlatego, że ramy są mylone w przestrzeniach nazw i nazwach plików ...

Peter Gfader
źródło
3
Przepraszam. To jest źle. Kropki działają. (przynajmniej mi się udało, NET4.5) Nie wiem, dlaczego miałeś ten błąd.
Felix Keil,
Tak, działają, ale działają jako separator katalogów. Templates.plainEmailBodyTemplate.en.txt wyszuka zasoby „\ Templates \ plainEmailBodyTemplate \ en.txt”
Peter Gfader
Nie. Próbowałem. GetManifestResourceStream może uzyskać dostęp do zasobów osadzonych za pomocą więcej niż jednej kropki w nazwie pliku. (NET4.5)
Felix Keil
1
Miałem ten sam problem w .NET 4.5. Pliki z kropkami w nazwie nie zostały nawet dodane do kolekcji zasobów. Metoda assembly.GetManifestResourceNames () zwraca mi pustą listę. Później dowiedziałem się, że problem dotyczył tylko kodu języka. Plik ca.abcd.sk.crt nie został dodany do zasobów, natomiast plik ca.abcd.crt został dodany bez problemu.
a.farkas2508
1
Wciąż poprawne w 2020 roku. Bardzo dzięki za to, oszalałem z tego.
ZeRemz
8

Przez wszystkie twoje połączone moce używam tej klasy pomocniczej do czytania zasobów z dowolnego zestawu i dowolnej przestrzeni nazw w sposób ogólny.

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
źródło
3
plus jeden za kapitana planetę: P
Alok
4

Czytam użycie pliku tekstowego zasobu osadzonego:

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

Próba:

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

template.ForEach(ln =>
{
    Debug.WriteLine(ln);
});
Harveyt
źródło
3

Wiem, że to stare, ale chciałem tylko zwrócić uwagę na NETMF (.Net MicroFramework), możesz łatwo to zrobić:

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

Ponieważ NETMF nie maGetManifestResourceStream

dreamwork801
źródło
3

Po przeczytaniu wszystkich opublikowanych tutaj rozwiązań. Oto jak to rozwiązałem:

// 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
źródło
3

Odpowiedź jest dość prosta, po prostu zrób to, jeśli dodałeś plik bezpośrednio z pliku resources.resx.

string textInResourceFile = fileNameSpace.Properties.Resources.fileName;

Za pomocą tego wiersza kodu tekst z pliku jest bezpośrednio odczytywany z pliku i umieszczany w zmiennej string.

Jamisco
źródło
2

Byłem zirytowany, że musisz zawsze dołączać przestrzeń nazw i folder do ciągu. Chciałem uprościć dostęp do zasobów osadzonych. Właśnie dlatego napisałem tę małą klasę. Zachęcamy do korzystania i ulepszania!

Stosowanie:

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

Klasa:

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
źródło
1
A co z bardzo prostym rozwiązaniem: var resName = assembly.GetManifestResourceNames (). Gdzie (i => i.EndsWith (fileName)). FirstOrDefault (); Nie zadziała, jeśli umieścisz całe katalogi w asemblerze, ale poza tym jest to tylko jedna linia;)
Harry
@Harry, możesz to zrobić. Jak koreluje to z moją odpowiedzią? Czy chcesz ulepszyć metodę GetStream? Jak zatem radzisz sobie z dwuznacznością?
Felix Keil
1
@Estevez using System; using System.IO; using System.Linq; using System.Reflection;
Felix Keil,
2
Z jakiegoś powodu klasa nie działa po umieszczeniu w innym projekcie. Wywołanie i wykonanie zestawu odnosi się do zestawu z tą klasą, a nie do tego, który faktycznie wykonuje testy. Bez statycznej i leniwej inicjalizacji wszystko w porządku, tho.
Curly Brace
1
@ CurlyBrace Dziękujemy. Leniwa ocena jest prawdziwą wadą tej odpowiedzi, ponieważ zestawy wywołujące i wykonujące zmieniają się w zależności od kontekstu. Należy je rozwiązać przy każdym dostępie.
Felix Keil
2

Niektóre typy projektów VS .NET nie generują automatycznie pliku .NET (.resx). Poniższe kroki dodają plik zasobów do projektu:

  1. Kliknij prawym przyciskiem myszy węzeł projektu i wybierz Dodaj / Nowy element, przewiń do Plik zasobów. W polu Nazwa wybierz odpowiednią nazwę, na przykład Zasoby i kliknij przycisk Dodaj.
  2. Plik zasobów Resources.resx jest dodawany do projektu i może być postrzegany jako węzeł w eksploratorze rozwiązań.
  3. W rzeczywistości tworzone są dwa pliki, istnieje również automatycznie wygenerowana klasa C # Resources.Designer.cs. Nie edytuj go, jest obsługiwany przez VS. Plik zawiera klasę o nazwie Resources.

Teraz możesz dodać plik tekstowy jako zasób, na przykład plik xml:

  1. Kliknij dwukrotnie Resources.resx. Wybierz Dodaj zasób> Dodaj istniejący plik i przewiń do pliku, który chcesz dołączyć. Pozostaw wartość domyślną Wewnętrzna dla modyfikacji dostępu.
  2. Ikona reprezentuje nowy element zasobu. Jeśli wybrano, panel właściwości pokazuje swoje właściwości. Dla plików XML, we właściwości Kodowanie wybierz Unicode (UTF-8) - Strona kodowa 65001 zamiast domyślnej lokalnej strony kodowej. W przypadku innych plików tekstowych wybierz prawidłowe kodowanie tego pliku, na przykład stronę kodową 1252.
  3. W przypadku plików tekstowych, takich jak pliki xml, klasa Resourcesma właściwość typu stringnazwaną na podstawie dołączonego pliku. Jeśli nazwa pliku to np. RibbonManifest.xml, właściwość powinna mieć nazwę RibbonManifest. Dokładną nazwę znajdziesz w pliku kodu Resources.Designer.cs.
  4. Użyj właściwości String jak inne właściwości String, np string xml = Resources.RibbonManifest. Ogólna forma to ResourceFileName.IncludedTextFileName. Nie używaj, ResourceManager.GetStringponieważ funkcja get właściwości string już to zrobiła.
Dietrich Baumgarten
źródło
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
źródło
0

Jest to klasa, która może być bardzo przydatna do odczytu osadzonych plików zasobów z bieżącego 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
źródło
0

Dla wszystkich osób, które po prostu chcą szybko tekstu zakodowanego pliku w winforms;

  1. Kliknij aplikację prawym przyciskiem myszy w eksploratorze rozwiązań> Zasoby> Dodaj plik.
  2. Kliknij go, a na karcie właściwości ustaw „FileType” na „Text”.
  3. W swoim programie po prostu zrób to, Resources.<name of resource>.toString();aby odczytać plik.

Nie poleciłbym tego jako najlepszej praktyki ani niczego, ale działa szybko i robi to, co musi zrobić.

SwatDoge
źródło
0

Dla użytkowników korzystających z 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()

gdzie MyApplicationNamejest przestrzeń nazw mojej aplikacji. To nie jest nazwa zestawu. Ta nazwa jest zdefiniowana we właściwościach projektu (zakładka Aplikacja).

Jeśli nie znajdziesz poprawnej nazwy zasobu, możesz użyć GetManifestResourceNames()funkcji

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

lub

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

lub

Dim sNameList 
    = ass.GetManifestResourceNames()
        .Where(Function(x As String) x.EndsWith(".js"))
schlebe
źródło
-1

Czytaj osadzony plik TXT na zdarzeniu ładowania formularza.

Ustaw zmienne dynamicznie.

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

Zadzwoń do Try Catch.

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

Utwórz Void dla IncludeText (), Visual Studio Robi to za Ciebie. Kliknij żarówkę, aby automatycznie wygenerować kod.

Umieść następujące elementy w generowanym bloku kodu

Zasób 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 );
}

Zasób 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 );
}

Zasób 3

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

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

Jeśli chcesz wysłać zwróconą zmienną gdzie indziej, po prostu wywołaj inną funkcję i ...

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

}

Osiągnięto to dzięki metodzie łączenia wielu plików txt i odczytywania ich osadzonych danych w jednym bogatym polu tekstowym. co było moim pożądanym efektem w tej próbce kodu.

MasterCassidy
źródło