Jak czytać plik tekstowy w katalogu głównym projektu?


93

Chcę przeczytać pierwszą linię pliku tekstowego, który dodałem do katalogu głównego mojego projektu. Oznacza to, że mój eksplorator rozwiązań wyświetla plik .txt obok moich plików .cs w moim projekcie.

Więc próbowałem zrobić:

TextReader tr = new StreamReader(@"myfile.txt");
string myText = tr.ReadLine();

Ale to nie działa, ponieważ odnosi się do folderu Bin, a mojego pliku tam nie ma ... Jak mogę to zrobić? : /

Dzięki


btw, nazwa StreamReader jest trochę myląca, Microsoft powinien był nazwać to TextStreamReader moim zdaniem
George Birbilis

Odpowiedzi:


141

W Eksploratorze rozwiązań kliknij prawym przyciskiem myszy plik myfile.txt i wybierz „Właściwości”

Stamtąd ustaw Build Actionto content i Copy to Output Directoryna albo Copy alwayslubCopy if newer

wprowadź opis obrazu tutaj


2
Wolałbym, aby ten plik nie był widoczny dla moich użytkowników ... czy istnieje sposób, aby osadzić go w dll i stamtąd go odczytać?
foreyez

3
@foreyez Dodaj ciąg do swojego projektu jako zasób, na przykład zamiast używać pliku. Pamiętaj, że dane nie będą niedostępne - Jak wrażliwe są dane zawarte w tym pliku?
Dan J

5
Ustaw opcję kompilacji Embedded Resourcei przeczytaj artykuł o tym, jak czytać zasoby emebedded blogs.msdn.com/b/nikola/archive/2008/05/14/…
dance2die

jeśli utworzę konfigurację dla projektu, nie będę w stanie pracować z właściwościami. czy jest na to inne rozwiązanie?
Neel Bhasin

35

Aby uzyskać katalog główny projektu witryny sieci Web, możesz użyć następujących elementów:

String FilePath;
FilePath = Server.MapPath("/MyWebSite");

Lub możesz pobrać katalog podstawowy w następujący sposób:

AppDomain.CurrentDomain.BaseDirectory

32

Dodaj plik zasobów do projektu (kliknij prawym przyciskiem myszy projekt-> Właściwości-> zasoby). Tam, gdzie jest napisane „ciągi znaków”, możesz przełączyć się na „pliki”. Wybierz „Dodaj zasób” i wybierz plik.

Możesz teraz odwoływać się do pliku w Properties.Resourceskolekcji.


15
private string _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);

Powyższa metoda przyniesie Ci coś takiego:

"C:\Users\myuser\Documents\Visual Studio 2015\Projects\myProjectNamespace\bin\Debug"

Stąd możesz nawigować wstecz za pomocą System.IO.Directory.GetParent:

_filePath = Directory.GetParent(_filePath).FullName;

1 raz przeniesie Cię do \ bin, 2 razy do \ myProjectNamespace, więc wyglądałoby to tak:

_filePath = Directory.GetParent(Directory.GetParent(_filePath).FullName).FullName;

Cóż, teraz masz coś takiego jak „C: \ Users \ myuser \ Documents \ Visual Studio 2015 \ Projects \ myProjectNamespace”, więc po prostu dołącz ostateczną ścieżkę do nazwy pliku, na przykład:

_filePath += @"\myfile.txt";
TextReader tr = new StreamReader(_filePath);

Mam nadzieję, że to pomoże.


Dzięki, ale możesz _filePath = Path.Combine (_filePath, "myfile.txt"); // stylowo :)
FreeClimb

14

Możesz go również osadzić (ustawić akcję kompilacji na Resource), oto jak go stamtąd pobrać:

private static UnmanagedMemoryStream GetResourceStream(string resName)
{
    var assembly = Assembly.GetExecutingAssembly();
    var strResources = assembly.GetName().Name + ".g.resources";
    var rStream = assembly.GetManifestResourceStream(strResources);
    var resourceReader = new ResourceReader(rStream);
    var items = resourceReader.OfType<DictionaryEntry>();
    var stream = items.First(x => (x.Key as string) == resName.ToLower()).Value;
    return (UnmanagedMemoryStream)stream;
}

private void Button1_Click(object sender, RoutedEventArgs e)
{
    string resName = "Test.txt";
    var file = GetResourceStream(resName);
    using (var reader = new StreamReader(file))
    {
        var line = reader.ReadLine();
        MessageBox.Show(line);
    }
}

(Niektóre kodu pochodzą z tej odpowiedzi przez Charles )


3

W tym przypadku musisz użyć ścieżki bezwzględnej. Ale jeśli ustawisz CopyToOutputDirectory = CopyAlways, będzie działać tak, jak to robisz.


0

W tym kodzie masz dostęp do rootprojektu katalogu:

 string _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);

następnie:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.