Jak osadzić plik tekstowy w zestawie .NET?

118

Chciałbym osadzić plik tekstowy w zespole, aby móc załadować tekst bez konieczności czytania go z dysku i aby wszystko, czego potrzebuję, było zawarte w exe. (Aby był bardziej przenośny)

Czy jest na to sposób? Zakładam coś z plikami zasobów?

A jeśli możesz, jak to robisz i jak programujesz załadować tekst do łańcucha?

Adam Haile
źródło

Odpowiedzi:

147

Kliknij prawym przyciskiem myszy plik projektu, wybierz Właściwości.

W oknie, które zostanie otwarte, przejdź do zakładki Zasoby i jeśli ma tylko niebieskie łącze na środku strony zakładki, kliknij je, aby utworzyć nowy zasób.

wprowadź opis obrazu tutaj

Następnie z paska narzędzi nad zakładką wybierz, aby dodać nowy plik tekstowy, nadaj mu nazwę, zostanie dodany do twojego projektu i otwarty.

Jeśli zajdziesz tak daleko, możesz w swoim kodzie wpisać Resources.TheNameYouGaveTheTextFileHere i uzyskać dostęp do jego zawartości. Zwróć uwagę, że gdy po raz pierwszy używasz klasy Resources w klasie, musisz dodać dyrektywę using (naciśnij Ctrl +. Po wpisaniu Resources, aby wyświetlić menu, w którym VS zrobi to za Ciebie).

Jeśli coś było niejasne w powyższym opisie, zostaw komentarz, a będę go edytować, dopóki nie będzie kompletny lub będzie miał sens :)

Lasse V. Karlsen
źródło
1
Jak wyglądałby kod dyrektywy „using”, staram się, aby to zadziałało. Dodałem solutions.txt jako zasób, ale nie mogę znaleźć Resources.solutions - czuję, że brakuje mi dyrektywy using.
Spedge
3
Ah-hah, wszystko, co musiałem zrobić, to dodać My. do przodu (czyli My.Resources.solutions) Simples!
Spedge
2
Dodawanie zasobów generuje i zawiera Properties\Resources.Designer.cssię namespace YourProjectRootNamespace.Properties, więc trzeba korzystać YourProjectRootNamespace.Properties. ProjectRootNamespacejest zdefiniowana we właściwościach projektu w VisualStudio.
ilyaigpetrov
1
Jeśli dodam plik tekstowy w ten sposób i powiem, że plik tekstowy jest częścią mojego rozwiązania ... jeśli ten plik zostanie zaktualizowany i przebuduję zestaw, czy osadzony zasób również zostanie zaktualizowany? A może będę musiał ręcznie usunąć / ponownie dodać plik, jeśli kiedykolwiek go zmienię?
Peter Tirrell
3
Pliki są pakowane do zasobów w czasie kompilacji, a nie podczas ich dodawania. Możesz dowolnie zmieniać plik w dowolnym narzędziu i przebudowywać, zmiany będą częścią twojego zespołu.
Lasse V. Karlsen
38

W programie Visual Studio 2003, Visual Studio 2005 i prawdopodobnie we wcześniejszych wersjach (działa to również w 2008 r.) Możesz dołączyć plik tekstowy do projektu, a następnie w panelu „Właściwości” ustawić akcję na „Zasób osadzony”. Następnie możesz uzyskać dostęp do pliku jako strumienia za pomocą Assembly.GetManifestResourceStream(string).

Inne odpowiedzi są tutaj wygodniejsze. Uwzględniam to dla kompletności.

Zwróć uwagę, że to podejście będzie działać w przypadku osadzania innych typów plików, takich jak obrazy, ikony, dźwięki itp.

Drew Noakes
źródło
8
Uwaga: Użyj przestrzeni nazw + nazwa pliku jako parametru dla GetManifestResourceStream (), np. „MyNamespace.MyTextfile.txt”. Możesz również wywołać GetManifestResourceNames (), aby uzyskać listę wszystkich nazw.
Stiefel
32

Po umieszczeniu pliku tekstowego użyj tego pliku w dowolnym miejscu w kodzie, takim jak ten ...

global::packageName.Properties.Resources.ThatFileName
Narottam Goyal
źródło
3
Jest to znacznie lepsze podejście, ponieważ spowoduje zgłoszenie błędu kompilatora, jeśli zasób zostanie usunięty. Eliminuje również literówki. Dzięki za post.
Ben Gripka,
+5. Czy mogę zapisać go z powrotem do pliku na poziomie C # DLL?
Prajwal Bhat,
1
A jeśli chcę określić ThatFileNameze zmiennej?
c00000fd
4

Tak, masz rację - utwórz plik zasobów. Gdy to zrobisz, nie musisz "ładować" ciągu, będzie on przywoływany jako Resource.WhthingStringYouDefined.

Otávio Décio
źródło
2

Oto, co zadziałało dla mnie. (Musiałem odczytać zawartość pliku osadzonego w wykonywalnym pliku obrazu .NET).

Zanim cokolwiek zrobisz, dołącz plik do rozwiązania w programie Visual Studio. (W moim przypadku Społeczność VS 2017). Przełączyłem się do folderu, a Solution Explorernastępnie kliknąłem prawym przyciskiem myszy Properties, wybrałem Add Existing Itemi wybrałem plik. (Powiedz,. FileName.txt) Następnie będąc nadal w Solution Explorer, kliknij prawym przyciskiem myszy dołączony plik, wybierz Propertiesi wybierz Build Actionjako Embedded Resource.

Następnie użyj tego kodu, aby odczytać jego bajty:

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

Zauważ, że w tym przypadku nie musisz dodawać tego pliku jako zasobu, jak zaproponowano w zaakceptowanej odpowiedzi .

c00000fd
źródło
1

Oto co zrobiłem:

  1. Dodano moje pliki (zasoby) w programie Visual Studio, klikając prawym przyciskiem myszy projekt.
  2. Kliknij prawym przyciskiem myszy każdy dodany plik i zmień „Typ kompilacji” na Zasoby osadzone.
  3. Aby uzyskać dostęp do zasobu:

    za. Otrzymałem bieżący zestaw przy użyciu funkcji:GetExecutingAssembly()

    b. Zasób, który dodałem, był plikiem tekstowym, więc wczytułem go do strumienia za pomocą GetManifestResourceStream(fileName). Sposób, w jaki uzyskałem dostęp do nazw plików, to dzwonienieGetManifestResourceNames()

    do. Teraz użyj StreamReader()klasy, aby wczytać do końca pliku zmienną, jeśli tego chcesz.

Pavan
źródło
0

Dodając do odpowiedzi Pavana, aby uzyskać bieżący montaż (w sekcji ogólnej):

Assembly _assembly;

GetManifestResourceStream (fileName) (w kodzie, gdzie wymagany jest odczyt z zasobu):

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