Использование Visual C# для чтения и записи в текстовый файл
В этой статье описано, как выполнить чтение и запись в текстовый файл с помощью Visual C#.
Оригинальная версия продукта: Visual Studio
Оригинальный номер базы знаний: 816149
Сводка
В разделе Чтение текстового файла этой статьи описывается, как использовать класс StreamReader для чтения текстового файла. В разделах Запись в текстовый файл (пример 1) и Запись в текстовый файл (пример 2) описывается, как использовать класс StreamWriter для записи текста в файл.
Чтение текстового файла
В следующем коде используется класс StreamReader для открытия, чтения и закрытия текстового файла. Можно передать путь к текстовому файлу в конструктор StreamReader для автоматического открытия файла. Метод ReadLine считывает каждую строку текста и перемещает указатель файла на следующую строку по мере чтения. Если метод ReadLine достигает конца файла, он возвращает пустую ссылку. Дополнительные сведения см. в разделе Класс StreamReader.
- Создайте пример текстового файла в Блокноте. Выполните приведенные ниже действия.
- Вставьте текст hello world в Блокнот.
- Сохраните файл как Sample.txt.
using System.IO;String line; try < //Pass the file path and file name to the StreamReader constructor StreamReader sr = new StreamReader("C:\\Sample.txt"); //Read the first line of text line = sr.ReadLine(); //Continue to read until you reach end of file while (line != null) < //write the line to console window Console.WriteLine(line); //Read the next line line = sr.ReadLine(); >//close the file sr.Close(); Console.ReadLine(); > catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finallyHello worldЗапись в текстовый файл (пример 1)
В следующем коде используется класс StreamWriter для открытия, записи и закрытия текстового файла. Аналогично тому, как используется класс StreamReader , можно передать путь к текстовому файлу в конструктор StreamWriter для автоматического открытия файла. Метод WriteLine записывает всю текстовую строку в текстовый файл.
- Запустите Visual Studio.
- В меню Файл выберите пункт Создать, а затем выберите Проект.
- Выберите Проекты Visual C# в разделе Типы проектов, а затем выберите Консольное приложение в разделе Шаблоны.
- Добавьте следующий код в начало файла Class1.cs:
using System.IO;try < //Pass the filepath and filename to the StreamWriter Constructor StreamWriter sw = new StreamWriter("C:\\Test.txt"); //Write a line of text sw.WriteLine("Hello World!!"); //Write a second line of text sw.WriteLine("From the StreamWriter class"); //Close the file sw.Close(); >catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finallyHello World!! From the StreamWriter classЗапись в текстовый файл (пример 2)
В следующем коде используется класс StreamWriter для открытия, записи и закрытия текстового файла. В отличие от предыдущего примера, этот код передает в конструктор два дополнительных параметра. Первый параметр — путь к файлу и имя файла. Второй параметр, true , указывает, что файл открыт в режиме добавления. Если вы задаете false для второго параметра, содержимое файла перезаписывается при каждом запуске кода. Третий параметр задает Unicode , чтобы кодирование файла в StreamWriter выполнялось в формате Юникода. Можно также указать следующие методы кодирования для третьего параметра:
Метод Write аналогичен методу WriteLine , за исключением того, что метод Write не вставляет автоматически сочетание символов возврата каретки или перевода строки (CR/LF). Это полезно, когда нужно одновременно записывать по одному символу.
- Запустите Visual Studio.
- В меню Файл выберите пункт Создать и затем пункт Проект.
- Нажмите Проекты Visual C# в разделе Типы проектов, а затем нажмите Консольное приложение в разделе Шаблоны.
- Добавьте следующий код в начало файла Class1.cs:
using System.IO; using System.Text;Int64 x; try < //Open the File StreamWriter sw = new StreamWriter("C:\\Test1.txt", true, Encoding.ASCII); //Write out the numbers 1 to 10 on the same line. for(x=0; x < 10; x++) < sw.Write(x); >//close the file sw.Close(); > catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finallyПолный код сборки для чтения текстового файла
//Read a Text File using System; using System.IO; namespace readwriteapp < class Class1 < [STAThread] static void Main(string[] args) < String line; try < //Pass the file path and file name to the StreamReader constructor StreamReader sr = new StreamReader("C:\\Sample.txt"); //Read the first line of text line = sr.ReadLine(); //Continue to read until you reach end of file while (line != null) < //write the line to console window Console.WriteLine(line); //Read the next line line = sr.ReadLine(); >//close the file sr.Close(); Console.ReadLine(); > catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finally < Console.WriteLine("Executing finally block."); >> > >Полный код сборки для записи в текстовый файл (версия 1)
//Write a text file - Version-1 using System; using System.IO; namespace readwriteapp < class Class1 < [STAThread] static void Main(string[] args) < try < //Pass the filepath and filename to the StreamWriter Constructor StreamWriter sw = new StreamWriter("C:\\Test.txt"); //Write a line of text sw.WriteLine("Hello World!!"); //Write a second line of text sw.WriteLine("From the StreamWriter class"); //Close the file sw.Close(); >catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finally < Console.WriteLine("Executing finally block."); >> > >Полный код сборки для записи в текстовый файл (версия 2)
//Write a text file - Version 2 using System; using System.IO; using System.Text; namespace readwriteapp < class Class1 < [STAThread] static void Main(string[] args) < Int64 x; try < //Open the File StreamWriter sw = new StreamWriter("C:\\Test1.txt", true, Encoding.ASCII); //Writeout the numbers 1 to 10 on the same line. for(x=0; x < 10; x++) < sw.Write(x); >//close the file sw.Close(); > catch(Exception e) < Console.WriteLine("Exception: " + e.Message); >finally < Console.WriteLine("Executing finally block."); >> > >Устранение неполадок
Перенос кода в блок try-catch-finally для обработки ошибок и исключений является хорошей практикой программирования, когда речь заходит о выполнении любых операций с файлом. В частности, может потребоваться освободить дескрипторы файла в окончательном блоке, чтобы файл не был заблокирован на неопределенный срок. Некоторые возможные ошибки включают файл, который не существует, или файл, который уже используется.
Обратная связь
Были ли сведения на этой странице полезными?
Как обратиться к файлу в Clion?
Проблема в том что среда Clion не «видит» файлы input.txt и output.txt.

