Файл представляет собой набор данных, хранящихся в диске с указанным именем и путем к каталогу.Когда файл открыт для чтения или записи, он становится потоком.
Поток в основном это последовательность байтов, проходящих через канал связи. Есть два основных потока: входной поток и выходной поток. Входной поток используется для считывания данных из файла (операция чтения) и выходной поток используется для записи в файл (операция записи).
Пространство имен System.IO имеет различные классы, которые используются для выполнения различных операций с файлами, такие как создание и удаление файлов, чтения или записи в файл, закрытие файла и т.д.
В следующей таблице приведены некоторые часто используемые классы пространства имен System.IO:
Класс ввода / вывода | Описание |
---|---|
BinaryReader | Читает примитивные данные из двоичного потока. |
BinaryWriter | Записывает примитивные данных в двоичном формате. |
BufferedStream | Временное хранилище для потока байтов. |
Directory | Помогает управлять структурой каталогов. |
DirectoryInfo | Используется для выполнения операций над каталогами. |
DriveInfo | Содержит информацию о дисках. |
File | Помогает в управлении файлами. |
FileInfo | Используется для выполнения операций над файлами. |
FileStream | Используется для чтения и записи в любое место в файле. |
MemoryStream | Используется для произвольного доступа к потоковым данным, хранящимся в памяти. |
Path | Выполняет операции на пути информации. |
StreamReader | Используется для чтения символов из потока байтов. |
StreamWriter | Используется для записи символов в поток. |
StringReader | Используется для чтения из буфера строки. |
StringWriter | Используется для записи в буфер строк. |
Класс FileStream в пространстве имен System.IO помогает в чтении, записи и закрытии файлов. Этот класс является производным от абстрактного класса Stream.
Вам нужно создать объект класса FileStream чтобы создать новый файл или открыть существующий файл. Синтаксис создания объектов класса FileStream следующий:
FileStream <object_name> = new FileStream( <file_name>,
<FileMode Enumerator>, <FileAccess Enumerator>, <FileShare Enumerator>);
Пример для создания объектов класса FileStream F для чтения из файла sample.txt:
FileStream F = new FileStream("sample.txt", FileMode.Open, FileAccess.Read, FileShare.Read);
Параметр | Описание |
---|---|
FileMode | FileMode определяет различные методы для открытия файлов. Вариантами FileMode являются: Append: Открывает существующий файл и помещает курсор в конец файла, или создает файл, если файл не существует. Create: Создает новый файл. CreateNew: Передает в операционную систему, что она должна создать новый файл. Open: Открывает существующий файл. OpenOrCreate: Передает в операционную систему, что она должна открыть файл, если он существует, в противном случае она должна создать новый файл. Truncate: Открывает существующий файл и обрезает его размер до нуля байт. |
FileAccess | Вариантами FileAccess являются: Read, ReadWrite и Write. |
FileShare | Вариантами FileShare являются: Inheritable: Разрешает наследование дескриптора файла дочерними процессами. None: Отклоняет совместное использование текущего файла. Read: Разрешает последующее открытие файла для чтения. ReadWrite: Разрешает последующее открытие файла для чтения или записи. Write: Разрешает последующее открытие файла для записи. |
Следующая программа демонстрирует использование класса FileStream :
using System;
using System.IO;
namespace FileIOApplication
{
class Program
{
static void Main(string[] args)
{
FileStream F = new FileStream("test.dat",
FileMode.OpenOrCreate, FileAccess.ReadWrite);
for (int i = 1; i <= 20; i++)
{
F.WriteByte((byte)i);
}
F.Position = 0;
for (int i = 0; i <= 20; i++)
{
Console.Write(F.ReadByte() + " ");
}
F.Close();
Console.ReadKey();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 -1
В предыдущем примере предоставены простые операции с файлами в C#. Однако, чтобы использовать огромные возможности классов C# System.IO, вы должны знать, часто используемые свойства и методы этих классов.
Классы StreamReader и StreamWriter используются для чтения и записи данных в текстовые файлы. Эти классы наследуют от абстрактного базового класса Stream, который поддерживает чтение и запись байтов в файловый поток.
Класс StreamReader также наследует от абстрактного базового класса TextReader который представляет считыватель для считывания последовательности символов. В следующей таблице приведены некоторые из наиболее часто используемых методов класса StreamReader:
Номер | Имя и описание метода |
---|---|
1 | public override void Close() Закрывает объект StreamReader и базовый поток, а также освобождает все системные ресурсы, связанные с устройством считывания. |
2 | public override int Peek() Возвращает следующий доступный символ, но не использует его. |
3 | public override int Read() Читает следующий символ из входного потока и перемещает позицию символа на один символ. |
Следующий пример демонстрирует чтение текстового файла с именем Jamaica.txt:
Down the way where the nights are gay
And the sun shines daily on the mountain top
I took a trip on a sailing ship
And when I reached Jamaica
I made a stop
using System;
using System.IO;
namespace FileApplication
{
class Program
{
static void Main(string[] args)
{
try
{
// создает экземпляр StreamReader для чтения из файла
// выражение using также закрывает StreamReader
using (StreamReader sr = new StreamReader("c:/jamaica.txt"))
{
string line;
// чтение и отображение строк из файла, пока
// конца файла не будет достигнут
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
catch (Exception e)
{
// дает пользователю понять, что что-то пошло не так
Console.WriteLine("Файл не может быть прочитан:");
Console.WriteLine(e.Message);
}
Console.ReadKey();
}
}
}
Класс StreamWriter наследует от абстрактного класса TextWriter.
В следующей таблице приведены некоторые из наиболее часто используемых методов этого класса:
Номер | Имя и описание метода |
---|---|
1 | public override void Close() Закрвает текущий объект StreamWriter и основной поток. |
2 | public override void Flush() Очищает все буферы для текущего писателя и вызывает запись всех данных буфера в основной поток. |
3 | public virtual void Write(bool value) Writes the text representation of a Boolean value to the text string or stream. (Inherited from TextWriter.) |
4 |
public override void Write(
char value
)
Записывает символ в поток. |
5 |
public virtual void Write(
decimal value
)
Записывает текстовое представление десятичного значения в текстовую строку или поток. |
6 |
public virtual void Write(
double value
)
Записывает текстовое представление 8-байтного значения с плавающей точкой в текстовую строку или поток. |
7 |
public virtual void Write(
int value
)
Записывает текстовое представление 4-разрядного целого числа в текстовую строку или поток. |
8 |
public override void Write(
string value
)
Записывает строку в поток. |
9 | public virtual void WriteLine() Записывает конца строки текстовой строки или потока. |
В следующем примере демонстрируется запись текстовых данных в файл с помощью класса StreamWriter:
using System;
using System.IO;
namespace FileApplication
{
class Program
{
static void Main(string[] args)
{
string[] names = new string[] {"Zara Ali", "Nuha Ali"};
using (StreamWriter sw = new StreamWriter("names.txt"))
{
foreach (string s in names)
{
sw.WriteLine(s);
}
}
// чтение и отображение строк из файла
string line = "";
using (StreamReader sr = new StreamReader("names.txt"))
{
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
Console.ReadKey();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Zara Ali
Nuha Ali
Классы BinaryReader и BinaryWriter are used for reading from and writing to a binary file.используются для чтения и записи в двоичный файл
Класс BinaryReader используется для чтения двоичных данных из файла. Объект BinaryReader создается путем передачи объекта FileStream его конструктору.
В следующей таблице приведены некоторые из наиболее часто используемых методов класса BinaryReader.
Номер | Имя и описание метода |
---|---|
1 | public override void Close() Закрывает объект BinaryReader и основной поток. |
2 | public virtual int Read() Читает символы из потока и перемещает текущую позицию в потоке. |
3 | public virtual bool ReadBoolean() Считывает логическое значение из текущего потока и перемещает текущую позицию в потоке на один байт. |
4 | public virtual byte ReadByte() Читает следующий байт из текущего потока и перемещает текущую позицию в потоке на один байт. |
5 |
public virtual byte[] ReadBytes(
int count
)
Считывает указанное число байт из текущего потока в массив байт и перемещает текущую позицию тем, что количество байт. |
6 | public virtual char ReadChar() Чтение следующего символа из текущего потока и перемещает текущую позицию в потоке в соответствии с используемой кодировки и специфики читается из потока. |
7 |
public virtual char[] ReadChars(
int count
)
Читает указанное количество символов из текущего потока, возвращает данные в массив символов, и перемещает текущую позицию в соответствии с используемой кодировки и специфики читается из потока. |
8 | public virtual double ReadDouble() Читает 8-байтовое значение с плавающей запятой из текущего потока и перемещает текущую позицию в потоке на восемь байтов. |
9 | public virtual int ReadInt32() Читает 4-разрядное целое число из текущего потока и перемещает текущую позицию в потоке на четыре байта. |
10 |
public virtual string ReadString()
Считывает строку из текущего потока. Строка с префиксом длины, кодируется как целое семь бит за один раз. |
Класс BinaryWriter используется для записи двоичных данных в поток. Объект BinaryWriter создается путем передачи объекта FileStream его конструктору.
В следующей таблице приведены некоторые из наиболее часто используемых методов класса BinaryWriter.
Номер | Имя и описание метода |
---|---|
1 | public override void Close() Он закрывает объект BinaryWriter и основной поток. |
2 | public virtual void Flush() Очищает все буферы для текущего писателя и вызывает запись всех данных буфера записываются в базовое устройство. |
3 |
public virtual long Seek(
int offset,
SeekOrigin origin
)
Задает позицию в текущем потоке. |
4 |
public virtual void Write(
bool value
)
Записывает один байт логического значения в текущем потоке, при этом 0 соответствует ложи и 1 соответствует истине. |
5 |
public virtual void Write(
byte value
)
Записывает байт без знака на текущий поток и перемещает позицию в потоке на один байт. |
6 |
public virtual void Write(
byte[] buffer
)
Записывает массив байтов в основной поток. |
7 |
public virtual void Write(
char ch
)
Записывает символ Юникода в текущий поток и перемещает текущую позицию в потоке в соответствии с используемой кодировки и конкретных символов, записываемых в потоке. |
8 |
public virtual void Write(
char[] chars
)
Записывает массив символов в текущий поток и перемещает текущую позицию в потоке в соответствии с используемой кодировки и конкретных символов, записываемых в потоке. |
9 |
public virtual void Write(
double value
)
Записывает восьмибайтовое значение с плавающей точкой в текущий поток и перемещает позицию в потоке на восемь байтов. |
10 |
public virtual void Write(
int value
)
Записывает четыре-разрядного целого числа текущего потока и перемещает позицию в потоке на четыре байта. |
11 |
public virtual void Write(
string value
)
Записывает с префиксом длины строки в этот поток в текущей кодировке BinaryWriter, и перемещает текущую позицию в потоке в соответствии с кодировкой, используемой и конкретных символов, записываемых в потоке. |
Следующий пример демонстрирует чтения и записи двоичных данных:
using System;
using System.IO;
namespace BinaryFileApplication
{
class Program
{
static void Main(string[] args)
{
BinaryWriter bw;
BinaryReader br;
int i = 25;
double d = 3.14157;
bool b = true;
string s = "I am happy";
// создание файла
try
{
bw = new BinaryWriter(new FileStream("mydata",
FileMode.Create));
}
catch (IOException e)
{
Console.WriteLine(e.Message + "\n Невозможно создать файл.");
return;
}
// запись в файл
try
{
bw.Write(i);
bw.Write(d);
bw.Write(b);
bw.Write(s);
}
catch (IOException e)
{
Console.WriteLine(e.Message + "\n Невозможно записать в файл.");
return;
}
bw.Close();
// чтение из файла
try
{
br = new BinaryReader(new FileStream("mydata",
FileMode.Open));
}
catch (IOException e)
{
Console.WriteLine(e.Message + "\n Не удается открыть файл.");
return;
}
try
{
i = br.ReadInt32();
Console.WriteLine("Integer data: {0}", i);
d = br.ReadDouble();
Console.WriteLine("Double data: {0}", d);
b = br.ReadBoolean();
Console.WriteLine("Boolean data: {0}", b);
s = br.ReadString();
Console.WriteLine("String data: {0}", s);
}
catch (IOException e)
{
Console.WriteLine(e.Message + "\n Cannot read from file.");
return;
}
br.Close();
Console.ReadKey();
}
}
}
Если приведенный выше код скомпилировать и выполнить, это приведет к следующему результату:
Integer data: 25
Double data: 3.14157
Boolean data: True
String data: I am happy
C# позволяет работать с каталогами и файлами с помощью различных связанных классов DirectoryInfo и FileInfo.
Класс DirectoryInfo выводится из класса FileSystemInfo. Он имеет различные методы для создания, перемещения и просмотра через каталоги и подкаталоги. Этот класс не может быть унаследован.
Ниже приведены некоторые часто используемые свойства класса DirectoryInfo:
Номер | Имя и описание свойства |
---|---|
1 | Attributes Получает атрибуты для текущего файла или каталога. |
2 | CreationTime Получает время создания текущего файла или каталога. |
3 | Exists Возвращает логическое значение, указывающее, является ли каталог существует. |
4 | Extension Возвращает строку, представляющую расширение файла. |
5 | FullName Получает полный путь к каталогу или файлу. |
6 | LastAccessTime Возвращает время текущего файла или каталога последнего доступа. |
7 | Name Возвращает имя этого экземпляра DirectoryInfo. |
Ниже приведены некоторые часто используемые методы класса DirectoryInfo:
Номер | Имя и описание метода |
---|---|
1 | public void Create() Создает каталог. |
2 |
public DirectoryInfo CreateSubdirectory(
string path
)
Создает один или несколько подкаталогов по заданному пути.Путь может быть задан относительно этого экземпляра класса DirectoryInfo. |
3 | public override void Delete() Удаляет данный DirectoryInfo если он пуст. |
4 | public DirectoryInfo[] GetDirectories() Возвращает подкаталоги текущего каталога. |
5 | public FileInfo[] GetFiles() Возвращает список файлов в текущем каталоге. |
Класс FileInfo получен из класса FileSystemInfo. Он имеет свойства и методы экземпляра для создания, копирования, удаления, перемещения и открытия файлов, а также помогает в создании объектов FileStream. Этот класс не может быть унаследован.
Ниже приведены некоторые часто используемые свойства класса FileInfo:
Номер | Имя и описание свойства |
---|---|
1 | Attributes Получает атрибуты для текущего файла. |
2 | CreationTime Получает время создания текущего файла. |
3 | Directory Получает экземпляр каталога, который принадлежит файл. |
4 | Exists Возвращает логическое значение, указывающее, существует ли файл. |
5 | Extension Возвращает строку, представляющую расширение файла. |
6 | FullName Получает полный путь к файлу. |
7 | LastAccessTime Возвращает время текущего последнего доступа к файлу. |
8 | LastWriteTime Получает время последнего письменного активность файл. |
9 | Length Получает размер в байтах текущего файла. |
10 | Name Получает имя файла. |
Ниже приведены некоторые часто используемые методы класса FileInfo:
Номер | Имя и свойства метода |
---|---|
1 | public StreamWriter AppendText() Создает StreamWriter, что добавляет текст в файл, представленный этим экземпляром FileInfo. |
2 | public FileStream Create() Создает файл. |
3 | public override void Delete() Удаляет файл постоянно. |
4 |
public void MoveTo(
string destFileName
)
Перемещает указанный файл в новое место, обеспечивая возможность указать новое имя файла. |
5 |
public FileStream Open(
FileMode mode
)
Открывает файл в указанном режиме. |
6 |
public FileStream Open(
FileMode mode,
FileAccess access
)
Открывает файл в указанном режиме с чтение, запись или чтение / запись доступ. |
7 |
public FileStream Open(
FileMode mode,
FileAccess access,
FileShare share
)
Открывает файл в указанном режиме с чтение, запись или чтение / запись и указанным параметром совместного. |
8 | public FileStream OpenRead() Создает FileStream только для чтения. |
9 | public FileStream OpenWrite() Создает FileStream только для записи. |
Следующий пример демонстрирует использование вышеуказанных классов:
using System;
using System.IO;
namespace WindowsFileApplication
{
class Program
{
static void Main(string[] args)
{
// создание объекта DirectoryInfo
DirectoryInfo mydir = new DirectoryInfo(@"c:\Windows");
// получение файлов в каталоге, их названия и размера
FileInfo [] f = mydir.GetFiles();
foreach (FileInfo file in f)
{
Console.WriteLine("Имя файла: {0} Размер: {1}",
file.Name, file.Length);
}
Console.ReadKey();
}
}
}