В Visual Basic поддерживается работа с файлами как через классические процедуры (FileOpen, Input, Put, Close), так и через .NET API (System.IO.StreamReader, StreamWriter, FileStream). Считается предпочтительным использовать .NET-классы.
Тонкости:
Using, чтобы автоматически освобождать ресурсы.StreamReader/StreamWriter, для байтов — FileStream.Пример кода:
Dim filePath As String = "test.txt" ' Запись в файл Using writer As New StreamWriter(filePath) writer.WriteLine("Hello, world!") End Using ' Чтение из файла Using reader As New StreamReader(filePath) Dim content As String = reader.ReadToEnd() End Using
Что произойдет, если не закрыть поток после записи в файл через StreamWriter, и почему важно использовать конструкцию Using?
Ответ:
Если не закрыть поток (не вызвать Close или не использовать Using), буферизированные данные могут не записаться на диск, поскольку операционная система сохраняет их в памяти. Также незакрытый поток удерживает файловый дескриптор, и файл может быть заблокирован для других процессов, а в долгоживущих приложениях это ведет к утечкам памяти и ресурсов. Конструкция Using гарантирует вызов Dispose даже при возникновении исключения.
История
Внезапное отсутствие данных: При генерации отчётов в банке разработчик не закрыл
StreamWriter. В результате часть данных была не записана в файл из-за неосвобожденного буфера, отдел обслуживания клиентов не мог открыть итоговые отчеты.
История
Утечка дескрипторов файлов: В ERP-системе разработчики использовали ручное открытие файлов и часто забывали вызывать
Close. Через несколько дней приложение падало с исчерпанием лимита открытых файлов.
История
Конфликт блокировки файлов: В сетевой службе резервного копирования файл открывался без правильного режима доступа, что блокировало доступ другим программам и вызвало длительные простои во всем отделе.