Вот скрин дерева проекта.

Файл CMakeLists выглядит так :
После компиляции в строке результата написано
C:\Users\*****\.clion10\system\cmake\generated\884edb55\884edb55\Debug\untitled1.exeProcess finished with exit code 0
Собственно вопрос :
Как обратиться к файлу и где его надо хранить ?- Вопрос задан более трёх лет назад
- 5433 просмотра
Как обратиться к файлу в проекте c
Подобно паре Directory/DirectoryInfo для работы с файлами предназначена пара классов File и FileInfo . С их помощью мы можем создавать, удалять, перемещать файлы, получать их свойства и многое другое.
FileInfo
Некоторые полезные методы и свойства класса FileInfo :
- CopyTo(path) : копирует файл в новое место по указанному пути path
- Create() : создает файл
- Delete() : удаляет файл
- MoveTo(destFileName) : перемещает файл в новое место
- Свойство Directory : получает родительский каталог в виде объекта DirectoryInfo
- Свойство DirectoryName : получает полный путь к родительскому каталогу
- Свойство Exists : указывает, существует ли файл
- Свойство Length : получает размер файла
- Свойство Extension : получает расширение файла
- Свойство Name : получает имя файла
- Свойство FullName : получает полное имя файла
Для создания объекта FileInfo применяется конструктор, который получает в качестве параметра путь к файлу:
FileInfo fileInf = new FileInfo(@"C:\app\content.txt");
File
Класс File реализует похожую функциональность с помощью статических методов:
- Copy() : копирует файл в новое место
- Create() : создает файл
- Delete() : удаляет файл
- Move : перемещает файл в новое место
- Exists(file) : определяет, существует ли файл
Пути к файлам
Для работы с файлами можно применять как абсолютные, так и относительные пути:
// абсолютные пути string path1 = @"C:\Users\eugene\Documents\content.txt"; // для Windows string path2 = "C:\\Users\\eugene\\Documents\\content.txt"; // для Windows string path3 = "/Users/eugene/Documents/content.txt"; // для MacOS/Linux // относительные пути string path4 = "MyDir\\content.txt"; // для Windows string path5 = "MyDir/content.txt"; // для MacOS/Linux
Получение информации о файле
string path = @"C:\Users\eugene\Documents\content.txt"; // string path = "/Users/eugene/Documents/content.txt"; // для MacOS/Linux FileInfo fileInfo = new FileInfo(path); if (fileInfo.Exists) < Console.WriteLine($"Имя файла: "); Console.WriteLine($"Время создания: "); Console.WriteLine($"Размер: "); >
Удаление файла
string path = @"C:\app\content.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) < fileInf.Delete(); // альтернатива с помощью класса File // File.Delete(path); >
Перемещение файла
string path = @"C:\OldDir\content.txt"; string newPath = @"C:\NewDir\index.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) < fileInf.MoveTo(newPath); // альтернатива с помощью класса File // File.Move(path, newPath); >
Если файл по новому пути уже существует, то с помощью дополнительного параметра можно указать, надо ли перезаписать файл (при значении true файл перезаписывается)
string path = @"C:\OldDir\content.txt"; string newPath = @"C:\NewDir\index.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) < fileInf.MoveTo(newPath, true); // альтернатива с помощью класса File // File.Move(path, newPath, true); >
Копирование файла
string path = @"C:\OldDir\content.txt"; string newPath = @"C:\NewDir\index2.txt"; FileInfo fileInf = new FileInfo(path); if (fileInf.Exists) < fileInf.CopyTo(newPath, true); // альтернатива с помощью класса File // File.Copy(path, newPath, true); >
Метод CopyTo класса FileInfo принимает два параметра: путь, по которому файл будет копироваться, и булевое значение, которое указывает, надо ли при копировании перезаписывать файл (если true , как в случае выше, файл при копировании перезаписывается). Если же в качестве последнего параметра передать значение false , то если такой файл уже существует, приложение выдаст ошибку.
Метод Copy класса File принимает три параметра: путь к исходному файлу, путь, по которому файл будет копироваться, и булевое значение, указывающее, будет ли файл перезаписываться.
Чтение и запись файлов
В дополнение к вышерассмотренным методам класс File также предоставляет ряд методов для чтения-записи текстовых и бинарных файлов:
- AppendAllLines(String, IEnumerable) / AppendAllLinesAsync(String, IEnumerable, CancellationToken) добавляют в файл набор строк. Если файл не существует, то он создается
- AppendAllText(String, String) / AppendAllTextAsync(String, String, CancellationToken) добавляют в файл строку. Если файл не существует, то он создается
- byte[] ReadAllBytes (string path) / Task
ReadAllBytesAsync (string path, CancellationToken cancellationToken) считывают содержимое бинарного файла в массив байтов - string[] ReadAllLines (string path) / Task
ReadAllLinesAsync (string path, CancellationToken cancellationToken) считывают содержимое текстового файла в массив строк - string ReadAllText (string path) / Task ReadAllTextAsync (string path, CancellationToken cancellationToken) считывают содержимое текстового файла в строку
- IEnumerable ReadLines (string path) считывают содержимое текстового файла в коллекцию строк
- void WriteAllBytes (string path, byte[] bytes) / Task WriteAllBytesAsync (string path, byte[] bytes, CancellationToken cancellationToken) записывают массив байт в бинарный файл. Если файл не существует, он создается. Если существует, то перезаписывается
- void WriteAllLines (string path, string[] contents) / Task WriteAllLinesAsync (string path, IEnumerable contents, CancellationToken cancellationToken) записывают массив строк в текстовый файл. Если файл не существует, он создается. Если существует, то перезаписывается
- WriteAllText (string path, string? contents) / Task WriteAllTextAsync (string path, string? contents, CancellationToken cancellationToken) записывают строку в текстовый файл. Если файл не существует, он создается. Если существует, то перезаписывается
Как видно, эти методы покрывают практически все основные сценарии — чтение и запись текстовых и бинарных файлов. Причем в зависимости от задачи можно применять как синхронные методы, так и их асинхронные аналоги.
Например, запишем и считаем обратно в строку текстовый файл:
string path = @"c:\app\content.txt"; string originalText = "Hello Metanit.com"; // запись строки await File.WriteAllTextAsync(path, originalText); // дозапись в конец файла await File.AppendAllTextAsync(path, "\nHello work"); // чтение файла string fileText = await File.ReadAllTextAsync(path); Console.WriteLine(fileText);
Hello Metanit.com Hello work
Стоит отметить, что при добавлении текста я добавил в строку последовательность «\n», которая выполняет перевод на следующую строку. Благодаря этому добавляемый текст располагается в файле на новой строке.
Если мы хотим, что в файле изначально шло добавление на новую строку, то для записи стоит использовать метод WriteAllLines/ WriteAllLinesAsync , а для добавления — AppendAllLines / AppendAllLinesAsync
await File.WriteAllLinesAsync(path, new[] < "Hello Metanit.com", "Hello work" >);
Аналогично при чтении файла если мы хотим каждую строку файла считать отдельно, то вместо ReadAllText / ReadAllTextAsync применяется ReadAllLines / ReadAllLinesAsync .
Кодировка
В качестве дополнительного параметра методы чтения-записи текстовых файлов позволяют установить кодировку в виде объекта System.Text.Encoding :
using System.Text; string path = "/Users/eugene/Documents/app/content.txt"; string originalText = "Привет Metanit.com"; // запись строки await File.WriteAllTextAsync(path, originalText, Encoding.Unicode); // дозапись в конец файла await File.AppendAllTextAsync(path, "\nПривет мир", Encoding.Unicode); // чтение файла string fileText = await File.ReadAllTextAsync(path, Encoding.Unicode); Console.WriteLine(fileText);
Для установки кодировки при записи и чтении здесь применяется встроенное значение Encoding.Unicode . Также можно указать название кодировки, единственное следует удостовериться, что текущая операционная система поддерживает выбранную кодировку:
using System.Text; string path = @"c:\app\content.txt"; string originalText = "Hello Metanit.com"; // запись строки await File.WriteAllTextAsync(path, originalText, Encoding.GetEncoding("iso-8859-1")); // дозапись в конец файла await File.AppendAllTextAsync(path, "\nHello code", Encoding.GetEncoding("iso-8859-1")); // чтение файла string fileText = await File.ReadAllTextAsync(path, Encoding.GetEncoding("iso-8859-1")); Console.WriteLine(fileText);Как прописать путь к txt-файлу?
Как указать путь к файлу который находится в той же директории что и сам проект, то есть чтобы можно было этот файл и проект перекинуть в другое место и он все таки находил этот файл не меняя пути к нему? FileStream f = new FileStream(@»C:\Users\User\Desktop\TaskOne\input.txt», FileMode.Open, FileAccess.Read);
Отслеживать
задан 21 апр 2016 в 6:17
85 2 2 золотых знака 3 3 серебряных знака 9 9 бронзовых знаков
проект или все таки исполняемый файл?
21 апр 2016 в 6:18
Папку с проектом, в которой находится файл.
21 апр 2016 в 6:19можно получить путь до исполняемого и путь текущей папки, проект никак не связан с конечным исполняемым файлом
21 апр 2016 в 6:32
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Для это вам нужно оперировать двумя параметрами проекта Visual Studio:
- Working directory
- Output path
Возьмём для примера проект консольного приложения.

Параметр Working directory определяет, какая рабочая директория будет задана по умолчанию текущему процессу консольного приложения.
Если этот параметр пустой, то рабочей директория будет директория из которой запущен exe файл. А его место создание определяется параметром проекта Output path :
По умолчанию это поддиректорий текущего проекта bin\Debug.
Таким образом, в данном случае, чтобы обратиться к файлу input.txt находящемуся в директории проекта нужно обратиться на два директория выше, т.е. использовать «..» в пути файла:
FileStream f = new FileStream(@"..\..\input.txt", FileMode.Open, FileAccess.Read);Так как пути все указываются относительно директории проекта, то при переносе папки проекта изменять пути не надо будет.
Директорией проекта является директория, в которой лежит файл проекта .csproj .