Как прочитать текстовый файл в корневом каталоге проекта? - PullRequest
82 голосов
/ 20 июня 2011

Я хочу прочитать первую строку текстового файла, который я добавил в корневой каталог моего проекта. Это означает, что мой обозреватель решений показывает файл .txt рядом с моими файлами .cs в моем проекте.

Итак, я попытался сделать:

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

Но это не работает, так как это относится к папке с мусорными ведрами, а моего файла там нет ... Как я могу заставить эту работу работать? : /

Спасибо

Ответы [ 6 ]

122 голосов
/ 20 июня 2011

В обозревателе решений щелкните правой кнопкой мыши файл myfile.txt и выберите «Свойства».

Оттуда установите Build Action на content и Copy to Output Directory на Copy always или Copy if newer

enter image description here

33 голосов
/ 20 июня 2011

Вы можете использовать следующее для получения корневого каталога проекта веб-сайта:

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

Или вы можете получить базовый каталог следующим образом:

AppDomain.CurrentDomain.BaseDirectory
29 голосов
/ 21 июня 2011

Добавьте файл ресурсов в ваш проект (щелкните правой кнопкой мыши Project-> Properties-> Resources). Там, где написано «строки», вы можете переключиться на «файлы». Выберите «Добавить ресурс» и выберите свой файл.

Теперь вы можете ссылаться на ваш файл через коллекцию Properties.Resources.

12 голосов
/ 19 февраля 2016
private string _filePath = Path.GetDirectoryName(System.AppDomain.CurrentDomain.BaseDirectory);

Метод выше принесет вам что-то вроде этого:

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

Отсюда вы можете перемещаться назад, используя System.IO.Directory.GetParent:

_filePath = Directory.GetParent(_filePath).FullName;

1 раз вы попадете в \ bin, 2 раза - в \ myProjectNamespace, поэтому это будет выглядеть так:

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

Что ж, теперь у вас есть что-то вроде "C: \ Users \ myuser \ Documents \ Visual Studio 2015 \ Projects \ myProjectNamespace", поэтому просто присоедините окончательный путь к вашему fileName, например:

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

Надеюсь, это поможет.

11 голосов
/ 21 июня 2011

Вы также можете встроить его (действие сборки установить на Resource), вот как получить его оттуда:

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

(часть кода взята из thisответ по Чарльз )

3 голосов
/ 20 июня 2011

В этом случае вы должны использовать абсолютный путь.Но если вы установите CopyToOutputDirectory = CopyAlways, он будет работать так же, как вы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...