Иногда одна строчка кода стоит огромного количества сил и времени. Но зачем терять время на изобретение велосипедов. Ведь кто-то это уже точно писал до нас. Поэтому было принято волевое решение делать несколько постов в неделю, в которых я буду писать небольшие блоки кода, которые зачастую просто вылетают из головы в самый неподходящий момент. В одном выпуске будет 3-5 небольших блока кода с подробным описанием и особенностями использования.
Итак.. Начнем!
Файлы и директории
1. Получение списка файлов в папке
Есть много вариантов. Но мы рассмотрим два:
1 2 3 4 5 |
string[] files = Directory.GetFiles(@"D:\"); foreach (string file in files) { MessageBox.Show(file); } |
Directory.GetFiles(string path) возвращает массив строк, где каждая строка — это путь к файлу, который был найден в данном каталоге. Но данный код будет вести поиск только в данной папке, то есть файлы в подпапках учитываться не будут. Данный метод имеет возможность фильтрации. Например, если нам нужно отобразить только все картинки формата JPG — можно использовать следующий код:
1 2 3 4 5 |
string[] files = Directory.GetFiles(@"D:\","*.jpg"); foreach (string file in files) { MessageBox.Show(file); } |
Это уже позволяет осуществлять фильтрацию, однако это всё ещё поиск без подпапок. Внимательно посмотрев все перегрузки данного метода можно обнаружить, что его всё-таки можно заставить искать все содержимое данной папки. Для этого нужно просто добавить ещё один параметр:
SearchOption.AllDirectories. Если посмотреть какие вариант есть ещё, то окажется, что их всего два:
1) SearchOption.AllDirectories;
2) SearchOption.TopDirectoryOnly;
Как видно из названия — второй пункт используется по умолчанию.
Следующий код ищет все файлы в папке, включая те, что расположены в подпапках:
1 2 3 4 5 |
string[] files = Directory.GetFiles(@"D:\BackUps", "*.apk", SearchOption.AllDirectories); foreach (string file in files) { MessageBox.Show(file); } |
2. Русская кодировка в файлах
Думаю все сталкивались с ситуацией, когда при чтении/записи русского текста выводились/сохранялись страшные символы не имеющие ничего общего с тем текстом, с которым вы работали.
Многие воспринимают это как «кривость», или «баг». Нет, ребята. Это не баг — это фича =).
Как все мы знаем — текст сохраняется в определенной кодировке. Где каждому возможному символу соответствует определенный байт (или даже 2 байта). Поэтому есть однобайтовые кодировки и двубайтные кодировки.
Преимущества и недостатки данных кодировок очевидны — однобайтная кодировка содержит в себе только 256 символов (один байт = 8 бит = 2^8 (так как бит равен или 0, или 1) = 256). Если предположить, что в алфавите 30 букв, то 3 алфавита — это 90 символов. Их нужно умножить на два, так как буквы могут быть маленькими и большими. Выходит 180 символов. Остается всего 76 символов. Выходит минус однобайтовой кодировки в том, что она сильно ограничена символами. А плюс, соответственно, в том, что она маловесна. И текст из 1000 символов будет иметь размер лишь 1000 байт. В то время у двубайтной кодировки вес будет уже 2000 байт. Зато у двубайтной кодировки уже возможно 65536 символов.
Именно из-за того, что кодировок много — каждому тяжело угодить даже с двубайтной кодировкой. Поэтому если вы хотите, чтобы российский текст корректно сохранялся и читался — нужно указывать необходимую кодировку. Обычно используется кодировка Windows-1251.
Код для чтения текста из файла:
1 2 3 4 |
StreamReader streamReader = new StreamReader(file, Encoding.GetEncoding("windows-1251")); string text = streamReader.ReadToEnd(); streamReader.Close(); streamReader.Dispose(); |
Соответственно для записи:
1 2 3 4 |
StreamWriter streamWriter = new StreamWriter(filename, false, Encoding.GetEncoding("windows-1251")); streamWriter.Write(contain); streamWriter.Close(); streamWriter.Dispose(); |
Кстати насчет записи.. При объявлении StreamWriter используется 3 параметра. Первый — путь к файлу. Третий — указание кодировки. А второй таинственный false — является флагом дописывания в файл.
Если стоит false — то каждый раз при объявлении записи в данный файл его старое содержимое будет обнуляться.
Если стоит true — то всё будет дописываться.
То есть если ваша программа ведет лог ошибок, то лучше ставить true, чтобы пользователь мог посмотреть всю историю ошибок программы за весь период пользования.