Чтение файлов из папки, присутствующей в проекте


87

У меня есть проект C # (консольное приложение Windows). Я создал папку с именем Data внутри проекта. Внутри папки Data находятся два текстовых файла.

Как прочитать текстовые файлы из папки «Данные». Я пробовал вещи ниже.

string[] files = File.ReadAllLines(@"Data\Names.txt")

Ошибка в том, что файл не найден.

Я проверил несколько опубликованных ранее ответов Stackoverflow, и ни один из них не работает для меня.

Как я могу продолжить? Благодарность!


1
Google "текущий каталог". Исполняемый файл не обязательно запускается из папки исходного кода!
— Ондрей Тучни,

Вы копируете эту папку данных в выходной файл при сборке проекта? Проверьте параметры в файлах и исправьте их.
— ryadavilli 07

параметр всегда копировать в выходной каталог.
— SKJ

Ответы:


122

ниже код должен работать:

string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"Data\Names.txt");
string[] files = File.ReadAllLines(path);

Моя папка и файлы не существуют в папке сборки: s .. Почему?
— bohem.be

33
в Visual Studio отметьте файл, а затем установите Build Actionзначение Contentи Copy to Output DirectoryзначениеCopy always
— Флориан Мозер

3
Просто используйте @ "Data \ Name.txt" в нотации @FlorianMoser
— Александр Саркисян

для чего это '@'?
— gumuruh

@ Там называется дословное строковый литерал, см stackoverflow.com/questions/3311988/...
— Morbia

34

это зависит от того, где находится ваша папка с данными

Чтобы получить каталог, в котором находится файл .exe:

AppDomain.CurrentDomain.BaseDirectory

Чтобы получить текущий каталог:

Environment.CurrentDirectory

Затем вы можете объединить свой путь к каталогу ( @"\Data\Names.txt")


18

Если вам нужно получить все файлы в папке с именем «Data», просто закодируйте ее, как показано ниже.

string[] Documents = System.IO.Directory.GetFiles("../../Data/");

Теперь «Документы» представляют собой массив полного имени объекта из двух текстовых файлов в папке «Данные» «Данные».


@Bunyip: вам нужно читать содержимое текстового файла или просто знать файлы в папке?
— Утистран Сельварадж

13

У меня есть проект C # (консольное приложение Windows). Я создал папку «Изображения внутри проекта». Есть один файл ico под названием MyIcon.ico. Я получил доступ к MyIcon.ico внутри папки изображений, как показано ниже.

this.Icon = new Icon(@"../../Images/MyIcon.ico");

9

Копировать всегда в выходной каталог установлен, затем попробуйте следующее:

 Directory.SetCurrentDirectory(AppDomain.CurrentDomain.BaseDirectory);
 String Root = Directory.GetCurrentDirectory();

Это должен быть принятый ответ - он надежен независимо от того, находится ли файл в библиотеке или в исполняемом проекте.
— Tullochgorum

0

Для Xamarin.iOS вы можете использовать следующий код для получения содержимого файла, если файл существует.

var documents = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
var filename = Path.Combine(documents, "xyz.json");
if (File.Exists(filename))
{
var text =System.IO.File.ReadAllText(filename);
}

-1

Используйте этот код для чтения всех файлов в папке и подпапках.

class Program
{
    static void Main(string[] args)
    {

        getfiles get = new getfiles();
        List<string> files =  get.GetAllFiles(@"D:\Document");

        foreach(string f in files)
        {
            Console.WriteLine(f);
        }


        Console.Read();
    }


}

class getfiles
{
    public List<string> GetAllFiles(string sDirt)
    {
        List<string> files = new List<string>();

        try
        {
            foreach (string file in Directory.GetFiles(sDirt))
            {
                files.Add(file);
            }
            foreach (string fl in Directory.GetDirectories(sDirt))
            {
                files.AddRange(GetAllFiles(fl));
            }
        }
        catch (Exception ex)
        {

            Console.WriteLine(ex.Message);
        }



        return files;
    }
}

-1
string myFile= File.ReadAllLines(Application.StartupPath.ToString() + @"..\..\..\Data\myTxtFile.txt")

3
Пожалуйста, добавьте текст, подробно описывающий, почему это работает / что это делает
— Гибольт

1
Хотя это может ответить на вопрос авторов, в нем отсутствуют некоторые поясняющие слова и / или ссылки на документацию. Фрагменты необработанного кода не очень полезны без некоторых фраз. Вы также можете найти очень полезным, как написать хороший ответ . Пожалуйста, отредактируйте свой ответ - Из обзора
— Ник

-1

Используйте это, это работает.

string path = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"TestData\test.json");
var response = JsonConvert.DeserializeObject<Response>(File.ReadAllText(path));

Обратите внимание: вам необходимо убедиться, что вы установили свойства файла test.jsonкак

"Build Action" = "Content"

"Копировать в выходной каталог" = "Копировать всегда"


При ответе на старый вопрос ваш ответ был бы гораздо более полезным для других пользователей StackOverflow, если бы вы включили некоторый контекст, чтобы объяснить, как ваш ответ помогает, особенно для вопроса, на который уже есть принятый ответ. См .: Как написать хороший ответ .
— Дэвид Бак,

-2

Это было полезно для меня, если вы используете

var dir = Directory.GetCurrentDirectory()

заполнение пути выходит за пределы текущей папки, он будет включать этот путь \ bin \ debug. Я рекомендую вам использовать

string dir = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.Parent.FullName

затем распечатайте значение dir и убедитесь, что путь дает вам

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.