Підрозділ 18.Q
Питання для самоконтролю
Питання для самоконтролю — Розділ 18. Файлова система та потоки 18.1. Path, File, Directory 1. Чим відрізняється Path.Combine "C:\\data", "logs", "app.log" від простої конкатенації рядків через + ? Чому Path.Co
Питання для самоконтролю — Розділ 18. Файлова система та потоки
18.1. Path, File, Directory
Чим відрізняється
Path.Combine("C:\\data", "logs", "app.log")від простої конкатенації рядків через+? ЧомуPath.Combineє кращим вибором у кросплатформних застосунках?Розгляньте код:
string path = @"C:\projects\app\bin\Debug\app.exe"; Console.WriteLine(Path.GetDirectoryName(path)); Console.WriteLine(Path.GetFileNameWithoutExtension(path)); Console.WriteLine(Path.GetExtension(path));Що виведе кожен рядок? Поясніть різницю між
GetFileNameіGetFileNameWithoutExtension.Знайдіть помилку в наступному коді:
string dir = @"C:\reports\2024\january"; if (!Directory.Exists(dir)) Directory.CreateDirectory(dir); File.WriteAllText(dir + "report.txt", "data");Виправте її та поясніть, яка функція
Pathвирішує цю проблему.Порівняйте
Directory.GetFiles()іDirectory.EnumerateFiles(). У якому сценаріїEnumerateFilesматиме суттєву перевагу в продуктивності? Наведіть приклад такого сценарію.Напишіть метод
CleanOldLogs(string folder, int daysOld), який видаляє з папки всі.logфайли, що не змінювались більшеdaysOldднів. ВикористовуйтеFile.GetLastWriteTimeіDirectory.EnumerateFiles.Що відбудеться при виклику
Directory.Delete(@"C:\mydir")? Коли потрібен параметрrecursive: true? Яка небезпека рекурсивного видалення?Напишіть метод
EnsureBackupExists(string sourceFile), який копіює файл поряд з оригіналом з суфіксом.bak, але тільки якщо.bakще не існує або старіший за оригінал.
18.2. FileInfo та DirectoryInfo
Яка принципова різниця між статичним класом
Fileі класомFileInfo? Коли виправдано використовуватиFileInfoзамістьFile.GetXxx()методів?Розгляньте код:
var fi = new FileInfo(@"C:\data\report.csv"); Console.WriteLine(fi.Length); // ... зовнішній процес змінює файл ... Console.WriteLine(fi.Length);Чому другий
Console.WriteLineможе вивести хибне значення? Що треба зробити, щоб отримати актуальний розмір?Поясніть концепцію кешування метаданих у
FileInfo. Як це допомагає при роботі з багатьма операціями над одним файлом? Наведіть приклад коду, деFileInfoефективніший заFile.Що таке
FileSystemInfo? Яку роль він відіграє в ієрархії класів? Напишіть метод, що приймаєFileSystemInfoі виводить ім'я та дату створення незалежно від того, файл це чи директорія.Напишіть метод
GetLargestFiles(string directory, int count), що повертаєcountнайбільших файлів у директорії (включно з вкладеними) у вигляді колекціїFileInfo, відсортованих за спаданням розміру.DirectoryInfo.GetFileSystemInfos()повертаєFileSystemInfo[]. Чому це корисно? Напишіть код, що обходить директорію рекурсивно та виводить дерево файлів і папок з відступами відповідно до рівня вкладеності.Порівняйте підходи:
new FileInfo(path).ExistsпротиFile.Exists(path). Чи є між ними різниця в поведінці? Який з них кращий у циклі з 1000 перевірок одного й того самого файлу?
18.3. Stream та FileStream
Що таке абстрактний клас
Stream? Назвіть три найважливіших властивості Stream та поясніть їх значення. Чому Stream є абстрактним, а не інтерфейсом?Розгляньте код:
using var fs = new FileStream("data.bin", FileMode.Create); byte[] data = Encoding.UTF8.GetBytes("Hello"); fs.Write(data, 0, data.Length); // програма завершуєтьсяЩо станеться з даними без явного
Flush()? У яких умовахusingгарантує збереження даних?Поясніть різницю між
FileMode.Create,FileMode.CreateNewіFileMode.OpenOrCreate. Наведіть конкретний сценарій, де помилковий вибір режиму призведе до втрати даних.Навіщо потрібен параметр
FileShare? Напишіть код, що відкриває файл журналу так, щоб кілька процесів могли читати його одночасно, але жоден не міг писати під час читання.Реалізуйте метод
CopyStream(Stream source, Stream destination, int bufferSize), що копіює дані чанками вказаного розміру. Поясніть, чому порційне копіювання краще заsource.CopyTo(destination)у деяких випадках.Напишіть код, що використовує
Seek(offset, SeekOrigin)для читання останніх 100 байт файлу без завантаження всього файлу в пам'ять. Поясніть значенняSeekOrigin.End.Що таке
MemoryStream? Чим він відрізняється відFileStream? Поясніть параметрleaveOpenу контексті передачіMemoryStreamв інший об'єкт.Розгляньте сценарій: потрібно прочитати великий файл (2 ГБ), обробити дані та записати результат. Чому не варто використовувати
File.ReadAllBytes()? Як правильно організувати обробку за допомогоюFileStream?
18.4. StreamReader та StreamWriter
Чому
StreamReaderіStreamWriterназивають "декораторами"? Який паттерн проєктування тут реалізовано? Намалюйте (текстово) ланцюжок об'єктів при читанні UTF-8 файлу.Розгляньте код:
var writer = new StreamWriter("log.txt", append: true); writer.WriteLine("Entry 1"); writer.WriteLine("Entry 2"); // writer.Dispose() не викликаєтьсяЩо може статися з даними? Як
AutoFlush = trueзмінює поведінку? Які його переваги та недоліки?Напишіть метод
CountLinesInFile(string path), що підраховує кількість рядків у великому текстовому файлі (сотні мегабайт) без завантаження всього файлу в пам'ять. ЧомуReadLine()кращий заReadToEnd()у цьому випадку?Що таке
StringReaderіStringWriter? Навіщо вони потрібні, якщо єstring? Напишіть приклад використанняStringWriterдля тестування методу, що пише доTextWriter.Поясніть різницю між
TextReaderіStreamReader. Де в реальному коді корисно прийматиTextReaderзамістьStreamReaderяк параметр методу?Розгляньте код:
using var reader = new StreamReader("data.csv"); while (!reader.EndOfStream) { string line = reader.ReadLine(); ProcessLine(line); }Що поверне
reader.Peek()на останньому рядку? ЯкEndOfStreamпов'язаний зPeek()?Напишіть метод
MergeCsvFiles(string[] inputPaths, string outputPath), що об'єднує кілька CSV файлів в один, зберігаючи заголовок тільки з першого файлу. ВикористовуйтеStreamReaderіStreamWriter.
18.5. BinaryReader та BinaryWriter
Чим принципово відрізняється двійковий формат від текстового при збереженні числа
3.14159265358979? Скільки байт займаєdoubleу бінарному форматі проти текстового?Розгляньте код запису:
using var bw = new BinaryWriter(File.Create("data.bin")); bw.Write(42); bw.Write("Hello"); bw.Write(3.14f); bw.Write(true);Напишіть відповідний код читання. Що станеться, якщо читати у іншому порядку (спочатку
float, потімint)?Поясніть концепцію записів фіксованого розміру у бінарних файлах. Напишіть структуру
PatientRecord(ID: int, вік: byte, вага: float) та методи для запису й читання масиву таких записів.Як використати
SeekуFileStreamразом зBinaryReaderдля читання запису за індексом без перебору всього файлу? Обчисліть зміщення для читання запису з індексомi, якщо кожен запис займає 9 байт.Порівняйте розмір файлу при збереженні 1000 чисел типу
doubleу текстовому форматі (черезStreamWriter) та бінарному (черезBinaryWriter). Зробіть розрахунок та поясніть різницю.Напишіть метод
UpdateRecord(string filePath, int index, float newWeight), що відкриває бінарний файл записівPatientRecord(ID: int, вік: byte, вага: float), знаходить запис за індексом та оновлює тільки поле ваги без переписування всього файлу.Де бінарний формат є очевидним вибором, а де текстовий? Перелічіть 3 сценарії для кожного формату. Що таке ендіанність і чому вона важлива при обміні бінарними файлами між різними системами?
18.6. System.Text.Json
Що робить
JsonSerializer.Serialize(obj, new JsonSerializerOptions { WriteIndented = true })? Коли доцільно використовуватиWriteIndented = falseу продуктивному середовищі?Розгляньте клас:
public class Doctor { public string Name { get; set; } public string PasswordHash { get; set; } public DateTime CreatedAt { get; set; } public List<string> Roles { get; set; } }Як серіалізувати об'єкт так, щоб: поле
PasswordHashне потрапило в JSON,CreatedAtсталоcreated_atу camelCase, аRolesсталоpermissions? Використайте JSON атрибути.Поясніть різницю між
JsonSerializerOptions.PropertyNamingPolicy = JsonNamingPolicy.CamelCaseта атрибутом[JsonPropertyName("name")]. Який з них має пріоритет?Що означає
DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull? Напишіть код та покажіть вихідний JSON для об'єкта, де частина полівnull.Перерахуйте всі JSON атрибути, що вивчались у розділі (
[JsonPropertyName],[JsonIgnore]тощо). Для кожного наведіть короткий приклад використання та поясніть ефект.Напишіть метод
SaveConfig<T>(T config, string path)іT LoadConfig<T>(string path), що зберігають і відновлюють конфігурацію з JSON файлу. Обробіть випадки, коли файл не існує або містить невалідний JSON.Порівняйте
JsonSerializer.Serialize(obj)(рядок) іJsonSerializer.Serialize(stream, obj)(в потік). Коли потокова версія є кращим вибором? Яка різниця в використанні пам'яті?Що таке
JsonStringEnumConverter? Без нього як серіалізується enum за замовчуванням? Напишіть приклад, деJsonStringEnumConverterзареєстрований глобально черезJsonSerializerOptions.