Котодомик

C# Работа с файлами и кодировки

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

Итак.. Начнем!

Файлы и директории

1. Получение списка файлов в папке

Есть много вариантов. Но мы рассмотрим два:

Directory.GetFiles(string path) возвращает массив строк, где каждая строка — это путь к файлу, который был найден в данном каталоге. Но данный код будет вести поиск только в данной папке, то есть файлы в подпапках учитываться не будут. Данный метод имеет возможность фильтрации. Например, если нам нужно отобразить только все картинки формата JPG — можно использовать следующий код:

Это уже позволяет осуществлять фильтрацию, однако это всё ещё поиск без подпапок. Внимательно посмотрев все перегрузки данного метода можно обнаружить, что его всё-таки можно заставить искать все содержимое данной папки. Для этого нужно просто добавить ещё один параметр:

SearchOption.AllDirectories. Если посмотреть какие вариант есть ещё, то окажется, что их всего два:

1) SearchOption.AllDirectories;

2) SearchOption.TopDirectoryOnly;

Как видно из названия — второй пункт используется по умолчанию.

Следующий код ищет все файлы в папке, включая те, что расположены в подпапках:

 

 2. Русская кодировка в файлах

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

Многие воспринимают это как «кривость», или «баг». Нет, ребята. Это не баг — это фича =).

Как все мы знаем — текст сохраняется в определенной кодировке. Где каждому возможному символу соответствует определенный байт (или даже 2 байта). Поэтому есть однобайтовые кодировки и двубайтные кодировки.

Преимущества и недостатки данных кодировок очевидны — однобайтная кодировка содержит в себе только 256 символов (один байт = 8 бит = 2^8 (так как бит равен или 0, или 1) = 256). Если предположить, что в алфавите 30 букв, то 3 алфавита — это 90 символов. Их нужно умножить на два, так как буквы могут быть маленькими и большими. Выходит 180 символов. Остается всего 76 символов. Выходит минус однобайтовой кодировки в том, что она сильно ограничена символами. А плюс, соответственно, в том, что она маловесна. И текст из 1000 символов будет иметь размер лишь 1000 байт. В то время у двубайтной кодировки вес будет уже 2000 байт. Зато у двубайтной кодировки уже возможно 65536 символов.

Именно из-за того, что кодировок много — каждому тяжело угодить даже с двубайтной кодировкой. Поэтому если вы хотите, чтобы российский текст корректно сохранялся и читался — нужно указывать необходимую кодировку. Обычно используется кодировка Windows-1251.

Код для чтения текста из файла:

Соответственно для записи:

Кстати насчет записи.. При объявлении StreamWriter используется 3 параметра. Первый — путь к файлу. Третий — указание кодировки. А второй таинственный false — является флагом дописывания в файл.

Если стоит false — то каждый раз при объявлении записи в данный файл его старое содержимое будет обнуляться.

Если стоит true — то всё будет дописываться.

То есть если ваша программа ведет лог ошибок, то лучше ставить true, чтобы пользователь мог посмотреть всю историю ошибок программы за весь период пользования.

Exit mobile version