Як прочитати текстовий файл у кореневому каталозі проекту?


92

Я хочу прочитати перший рядок текстового файлу, який я додав до кореневого каталогу свого проекту. Це означає, що мій провідник рішень показує файл .txt уздовж моїх файлів .cs у моєму проекті.

Отже, я спробував зробити:

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

Але це не працює, оскільки йдеться про папку кошика, а мого файлу там немає ... Як я можу зробити цю роботу? : /

Дякую


До речі, ім'я StreamReader трохи заплутане, Microsoft, на мій погляд, повинен був назвати цей TextStreamReader
Джордж Бірбіліс,

Відповіді:


140

У Провіднику рішень клацніть правою кнопкою миші на myfile.txt і виберіть "Властивості"

Звідти, встановити Build Actionв content і Copy to Output Directoryабо Copy alwaysабоCopy if newer

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


2
Я волів би не надавати цей файл своїм користувачам ... чи є спосіб вбудувати його в dll і прочитати звідти?
foreyez

3
@foreyez Додайте рядок до свого проекту як ресурс, замість того, щоб використовувати файл. Зверніть увагу, що дані не будуть недоступними - Наскільки чутливими є дані, що містяться у цьому файлі?
Dan J

5
Встановіть параметр побудови Embedded Resourceта прочитайте статтю про те, як читати emebedded ресурс blogs.msdn.com/b/nikola/archive/2008/05/14/…
dance2die

якщо я створюю налаштування для проекту, то я не можу працювати з майном. чи є якесь інше рішення для цього?
Neel Bhasin

35

Ви можете використовувати наступне, щоб отримати кореневий каталог проекту веб-сайту:

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

Або ви можете отримати базовий каталог приблизно так:

AppDomain.CurrentDomain.BaseDirectory

32

Додайте файл ресурсу до свого проекту (клацніть правою кнопкою миші проект-> Властивості-> Ресурси). Там, де написано "рядки", ви можете перейти на "файли". Виберіть "Додати ресурс" і виберіть файл.

Тепер ви можете посилатися на свій файл через 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 )


3

У цьому випадку потрібно використовувати абсолютний шлях. Але якщо ви встановите значення CopyToOutputDirectory = CopyAlways, воно буде працювати, як і ви.


0

У цьому коді ви отримуєте доступ до rootпроекту каталогу:

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

тоді:

StreamReader r = new StreamReader(_filePath + "/cities2.json"))
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.