#си# — Как использовать файл .resw c#


Содержание

#си# — Как использовать файл .resw c#

В этой статье я хочу рассказать и показать как можно работать с INI-файлами в программах, написанных на C#. На самом деле, сейчас INI-файлы используются достаточно редко. Точнее они используются редко в разрабатываемых сейчас программах, но есть огромное количество программ, который были написаны весьма давно, в пору популярности INI-файлов. И Вам может даже придется сопровождать такие программы (как мне в своё время), или же Вам нужно будет организовать доступ из своей программы к INI-файлу, который создается другой системой. В любом случае, умение работать с INI-файлами является еще актуальной задачей…

И так, для начала, вкратце, расскажу о том, что же такое INI-файлы. В INI-файлах некоторые приложения хранят свои настройки. В общих чертах, формат INI-файла выглядит так:

Т.е. весь файл разбит на секции, а каждая секция включает в себя пары «ключ=значение». Пример файла для хранения краткой информации о человеке представлен ниже:

Как несложно догадаться, в файле хранятся имя и возраст человека, оба параметра расположены в секции «main». Так вот с подобными файлами, Вы можете столкнуться. А сейчас пора перейти к практической части статьи. Ниже я приведу класс, который импортирует две функции из библиотеки Windows и с их помощью получает/записывает настройки из INI-файла.

Обратите внимание, для использования данного кода, нужно подключить пространство имен «System.Runtime.InteropServices». В самом начале файла с исходным кодом есть список директив «using», вот в него нужно добавить строчку «using System.Runtime.InteropServices», как показано на примере ниже (нужная строка выделена):

Как видите, код приведен с комментариями, так что останавливаться на нем не буду, а лучше покажу как использовать объекты данного класса:

Как видите, тоже нет ничего сложного. Такой класс, можно включить в отдельную dll и использовать в разный проектах.

Добавить комментарий Отменить ответ

Для отправки комментария вам необходимо авторизоваться.

#си# — Как использовать файл .resw c#

Наверно это не самый лучший стиль программирования, но настройки большинства своих программ я привык хранить в их теле. Или вообще делать их неизменяемыми – так как изначально затачивать под конкретного человека. Но вот в одном заказе (программа для приема в печать для одной фотостудии) клиент попросил вынести настройки приложения в отдельный файл – ini. Ну что ж, раз надо – сделаем.

На самом деле я был несколько удивлен, не найдя готовых решений, уже встроенных в .NET. Оказывается, макрософт вообще не рекмоендует ини файлы, а вместо этого предлагает использовать реестр или xml. Но нам наплевать на рекомендации майкрософта, нам главное – удовлетворить заказчика. Итак, пишем свой код для работы с ini-файлами. Работать будет от XP и до Window 10:

Работать со всем этим проще простого. Например, прочитать значение (размер шрифта):

Узнать, сколько значений в секции:

Структура файла у нас такая:

Стоит обратить внимание на кодировки программы и файла ini – в случае несовпадения могут быть проблемы с кириллицей. Ну а у нас проблем нет:

#си# — Как использовать файл .resw c#

Файл (file) это коллекция данных, сохраненных на диске с определенным именем и по определенному пути на этом диске. Когда файл открывается для чтения или записи, он становится потоком (stream).

Поток в сущности это последовательность байт, проходящих через канал обмена данными. Есть 2 основных потока: поток ввода (input stream) и поток вывода (output stream). Поток ввода используется для чтения данных из файла (read operation) и поток вывода используется для записи данных в файл (write operation).

