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

93

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

Итак, я попробовал сделать:

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

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

Благодарность

Foreyez
источник
Кстати, название StreamReader немного сбивает с толку, на мой взгляд, Microsoft должна была назвать этот TextStreamReader
Джордж Бирбилис

Ответы:

141

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

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

введите описание изображения здесь

dance2die
источник
2
Я бы предпочел, чтобы этот файл не был доступен моим пользователям ... есть ли способ встроить его в dll и прочитать оттуда?
foreyez
3
@foreyez Добавьте строку в свой проект в качестве ресурса, возможно, вместо использования файла. Обратите внимание, что данные не будут недоступны - насколько конфиденциальны данные, содержащиеся в этом файле?
Dan J
5
Установите для параметра сборки значение Embedded Resourceи прочтите статью о том, как читать расширенный ресурс blogs.msdn.com/b/nikola/archive/2008/05/14/…
dance2die
Если я создаю настройку для проекта, я не могу работать с собственностью. есть ли другое решение для этого?
Нил Бхасин
35

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

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

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

AppDomain.CurrentDomain.BaseDirectory
Мангеш Пимпалкар
источник
32

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

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

Итан Кабиак
источник
15
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", поэтому просто прикрепите окончательный путь к вашему имени файла, например:

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

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

Бруно Карвалью
источник
Спасибо, но можно _filePath = Path.Combine (_filePath, "myfile.txt"); // стильно :)
FreeClimb
14

Вы также можете встроить его (установить действие сборки 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 )

HB
источник
3

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

Шухель Ахмед
источник
0

В этом коде вы получаете доступ к rootпроекту каталога:

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

тогда:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))
Mojtaba Nava
источник