Как читать текстовый файл в корневом каталоге проекта?

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

Итак, я пытался:

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

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

Спасибо

Ответ 1

Из Обозревателя решений щелкните правой кнопкой мыши файл myfile.txt и выберите "Свойства"

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

enter image description here

Ответ 2

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

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

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

AppDomain.CurrentDomain.BaseDirectory

Ответ 3

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

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

Ответ 4

Вы можете встроить его (build action set to 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);
    }
}

(Некоторый код, взятый из этого Charles)

Ответ 5

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", поэтому просто присоедините конечный путь к файлуName, например:

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

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

Ответ 6

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