[Классы ввода/вывода C#]

Пространство имен (namespace) System.IO содержит различные классы, используемые для выполнения нескольких операций с файлами, таких как создание и удаление файлов, чтение из них и запись в них, закрытие файла, навигация по системе каталогов файловой системы, доступ к информации о файле (время создания, атрибуты) и т. д.

В следующей таблице показаны некоторые обычно чаще всего используемые не абстрактные классы из System.IO namespace:

Имя класса Описание
BinaryReader Читает примитивные данные из двоичного потока.
BinaryWriter Записывает примитивные данные в двоичном формате.
BufferedStream Временное хранилище байтового потока данных.
Directory Помогает работать со структурой каталогов файловой системы.
DirectoryInfo Используется для выполнения операций над каталогами.
DriveInfo Предоставляет информацию о приводах (дисках).
File Помогает в манипуляциях с файлами.
FileInfo Используется для выполнения операций с файлами.
FileStream Используется для чтения и записи любого места в файле.
MemoryStream Используется для произвольного доступа к данным потока, сохраненного в памяти.
Path Операции над информацией пути файлов и каталогов.
StreamReader Используется для чтения символов в байтовом потоке.
StreamWriter Используется для записи символов в поток.
StringReader Используется для чтения из буфера строки.
StringWriter Используется для записи в буфер строки.

Класс FileStream. Этот класс из System.IO namespace помогает в чтении, записи и закрытие файлов после их использования. Этот класс происходит от абстрактного класса Stream.

Чтобы создать новый файл или открыть существующий файл, Вам нужно создать объект FileStream. Синтаксис создания объекта FileStream следующий:

FileStream = new FileStream( ,
,
,
);

Например, вот так мы создаем объект FileStream F для чтения файла sample.txt:

Назначение параметров конструктора класса FileStream:

Параметр Описание
FileMode Перечисление FileMode определяет различные методы, которые применяются для работы с файлами:

Append — открывает существующий файл и перемещает позицию ввода (так называемый курсор файла) в конец файла, или создает новый файл, если указанный по имени файл не существует.
Create — создает новый файл.
CreateNew — указывает операционной системе, что она должна создать новый файл.
Open — открывает существующий файл.
OpenOrCreate — указывает операционной системе, что нужно открыть файл, если он существует, и если он не существует, то нужно создать новый файл.
Truncate — откроет существующий файл и обрежет его, в результате файл станет пустым (его размер составит 0 байт).

FileAccess Перечислитель, определяющий доступ к файлу: Read (только чтение), ReadWrite (чтение и запись) и Write (только запись).
FileShare Перечисление, определяющее совместное использование файла:

Inheritable — позволяет наследовать доступ к дескриптору файла для дочерних процессов.
None — запрещает совместный доступ к текущему файлу.
Read — позволяет другим потокам открыть файл на чтение.
ReadWrite — позволяет совместную работу с файлом на чтение и запись.
Write — позволяет другим потокам открыть файл на запись.


Следующая программа демонстрирует использование класса FileStream:

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

[Более сложные операции с файлами на C#]

В предыдущем примере был показан простейший пример операций с файлом на C#. Однако для использование классов System.IO в полную силу следует знать их часто используемые свойства и методы.

Классы StreamReader и StreamWriter помогают в доступе к информации текстового файла на чтение и запись [2]. Они наследуются из абстрактного базового класса Stream, который поддерживает чтение и запись байт файлового потока.

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

Метод Описание
public override void Close() Закрывает объект StreamReader и нижележащий поток, и освобождает любые ресурсы системы, связанные с этим читающим объектом.
public override int Peek() Вернет следующий доступный символ без перемещения позиции чтения в файле.
public override int Read() Читает следующий символ из входного потока с переходом к следующему символу.

Следующий пример показывает чтение файла mytext.txt, находящегося в каталоге TEMP диска C:.

Примечание: обратите внимание, что в пути до файла используется правый слеш, что избегает необходимости экранирования символа, когда применяется правый слеш (//).

StreamWriter. Класс StreamWriter наследуется из абстрактного класса TextWriter, который предоставляет способ записи последовательности символов. Следующая таблица описывает наиболее часто используемые методы этого класса:

Метод Описание
public override void Close() Закрывает текущий объект StreamWriter и связанный с ним нижележащий поток.
public override void Flush() Очищает все буферы текущего записывающего объекта, что приводит к тому, что все хранящиеся в буфере (кэше) данные записываются в нижележащий поток.
public virtual void Write(bool value) Записывает текст, представляющий двоичное значение в строку текста или в поток (унаследовано от TextWriter).
public override void Write(char value) Записывает символ в поток.
public virtual void Write(decimal value) Записывает текстовое представление десятичного значения в строку текста или поток.
public virtual void Write(double value) Записывает текстовое представление 8-байтного значения в формате с плавающей точкой в строку текста или поток.
public virtual void Write(int value) Записывает текстовое представление 4-байтного значения целого числа со знаком в строку текста или поток.
public override void Write(string value) Записывает строку в поток.
public virtual void WriteLine() Записывает терминатор строки в строку текста или поток.

Для получения полного списка методов обратитесь к документации C# от Microsoft.

Следующий пример демонстрирует запись файла names.txt в текущий каталог.

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

Классы BinaryReader и BinaryWriter помогают реализовать чтение и запись двоичных файлов [3].

BinaryReader. Класс BinaryReader используется для чтения двоичных данных из файла. Объект BinaryReader создается передачей в его конструктор объекта FileStream.

Следующая таблица описывает часто используемые методы класса BinaryReader.

Метод Описание
public override void Close() Закрывает объект BinaryReader и нижележащий поток.
public virtual int Read() Читает символы из нижележащего потока с переходом в следующую позицию чтения в потоке.
public virtual bool ReadBoolean() Читает двоичное значение из текущего потока с переводом позиции чтения в следующую позицию в потоке на 1 байт.
public virtual byte ReadByte() Читает следующий байт из текущего потока и переводит текущую позицию в потоке на 1 байт.
public virtual byte[] ReadBytes(int count) Читает указанное количество байт из текущего потока в массив байт и переводит текущую позицию в потоке вперед на это количество байт.
public virtual char ReadChar() Читает следующий символ из текущего потока и перемещает позицию чтения в нем на следующий символ в соответствии с используемой кодировкой (Encoding) и прочитанным символом.
public virtual char[] ReadChars(int count) Читает указанное количество символов из текущего потока, возвращает эти данные в массиве символов, и перемещает позицию чтения в потоке вперед в соответствии с кодировкой (Encoding) и специфическими символами, прочитанными из потока.
public virtual double ReadDouble() Читает 8-байтное значение с плавающей точкой и перемещает позицию чтения в потоке вперед на 8 байт.
public virtual int ReadInt32() Читает 4-байтное целочисленное значение со знаком и перемещает позицию чтения в потоке вперед на 4 байта.
public virtual string ReadString() Читает строку из текущего потока. Строка снабжена префиксом длины, закодированное как целое число блоками по 7 бит.

BinaryWriter. Класс BinaryWriter используется для записи двоичных данных в файл. Объект BinaryWriter создается путем передачи в его конструктор объекта FileStream.

Следующая таблица описывает часто используемые методы класса BinaryWriter.

Метод Описание
public override void Close() Закрывает объект BinaryWriter и нижележащий поток.
public virtual void Flush() Очищает все буферы текущего записывающего объекта, в результате всего все буферизированные (кэшированные) данные передаются в нижележащее устройство (говоря по-русски, сбрасываются на диск).
public virtual long Seek(int offset, SeekOrigin origin) Устанавливает позицию в текущем потоке.
public virtual void Write(bool value) Записывает 1 байт двоичного значения в текущий поток, где 0 обозначает false и 1 обозначает true.
public virtual void Write(byte value) Записывает байт (беззнаковое 8-битное целое число) в текущий поток и перемещает текущую позицию в потоке вперед на 1 байт.
public virtual void Write(byte[] buffer) Записывает массив байт в нижележащий поток.
public virtual void Write(char ch) Записывает символ Unicode в текущий поток, и перемещает текущую позицию в потоке вперед на количество байт в соответствии с текущей кодировкой (Encoding) и записанным символом.
public virtual void Write(char[] chars) Записывает массив символов в текущий поток и перемещает текущую позицию потока вперед в соответствии с используемой кодировкой (Encoding) и спецификой символов, записанных в поток.
public virtual void Write(double value) Записывает 8-байтное значение с плавающей точкой в текущий поток и перемещает позицию потока вперед на 8 байт.
public virtual void Write(int value) Записывает 4-байтное целое число со знаком в текущий поток и перемещает позицю потока вперед на 4 байта.
public virtual void Write(string value) Записывает строку, снабженную префиксом длины, в поток в текущей кодировке BinaryWriter, и перемещает текущую позицию потока вперед в соответствии с кодировкой и спецификой символов записанной строки.

Для получения полного списка методов обратитесь к документации C# от Microsoft.

Следующий пример демонстрирует чтение и запись двоичного файла:

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

C# позволяет Вам работать с директориями и файлами, используя набор специальных классов, таких как DirectoryInfo и FileInfo [4].

DirectoryInfo. Класс DirectoryInfo происходит из класса FileSystemInfo. В нем содержатся различные методы для создания, переименования/перемещения, просмотра содержимого директорий и их подкаталогов. Этот класс не может быть унаследован.

В таблице приведены используемые обычно свойства класса DirectoryInfo:

Свойство Описание
Attributes Возвращает значения атрибутов текущего файла или директории.
CreationTime Возвращает время создания текущего файла или директории.
Exists Возвращает двоичное значение, показывающее, существует ли директория.
Extension Возвращает строку, представляющую расширение файла.
FullName Возвращает полный путь до директории или файла.
LastAccessTime Возвращает время последнего доступа к текущему файлу или директории.
Name Возвращает имя этого экземпляра DirectoryInfo.

Часто используемые методы класса DirectoryInfo:

Метод Описание
public void Create() Создает директорию.
public DirectoryInfo CreateSubdirectory(string path) Создает подкаталог или подкаталоги по указанному пути. Для этого экземпляра класса DirectoryInfo указанный путь может быть относительный.
public override void Delete() Удаляет директорию этого DirectoryInfo, если она пустая.
public DirectoryInfo[] GetDirectories() Возвратит подкаталоги текущей директории.
public FileInfo[] GetFiles() Возвратит список файлов из текущей директории.

Для получения полного списка свойств и методов обратитесь к документации C# от Microsoft.


FileInfo. Класс FileInfo также происходит от класса FileSystemInfo. Его свойства и методы его экземпляра позволяют создавать, копировать, удалять, переименовывать файлы, а также помогают открывать файлы и создавать объекты FileStream. Этот класс не может быть унаследован.

В таблице приведены используемые обычно свойства класса FileInfo:

Свойство Описание
Attributes Возвратит атрибуты для текущего файла.
CreationTime Возвратит время создания текущего файла.
Directory Возвратит экземпляр директории, которой принадлежит файл.
Exists Возвратит двоичное значение, показывающее, существует файл или нет.
Extension Возвратит строку, представляющую расширение файла.
FullName Возвратит полный путь до файла.
LastAccessTime Возвратит время последнего доступа к текущему файлу.
LastWriteTime Возвратит время последней активности записи файла.
Length Возвратит размер в байтах текущего файла.
Name Возвратит имя файла.

Часто используемые методы класса FileInfo:

Метод Описание
public StreamWriter AppendText() Создает StreamWriter, который добавляет текст к файлу, представленному этим экземпляром FileInfo.
public FileStream Create() Создает файл.
public override void Delete() Полностью удаляет файл с диска.
public void MoveTo(string destFileName) Переименовывает (перемещает в новое место) указанный файл с предоставлением опции указания нового имени файла.
public FileStream Open(FileMode mode) Откроет файл в указанном режиме.
public FileStream Open(FileMode mode, FileAccess access) Откроет файл в указанном режиме с доступом только чтение, только запись или и чтение, и запись.
public FileStream Open(FileMode mode, FileAccess access, FileShare share) Откроет файл в указанном режиме с доступом только чтение, только запись или и чтение, и запись, и с указанной опцией совместного доступа.
public FileStream OpenRead() Создает FileStream только для чтения.
public FileStream OpenWrite() Создает FileStream только для записи.

Для получения полного списка свойств и методов обратитесь к документации C# от Microsoft.

Следующий пример демонстрирует использование вышеупомянутых классов:

После этого скомпилируйте и запустите эту программу, это отобразит имена файлов и их соответствующие размеры в директории Windows.

Работа с файлами в Си-шарп. Классы StreamReader и StreamWriter

Файл – это набор данных, который хранится на внешнем запоминающем устройстве (например на жестком диске). Файл имеет имя и расширение. Расширение позволяет идентифицировать, какие данные и в каком формате хранятся в файле.

Под работой с файлами подразумевается:

— cоздание файлов;
— удаление файлов;
— чтение данных;
— запись данных;

— изменение параметров файла (имя, расширение…);
— другое.

В Си-шарп есть пространство имен System.IO, в котором реализованы все необходимые нам классы для работы с файлами. Чтобы подключить это пространство имен, необходимо в самом начале программы добавить строку using System.IO. Для использования кодировок еще добавим пространство using System.Text;

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

Как создать файл?

Для создания пустого файла, в классе File есть метод Create(). Он принимает один аргумент – путь. Ниже приведен пример создания пустого текстового файла new_file.txt на диске D:

static void Main(string[] args)
<
File.Create(«D:\\new_file.txt»);
>

Если файл с таким именем уже существует, он будет переписан на новый пустой файл.

Метод WriteAllText() создает новый файл (если такого нет), либо открывает существующий и записывает текст, заменяя всё, что было в файле:

static void Main(string[] args)
<
File. WriteAllText(«D:\\new_file.txt», «текст»);
>

Метод AppendAllText() работает, как и метод WriteAllText() за исключением того, что новый текст дописывается в конец файла, а не переписывает всё что было в файле:

static void Main(string[] args)
<
File.AppendAllText(«D:\\new_file.txt», «текст метода AppendAllText ()»); //допишет текст в конец файла
>

Как удалить файл?

Метод Delete() удаляет файл по указаному пути:

static void Main(string[] args)
<
File.Delete(«d:\\test.txt»); //удаление файла
>

Кроме того, чтобы читать/записывать данные в файл с Си-шарп можно использовать потоки.

Поток – это абстрактное представление данных (в байтах), которое облегчает работу с ними. В качестве источника данных может быть файл, устройство ввода-вывода, принтер.

Класс Stream является абстрактным базовым классом для всех потоковых классов в Си-шарп. Для работы с файлами нам понадобится класс FileStream(файловый поток).

FileStream — представляет поток, который позволяет выполнять операции чтения/записи в файл.

static void Main(string[] args)
<
FileStream file = new FileStream(«d:\\test.txt», FileMode.Open
, FileAccess.Read); //открывает файл только на чтение
>

Режимы открытия FileMode:


Append – открывает файл (если существует) и переводит указатель в конец файла (данные будут дописываться в конец), или создает новый файл. Данный режим возможен только при режиме доступа FileAccess.Write.
Create — создает новый файл(если существует – заменяет)
CreateNew – создает новый файл (если существует – генерируется исключение)
Open — открывает файл (если не существует – генерируется исключение)
OpenOrCreate – открывает файл, либо создает новый, если его не существует
Truncate – открывает файл, но все данные внутри файла затирает (если файла не существует – генерируется исключение)

static void Main(string[] args)
<
FileStream file1 = new FileStream(«d:\\file1.txt», FileMode.CreateNew); //создание нового файла
FileStream file2 = new FileStream(«d:\\file2.txt», FileMode.Open); //открытие существующего файла
FileStream file3 = new FileStream(«d:\\file3.txt», FileMode.Append); //открытие файла на дозапись в конец файла
>

Режим доступа FileAccess:

Read – открытие файла только на чтение. При попытке записи генерируется исключение
Write — открытие файла только на запись. При попытке чтения генерируется исключение
ReadWrite — открытие файла на чтение и запись.

Чтение из файла

Для чтения данных из потока нам понадобится класс StreamReader. В нем реализовано множество методов для удобного считывания данных. Ниже приведена программа, которая выводит содержимое файла на экран:

static void Main(string[] args)
<
FileStream file1 = new FileStream(«d:\\test.txt», FileMode.Open); //создаем файловый поток
StreamReader reader = new StreamReader(file1); // создаем «потоковый читатель» и связываем его с файловым потоком
Console.WriteLine(reader.ReadToEnd()); //считываем все данные с потока и выводим на экран
reader.Close(); //закрываем поток
Console.ReadLine();
>

Метод ReadToEnd() считывает все данные из файла. ReadLine() – считывает одну строку (указатель потока при этом переходит на новую строку, и при следующем вызове метода будет считана следующая строка).

Свойство EndOfStream указывает, находится ли текущая позиция в потоке в конце потока (достигнут ли конец файла). Возвращает true или false.

Запись в файл

Для записи данных в поток используется класс StreamWriter. Пример записи в файл:

static void Main(string[] args)
<
FileStream file1 = new FileStream(«d:\\test.txt», FileMode.Create); //создаем файловый поток
StreamWriter writer = new StreamWriter(file1); //создаем «потоковый писатель» и связываем его с файловым потоком
writer.Write(«текст»); //записываем в файл
writer.Close(); //закрываем поток. Не закрыв поток, в файл ничего не запишется
>

Метод WriteLine() записывает в файл построчно (то же самое, что и простая запись с помощью Write(), только в конце добавляется новая строка).

Нужно всегда помнить, что после работы с потоком, его нужно закрыть (освободить ресурсы), использовав метод Close().

Кодировка, в которой будут считываться/записываться данные указывается при создании StreamReader/StreamWriter:

static void Main(string[] args)
<
FileStream file1 = new FileStream(«d:\\test.txt», FileMode.Open);
StreamReader reader = new StreamReader(file1, Encoding.Unicode);
StreamWriter writer = new StreamWriter(file1, Encoding.UTF8);
>

Кроме того, при использовании StreamReader и StreamWriter можно не создавать отдельно файловый поток FileStream, а сделать это сразу при создании StreamReader/StreamWriter:

static void Main(string[] args)
<
StreamWriter writer = new StreamWriter(«d:\\test.txt»); //указываем путь к файлу, а не поток
writer.WriteLine(«текст»);
writer.Close();
>

Как создать папку?

С помощью статического метода CreateDirectory() класса Directory:

static void Main(string[] args)
<
Directory.CreateDirectory(«d:\\new_folder»);
>

Как удалить папку?

Для удаления папок используется метод Delete():

static void Main(string[] args)
<
Directory.Delete(«d:\\new_folder»); //удаление пустой папки
>

Если папка не пустая, необходимо указать параметр рекурсивного удаления — true:

static void Main(string[] args)
<
Directory.Delete(«d:\\new_folder», true); //удаление папки, и всего, что внутри
>

Домашнее задание

Задача 1. Создайте файл numbers.txt и запишите в него натуральные числа от 1 до 500 через запятую.

Задача 2. Дан массив строк: «red», «green», «black», «white», «blue». Запишите в файл элементы массива построчно (каждый элемент в новой строке).

Задача 3. Возьмите любой текстовый файл, и найдите в нем размер самой длинной строки.

PS. Не забываем подписываться на обновления по электронной почте в форме ниже!


Механическое удерживание земляных масс: Механическое удерживание земляных масс на склоне обеспечивают контрфорсными сооружениями различных конструкций.

Организация стока поверхностных вод: Наибольшее количество влаги на земном шаре испаряется с поверхности морей и океанов (88‰).

Обработка файлов в С#. NET

Введение

Статья объяснит Вам, как выполнять задачи по считыванию и введению файловой информации из разных областей, используя С#. .NET программирование API. Оно включает анализ структуры каталогов, определяет существующие папки и файлы, а также выполняет операции, связанные с файлами: перемещение, копирование и удаление объектов с диска. Цель статьи – определить типы, которые содержатся в области имен System.IO и объяснить, как разными способами можно считывать и вводить информацию в символьно-ориентированый, бинарный и строчный архив данных.

Структура файловой системы

Область имен System.IO состоит из 4 классов, которые помогут Вам оперировать конкретными файлами, работать с машинной структурой каталогов. Каталог адресов и файлов непосредственно наследует System.Object и поэтому выполняет задачи создания, копирования, перемещения и удаления файлов, используя при этом разные статические способы. Они содержат только статические методы, а главное то, что на их основе никогда не создаются экземпляры. Типы FileInfo и DirectotryInfo возникли от базового класса типа FileSystemInfo и обычно их используют, чтобы получить детальную информацию про файл или каталог, поскольку их элементы обычно настроены на возвращение типизованых объектов. Они используют те же общедоступные методы, что и каталог адресов и файлов, но могут сохранять данные, а элементы этих классов не статичные.

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

Этот класс используется для сохранения текстовой информации в файле.

Классовые типы Характеристика
Хранилище/содержание каталогов Классовые типы данных помогают управлять системой структуры каталогов.
Информация про накопитель Этот класс данных предоставляет детальную информацию про накопители, которые содержатся в компьютере.
Файловий поток Класс данных предоставляет Вам файл прямого доступа с информацией в виде потока байтов.
Файл/сведения про файл Классовые типы данных руководят файлами, которые содержатся в компьютере.
Путь Этот класс выполняет операции в System.String, в котором содержится информация про файл и каталог независимо от платформы.
Устройство двойного считывания/устройство двойного введения информации Классовые типы позволяют Вам сохранять и находить простые типы данных в виде двойных значений.
Поток считывания/поток введения
Строчная последовательность считывания/строчная последовательность введения информации Эти классовые типы данных также работают с текстовой информацией. Однако, базовая система хранилища – скорее, строчный буфер, чем физический файл.
Поток буферизации В этом типе можно лишь временно хранить поток байтов. Вы можете разместить данные в хранилище позже.

В System.IO содержится класс DriveInfo, чтобы руководить системой диска во время произведения разных операций. Класс DriveInfo предоставляет детальную и полную информацию про количество дисков, общее пространство на жёстком диске, свободное пространство, название диска, состояние готовности и другое. Обратите внимание на следующую программу, которая показывает основные дисководы:

DriveInfo[] di = DriveInfo.GetDrives();

Console.WriteLine( «Total Partitions» );

foreach(DriveInfo items in di)

Следующие фрагменты кода отдельно выполняют все другие операции класса DriveInfo.

C#: Файлы и как с ними работать

Сегодня я решил рассказать тем, кто еще только начинает изучать язык программирования C# о механизме работы с файлами.
Работа с файлами в C# возможна благодаря очень мощному неймспейсу System.IO. Мы рассмотрим две основных возможности данной библиотеки — работа с файлами и работа с текстовыми файлами. Да да, разработчики уделили отдельное внимание методам для работы с текстовыми файлами — за что им стоит сказать огромное спасибо. Ведь это значительно облегчает процесс разработки. Начнем рассматривать методы работы с файлами.

Работа с текстовыми файлами в C#

Для работы с текстовыми файлами применяются два класса StreamReader и StreamWriter. По названию классов видно, что первый используется для работы с файлами в режиме чтения, второй для работы в режиме записи. Они интуитивно понятны, так как все их методы явно отражают действия. Приведем пример чтения по строкам:

Объект sr так же имеет методы ReadToEnd, ReadBlock и другие. Названия этих методов говорят сами за себя.

Пример записи в файл:

Так же стоит отметить, что оба класса реализуют интерфейс IDisposable. А это означает, что предпочтительней использовать конструкцию using.

Более того в библиотеке IO есть несколько предопределенных наиболее часто используемых операций. Нет смысла подробно описывать данные функции, нужно просто запомнить их ��

Чтение всего текстового файла в переменную

Чтение всего текстового файла построчно в массив

Работа с бинарными файлами в C#

C# позволяет очень гибко работать с бинарными файлами. В связи с этим вариантов написать один и тот же код очень много. Поэтому я просто приведу пример базовой работы с файлами на примере копирования файла с использованием FileStream.

Примечание: Параметры FileMode, FileAccess и FileShare играют очень важную. Они отвечают за флаги, которые будут проставлены файлу, пока он занят вашей программой. Именно они могут запретить/разрешить доступ к файлу сторонним программам, либо «попросить» разрешение на чтение уже занятого файла.

Чтение текстового файла построчно на C#

Два самых простых способа как прочитать текстовый файл построчно на C#. В обоих случаях используется using System.IO;. Напишу сразу примеры кода без всяких прелюдий.


Способ 1

Классический вариант чтения файла построчно:

Еще один пример, как можно организовать цикл построчного чтения:

Указать кодировку при чтении файла (например, DOS-кодировку) можно так:

Так же можно использовать обёртку using чтобы не закрывать файл после чтения.

Способ 2

Прочитать весь файл целиком в массив строк:

Раздел 2 Основы работы с файлами и директориями в C#

Глава 1 Использование контролов OpenFileDialog и SaveFileDialog для работы с файлами

Для изучения работы с контролами OpenFileDialog и SaveFileDialog создадим новое решение (подробно о создании проекта решения было раказано в первом разделе книги) или изменим уже ипользованный проект (убрав коды обработчиков событий нажатия кнопок, изменив надписи и картиночки) и поместим на форму контролы RichTextBox, OpenFileDialog и SaveFileDialog. Контролы OpenFileDialog и SaveFileDialog не визуальные и, потому, разместились ниже формы. Проект решения с которым будем работать примет вид, показанный на Рис.1.

Рис.1 Проект решения для работы с OpenFileDialog и SaveFileDialog

Дважды кликнем на форме (вне контролов) и, таким образом, создадим обработчик Form1_Load, который будет вызываться при каждой загрузки формы и который в дальнейшем будем часто использовать для начальной инициализации параметров программы и переменных. В обработчике запишем код очистки RichTextBox:

Обработчик нажатия кнопки 3 оставим прежний:

Параграф 1 Ипользование контрола OpenFileDialog

Основные свойства OpenFileDialog

Свойство AddExtension разрешает или запрещает автоматическое добавление расширение, указанное в свойстве DefaultExt.

Свойство DefaultExt — расширение, принятое по умолчанию для автоматического добавления к имени файла при AddExtension=true.

Свойство CheckFileExists — используется для получения или устанавки значения, указывающего отображать или нет диалоговое окно предупреждения, если пользователь указал в свойстве FileName имя файла, которого не существует в данной директории и нажал кнопку «Oткрыть» при невыбранном кликом мышки файле. При CheckFileExists=true вместо прерывания будет выдано сообщение, что такого файла нет и исключения не вызывается.

На Рис.2 показано окно предупреждение при FileName=a.doc, CheckFileExists=true и нажатии кнопки «Oткрыть» при невыбранном файле.

Рис.2 Окно предупреждения при CheckFileExists=true

Свойство FileName — имя файла по умолчанию для выборки если была нажата кнопка OK и не выбрн кликом мышки файл в окне диалога.

Свойство CheckPatchExists — используется для получения или устанавки значения, указывающего отображать или нет диалоговое окно предупреждения, если пользователь указал в свойстве FileName имя файла с несуществующим именем директории. Окно полностью анлогично показанному на Рис.2., например, при FileName=С:\3\a.doc и не выбранном файле в директории C:\ и нажатии кнопки «Oткрыть» будет выдано сообщение, поазанное на Рис.3. При CheckPatchExists=true вместо прерывания будет выдано только сообщение.

Рис.3 Окно предупреждения при CheckPatchExists=true

Свойство DereferenceLinks — используется для указания контролу что именно возвращпть при выборе файла ссылки — файл по ссылке (true) или файл самой сылки (false).

Свойства Filter, FilterIndex — фильтр для выбираемых файлов и индекс строки, отображаемой в окошечке «Имя файла». Например значение свойства заданного строкой при FilterIndex=1.

позволит выбрать только текстовые файлы в формате rtf или txt. В окошечке «Тип файла» будет только две строки:

а в окошечке «Имя файла» будет отображена первая.

Свойство InitialDirectory — директория, которая выбирается при старте OpenFileDialog.

Свойство MultiSelect — при значении true позволяет выбрать мышкой при нажатой кнопке Shift или Ctrl несколько файлов и сохранить их имена в свойстве FileNames в виде массива строк.

Свойство ReadOnlyChecked — при значении true позволяет открывать команде OpenFile выбранные файлы только в режиме чтения.

Свойство RestoreDirectory — при true диалоговое окно восстанавливает текущий каталог к первоначальному значению если пользователь изменил каталог при поиске файлов, при false — нет.

Свойство работает только если закрыт поток Stream, созданный методом openFileDialog1.OpenFile().


Свойство ShowHelp — при значении true в окне диалога отображается кнопка «Справка».

Свойство ShowReadOnly — при значении true в окне диалога отображается переключатель «Только для чтения».

Свойство Title — заголовок диалогового окна.

Свойство ValidateNames — при true проверяет допустимость имени для файла применительно к Win32. Никакое заданное по умолчанию в этом случае не добавляется.

Отметим, что ве свойcтва могут быть заданы на этапе проектирования и программно — путем присвоения соответствующих значений.

Загрузка содержимого файла с использованием OpenFileDialog

Утановим для OpenFileDialog следующие значения свойств:

Filter — rtf файлы (*.rtf)|*.rtf

Пометим в директорию C:\ какой либо файл в формате .rtf (например который был создан в первом разделе «a.tf») и загрузим его в RichTextBox. Для этого напишем в обработчике нажатия кнопки 1 следующий код:

Ели мы выбрали файл C:\a.rtf, то это имя отобразится в заглавии формы.

Если теперь в войстве FileName запишем a.rtf, то при открытии диалога буковка «a» появляется в окошечке «Имя файла» и можно выполнить загрузку не выбирая мышкой файл, а сразу нажав кнопочку «OK».

Дотаточно в войстве FileName записать a.doc и повторить то, что только что проделали выше, как получим предупреждение об отсутствии файла (см Рис.2) и файл уже придется выбирать кликом мышки (кстати, отетим еще раз, что если утановить войство CheckFileExists в false то получим возбуждение иключения).

Рассмотрим еще один способ, который позволяет загружать фйлы в формате .txt. Добавим на форму контрол TextBox и установим его свойство MultiLine в true, в обработчике Form1_Load допишем строку

а cвойству Filter присвоим значение

В обработчике события нажатия кнопки 1 напишем код для чтения текстовых файлов.

Ели прочитаем текстовый файл в формате .rtf, то увидим уже знакомое нам по первому разделу содержимое файла, а при чтении текстового файла в формате .txt именно текст (см Рис.4).

Рис.4 Чтение файлов в формате .rtf(сле) и.txt(спрва) в ткстовом режиме

Параграф 2 Ипользование контрола SaveFileDialog

Основные свойства SaveFileDialog

Следует отметить, что все свойства отображаемые в окне Proporties для SaveFileDialog аналогичны OpenFileDialog и имеют тоже назначение и тот же принцип использования, и, поэтому, в отдельном их расмотрении нет необходимости.

Сохранение информации в файл с использованием SaveFileDialog

Уcтановим для SaveFileDialog следующие значения свойств:

Filter — rtf файлы (*.rtf)|*.rtf|txt файлы(*.txt)|*.txt

Последнее актуально именно для SaveFileDialog и позволяет не задавать в окошечке «имя файла» полное имя если файл будет сохраняться как .rtf файл.

Для обработчика события нажатия кнопки 2 нпишем следующий код:

Ресурсы локализованных приложений

C# и .NET — Основы .NET — Ресурсы локализованных приложений

Ресурсы, подобные изображениям и строковым таблицам, могут помещаться в файлы ресурсов или подчиненные сборки. Эти ресурсы могут быть очень полезны при локализации приложений, и в .NET предлагается встроенная поддержка для поиска локализованных ресурсов.

Прежде чем посмотреть, как применять ресурсы для локализации приложений, сначала ознакомимся с методами создания и чтения ресурсов без принятия во внимание языковых аспектов.


Создание файлов ресурсов

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

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

Ниже показан пример создания простой таблицы строк:

Утилита Resgen.exe

Для создания из ***.txt файла ресурсов можно воспользоваться специальной утилитой генерации файлов ресурсов Resgen.exe. Например, ввод следующей команды:

приведет к созданию файла MyResources.resources. Сгенерированный этой утилитой файл ресурсов далее можно либо добавить в сборку как внешний файл, либо вставить в сборку DLL или ЕХЕ. Утилита Resgen также поддерживает возможность создания файлов ресурсов в формате XML с расширением .resX. Применяется она очень просто:

Выполнение этой команды приведет к созданию XML-файла ресурсов по имени MyResources.resX.

Утилита Resgen поддерживает строго типизированные ресурсы. Строго типизированный ресурс представляется в виде класса, который получает доступ к ресурсам. Для создания такого класса в утилите Resgen предусмотрена опция /str:

После опции /str должен быть указан язык, пространство имен, имя класса и имя файла исходного кода, причем именно в таком порядке.

Возможность добавления изображений утилита Resgen не поддерживает. Среди примеров .NET Framework SDK есть и пример ResXGen с обучающими руководствами. В ResXGen можно ссылаться на изображения в файле .resX. Добавлять изображения можно также программно с применением классов ResourceWriter или ResXResourceWriter, как будет показано далее.

Класс ResourceWriter

Вместо использования для создания файлов ресурсов утилиты Resgen можно написать специальную, позволяющую это делать программу. Класс ResourceWriter из пространства имен System.Resources служит для создания бинарных файлов ресурсов, а класс ResXResourceWriter — для создания файлов ресурсов на базе XML. Оба эти класса поддерживают возможность добавления изображений и любых других сериализуемых объектов. В случае применения класса ResXResourceWriter потребуется сослаться на сборку System.Windows.Forms.

В следующем примере кода демонстрируется создание объекта ResXResourceWriter по имени rw в файле Demo.resx. После создания экземпляра с помощью метода AddResource() класса ResXResourceWriter можно приступать к добавлению набора ресурсов общим объемом до 2 Гбайт. Первый аргумент в AddResource() позволяет указывать имя ресурса, а второй — значение. Ресурс изображения можно добавлять за счет применения экземпляра класса Image. Чтобы можно было использовать класс Image, необходимо сослаться на сборку System.Drawing, а также добавить директиву using для открытия пространства имен System.Drawing.

Здесь объект Image создается за счет открытия файла logo.gif, поэтому потребуется либо скопировать этот файл изображения в каталог исполняемой программы, либо указать полный путь к нему в аргументе метода ImageToFile(). Оператор using указывает, что ресурс изображения должен автоматически уничтожаться в конце блока using.

Далее в объект ResXResourceWriter добавляются простые строковые ресурсы. В конце метод Close() класса ResXResourceWriter автоматически вызывает ResXResourceWriter.Generate() для осуществления записи ресурсов в файл Demo.resx:

Запуск этой небольшой программы приведет к созданию файла ресурсов Demo.resx с изображением logo.gif внутри.

Использование файлов ресурсов

Добавлять файлы ресурсов в сборки можно либо с помощью работающего из командной строки C#-компилятора csc.exe с опцией /resource, либо прямо в Visual Studio 2010. Чтобы посмотреть, как работать с файлами ресурсов в Visual Studio 2010, создайте проект консольного приложения по имени ResourceDemo.

Добавьте в этот проект созданный ранее файл ресурсов Demo.resx, открыв в окне Solution Explorer контекстное меню и выбрав в нем пункт Add Add Existing Item (Добавить Добавить существующий элемент). По умолчанию для свойства Build Action (Действие при компоновке) этого ресурса будет установлено значение Embedded Resource (Встраиваемый ресурс), указывающее, что этот ресурс должен встраиваться в выходную сборку.

Далее в параметрах проекта (за счет выбора Application Assembly information (Приложение Информация о сборке)) следует установить в качестве значения параметра Neutral Language (Нейтральный язык) основной язык:

Изменение значения этого параметра приведет к добавлению в файл assemblyinfо.cs атрибута [NeutralResourceLanguageAttribute], как показано ниже:

Установка значения для данного атрибута улучшит производительность ResourceManager, поскольку позволит ему быстрее отыскивать ресурсы для en-US, а также использовать их в качестве варианта по умолчанию. В этом атрибуте можно также указать место размещения используемого по умолчанию ресурса за счет применения второго параметра в конструкторе. С помощью перечисления UltimateResourceFallbackLocation можно указать, что он должен размещаться в главной сборке (значение MainAssembly) или же в подчиненной (значение Satellite).

После компоновки проекта можно просмотреть сгенерированную сборку утилитой ildasm и увидеть в манифесте атрибут, .mresource. Атрибут .mresource объявляет имя для ресурса в сборке. Если .mresource объявлен public (как в данном примере), это означает, что ресурс может экспортироваться из сборки и использоваться в классах других сборок. Если же .mresource объявлен private, это значит, что ресурс экспортироваться не может и доступен только в пределах данной сборки.

Для получения доступа к встроенному ресурсу используется класс ResourceManager, который находится в пространстве имен System.Resources. Конструктору этого класса в качестве аргумента можно передать имя сборки, в которой содержатся ресурсы.

В рассматриваемом примере ресурсы встроены в исполняемую сборку, поэтому во втором аргументе конструктору должен быть передан результат выполнения метода Assembly.GetExecutingAssembly(). В первом аргументе передается корневое имя ресурсов, состоящее из названия пространства имен и имени файла ресурсов, но без расширения resources. Как было показано ранее, это имя можно отобразить с помощью утилиты ildasm и просто удалить из него расширение resources. Имя можно также получить и программно с применением метода GetManifestResourceNames() класса System.Reflection.Assembly:

Для создания строго типизированного ресурса в редакторе управляемых ресурсов (Managed Resources Editor) можно изменить значение параметра Access Modifier (Модификатор доступа) с No Code Generation (Не генерировать никакой код) на Public (Общедоступный) или Internal (Внутренний). В случае установки значения Public генерируемый класс снабжается модификатором доступа public и тогда к нему возможен доступ из других сборок. При установке значения Internal генерируемый класс получает модификатор доступа internal и доступ к нему может осуществляться только изнутри сборки, в которой он находится.

Пространство имен System.Resources

Давайте кратко пройдемся по всем классам, которые содержатся в пространстве имен System.Resources и позволяют работать с ресурсами.

Класс ResourceManager

Может использоваться для получения ресурсов, относящихся к текущей культуре, из сборок или файлов ресурсов. С помощью ResourceManager можно получать сразу целый набор ресурсов для определенной культуры в виде экземпляра ResourceSet.


Класс ResourceSet

Позволяет представлять набор ресурсов для определенной культуры. При создании экземпляр ResourceSet он производит перечисление по классу, реализуя интерфейс IResourceReader, и сохраняет все ресурсы в HashTable.

Интерфейс IResourceReader

Используется в ResourceSet для перечисления ресурсов. Класс ResourceReader реализует этот интерфейс.

Класс ResourceWriter

Применяется для создания файла ресурсов и реализует интерфейс IResourceWriter.

Классы ResXResourceSet, ResXResourceReader и ResXResourceWriter

Похожи на классы ResourceSet, ResourceReader и ResourceWriter, но служат для создания не бинарного файла ресурсов, а не XML-файла .resx. Вместо того чтобы встраивать ресурс в XML-файл, они позволяют добавлять на него ссылку с помощью ResXFileRef.

Пространство имен System.Resources.Tools

Содержит класс StronglyTypedResourceBuilder, который можно использовать для создания класса из ресурса.

C# → Запись и чтение из файла

Работа с файлами. Побайтовое чтение/запись. Чтение текстовых данных

Любой ввод и вывод информации в .Net Framework включает в себя использование потоков.

Поток — абстрактное представление последовательного устройств, облегчающее последовательное хранение данных и доступ к ним (по одному байту в каждый конкретный момент времени). В качестве такого устройства могут выступать расположенный на диске файл, принтер, область памяти, любой другой объект допускающий последовательное считывание и запись информации).

В пространстве имен System.IO хранятся классы, предназначенные для считывания и записи данных в файлы. Классы:

File – содержит статические методы для манипуляции файлами (создание, копирование, удаление); Directory – содержит статические методы для манипуляции директориями;

Path – статических класс, «путь»; FileInfo – не обладает статическими методами, соответствует физическому фалу, во многом дублирует функциональность File;

FileStream – представляет поток, указывающий на файл или местоположение в сети. Представляет файл для считывания/записи, оперирует байтами и массивом байтов, в то время как Stream оперирует символьными данными.

Класс FileStream поддерживает внутренний указатель файла, ссылающийся на то место в файле, в котором будет производиться очередная операция чтения/записи. Метод Seek() позволяет осуществить поиск конкретной позиции в файле (байтовой).

При чтении и записи в файл, происходит изменение позиции указателя (при считывании на 1б)

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

StreamWriter – позволяет осуществлять запись в файл символов и строк и самостоятельно выполняет все необходимые преобразования.

StreamReader – осуществляет чтение символьных данных из потока и их преобразование.

FileStreamWatcher – используется для слежения за состоянием файловой системы (файлов и директорий) и генерирует события в моменты, когда изменяется их местоположение. Сначала нужно задать значения свойств, определив, где следует осуществлять контроль, что нужно контролировать и когда следует генерировать события. Свойства:

Path – путь к файлу/директории, подлежащей контрою.

NotifyFilter – сочетание значений перечисляемого типа NotifyFilters, которое позволяет определить за наступлением каких именно событий для данных файлов следует наблюдать. < Attributes, CreationTime, DirectoryName, FileName, LastAccess, LastWrite, Security, Size >. Допускается использование различных сочетаний этих значений посредством оператора | или &.

Filter – фильтр, определяющий какие именно файлы подлежат контролю, например, *.txt

EnableRaisingEvents – после задания всех свойст необходимо присвоить значение true, что будет означать начало наблюдения .

Асинхронный доступ к файлам

Приложение может выполнять какие-то действия параллельно с процессом ввода/вывода файла, вместо ожидания окончания этого процесса. Процесс считываня файла начинается с вызова метода BeginRead(), методу передаются параметры аналогичные методу Read() + дополнительные, необходимые для осуществления асинхронного процесса.

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

Создается экземпляр класса AsyncReader, а заме продолжается выполнение – вывод порядковых чисел на консоль; теперь этому методу не приходиться отслеживать процедуру считывания, и он может выполнять какие-либо другие действия, совершенно от этой процедуры не зависящие. Метод HandleRead вызывается системой, когда завершается процедура считывания файла. Это позволяет приложению продолжать обработку какой-либо иной информации, пока выполняется относительно медленная процедура считывания файла.

Цукерберг рекомендует:  Эффектный переключатель с использованием CSS3 и jQuery
Понравилась статья? Поделиться с друзьями:
Все языки программирования для начинающих