Как читать существующие текстовые файлы без указания пути

В большинстве примеров показано, как читать текстовый файл из точного местоположения (например, "C:\Users\Owner\Documents\test1.txt" ). Но как читать текстовые файлы без ввода полного пути, поэтому мой код будет работать при копировании на другие компьютеры. С визуальной студией я добавил 2 текстовых файла для проекта (консольный проект) и не знаю, как лучше всего читать эти файлы. Надеюсь, я четко описал свою проблему. Возможно, мне нужно было добавить те файлы txt по-разному (например, непосредственно в ту же папку, что и файл .exe)?

Ответы

Ответ 1

Вы можете использовать Directory.GetCurrentDirectory:

var path = Path.Combine(Directory.GetCurrentDirectory(), "\\fileName.txt");

Что будет искать файл fileName.txt в текущем каталоге приложения.

Ответ 2

Если ваше приложение является веб-сервисом, Directory.CurrentDirectory не работает.

Используйте System.IO.Path.Combine(System.AppDomain.CurrentDomain.BaseDirectory.ToString(), "yourFileName.txt")) вместо этого.

Ответ 3

Когда вы предоставляете путь, он может быть абсолютным/корневым или относительным. Если вы предоставите относительный путь, он будет разрешен, запустив рабочий каталог запущенного процесса.

Пример:

string text = File.ReadAllText("Some\\Path.txt"); // relative path

Вышеуказанный код имеет тот же эффект, что и:

string text = File.ReadAllText(
    Path.Combine(Environment.CurrentDirectory, "Some\\Path.txt"));

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

Ответ 4

Вам нужно решить, в какой директории вы хотите, чтобы файл был относительно. Когда вы это сделаете, вы создадите полный путь следующим образом:

string fullPathToFile = Path.Combine(dir, fileName);

Если вы не предоставите базовый каталог dir, тогда вы окажетесь в полной милости к тому, что происходит с рабочим каталогом вашего процесса. Это то, что может быть вне вашего контроля. Например, ярлыки для вашего приложения могут указать его. Использование диалогов файлов может изменить его.

Для консольного приложения разумно использовать относительные файлы напрямую, потому что консольные приложения сконструированы так, что рабочий каталог является критическим вводом и является четко определенной частью среды выполнения. Однако для приложения с графическим интерфейсом это не так, поэтому я рекомендую вам явно преобразовать ваше относительное имя файла в полный абсолютный путь, используя какой-то определенный базовый каталог.

Теперь, поскольку у вас есть консольное приложение, вам разумно использовать относительный путь, при условии, что ожидание заключается в том, что указанные файлы будут находиться в рабочем каталоге. Но это было бы очень часто, потому что это не так. Обычно рабочий каталог используется для указания, где должны храниться файлы ввода и вывода пользователя. Обычно это не указывает на место, где находятся файлы программы.

Один из последних вариантов заключается в том, что вы не пытаетесь развернуть эти программные файлы как внешние текстовые файлы. Возможно, лучший вариант - связать их с исполняемым файлом как ресурсами. Таким образом, они связаны с исполняемым файлом, и вы можете полностью обойти эту проблему.

Ответ 5

Как ваш проект представляет собой консольный проект, вы можете передать путь к текстовым файлам, которые вы хотите прочитать через строку [] args

static void Main(string[] args)
{
}

Внутри Main вы можете проверить, переданы ли аргументы

if (args.Length == 0){ System.Console.WriteLine("Please enter a parameter");}

Извлечь аргумент

string fileToRead = args[0];

Почти все языки поддерживают концепцию передачи аргументов и используют аналогичные шаблоны для С#.

Подробнее о С# см. http://msdn.microsoft.com/en-us/library/vstudio/cb20e19t.aspx

Ответ 6

Это загрузит файл в рабочий каталог:

        static void Main(string[] args)
        {
            string fileName = System.IO.Path.GetFullPath(Directory.GetCurrentDirectory() + @"\Yourfile.txt");

            Console.WriteLine("Your file content is:");
            using (StreamReader sr = File.OpenText(fileName))
            {
                string s = "";
                while ((s = sr.ReadLine()) != null)
                {
                    Console.WriteLine(s);
                }
            }

            Console.ReadKey();
        }

Если вы используете консоль, вы также можете сделать это. Он предложит пользователю написать путь к файлу (включая имя файла с расширением).

        static void Main(string[] args)
        {

            Console.WriteLine("****please enter path to your file****");
            Console.Write("Path: ");
            string pth = Console.ReadLine();
            Console.WriteLine();
            Console.WriteLine("Your file content is:");
            using (StreamReader sr = File.OpenText(pth))
            {
                string s = "";
                while ((s = sr.ReadLine()) != null)
                {
                    Console.WriteLine(s);
                }
            }

            Console.ReadKey();
        }

Если вы используете winforms, например, попробуйте этот простой пример:

        private void button1_Click(object sender, EventArgs e)
        {
            string pth = "";
            OpenFileDialog ofd = new OpenFileDialog();

            if (ofd.ShowDialog() == DialogResult.OK)
            {
                pth = ofd.FileName;
                textBox1.Text = File.ReadAllText(pth);
            }
        }

Ответ 7

Существует много способов получить путь. См. CurrentDirrectory. Кроме того, вы можете получить полное имя файла своего приложения, используя   Assembly.GetExecutingAssembly() Местоположение. а затем используйте класс Path для получения имени каталога.

Ответ 8

Вам абсолютно необходимо знать, где можно найти файлы для чтения. Однако эта информация может быть относительной, конечно, поэтому она может быть хорошо адаптирована к другим системам.

Таким образом, он может относиться к текущему каталогу (получить его от Directory.GetCurrentDirectory()) или к исполняемому пути приложения (например, Application.ExecutablePath приходит в голову при использовании Windows Forms или через Assembly.GetEntryAssembly().Location) или в какой-то специальный каталог Windows например "Документы и настройки" (вы должны использовать Environment.GetFolderPath() с одним элементом перечисления Environment.SpecialFolder).

Обратите внимание, что "текущий каталог" и путь исполняемого файла необязательно идентичны. Вы должны знать, где искать!

В любом случае, если вам нужно манипулировать путем, используйте класс Path для разделения или объединения частей пути.