| СТАТЬЯ |  
       07.02.03 
     | 
  
Часть
  7. Работа с файлами © Алексей Федоров
  Статья была опубликована в журнале "КомпьютерПресс" 
  7'2002
Мы продолжаем разговор о Microsoft .NET Framework и библиотеке классов .NET Framework Class Library. В этой статье мы рассмотрим пространство имен System.IO и классы, связанные с потоковым вводом-выводом.
Мы завершаем знакомство с Microsoft .NET Framework и библиотекой классов .NET Framework Class Library. В этом номере мы рассмотрим классы из пространства имен System.IO - FileSystemInfo, FileInfo, DirectoryInfo, File и Path, используемые для работы с файлами и каталогами.
Пространство имен System.IO содержит ряд классов, используемых для работы с файловой системой. Класс FileSystemInfo служит в качестве базового класса для классов FileInfo и DirectoryInfo. Для работы с файлами используется класс File, а для работы с каталогами — класс Directory. Упомянутые классы показаны на следующей диаграмме.

Обратите внимание на различия между показанными выше классами. Класс FileInfo предоставляет методы для создания, копирования, удаления, перемещения и открытия файлов и помогает в создании объектов типа FileStream. Класс File предоставляет статические методы — для их использования не требуется создавать экземпляр класса. Это справедливо и для классов DirectoryInfo и Directory. Классы FileInfo и DirectoryInfo являются «запечатанными» классами (sealed classes) — мы можем создавать экземпляры этих классов, но наследовать от них невозможно.
Этот класс определяет базовую функциональность для унаследованных классов — классов FileInfo и DirectoryInfo. Он содержит свойства и методы, общие для управления и файлами, и каталогами. Ниже приведен список свойств и методов класса FileSystemInfo.
Этот класс, выполняющий роль «оболочки» вокруг маршрута к файлу, расширяет класс FileSystemInfo, добавляя к нему свойства и методы для манипуляции файлами. Класс FileInfo добавляет следующие свойства и методы:
Диаграмма показывает, как методы класса FileInfo соотносятся с потоковыми классами.

Следующий пример демонстрирует, как использовать класс FileInfo для отображения размеров и атрибутов файлов в каталоге:
'---------------------------------------- 
  ' Использование класса FileInfo 
  '---------------------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  
  Dim Path As String = GetPersonalFolder() & "\MyText" 
  Dim DirInfo As New DirectoryInfo(Path) 
  Dim Files As FileInfo() = DirInfo.GetFiles("*.TXT") 
  Dim I As Integer 
  Console.WriteLine(Path & ControlChars.CrLf) 
  For I = Files.GetLowerBound(0) To Files.GetUpperBound(0) 
  Console.Write((Files(I).Name.PadRight(15)) & _ 
  (Files(I).Length).ToString.PadRight(15)) 
  Console.Write(ControlChars.Tab) 
  Console.WriteLine(ShowAttribs(Files(I))) 
  Next 
  
  End Sub 
  
  Function GetPersonalFolder() As String 
  
  Dim E As Environment 
  Return E.GetFolderPath(Environment.SpecialFolder.Personal) 
  
  End Function 
  
  Function ShowAttribs(ByVal F As FileInfo) As String 
  
  Dim S As String 
  With F 
  If .Attributes And FileAttributes.Archive Then 
  S = "A" 
  Else 
  S = "-" 
  End If 
  If .Attributes And FileAttributes.Hidden Then 
  S += "H" 
  Else 
  S += "-" 
  End If 
  If .Attributes And FileAttributes.Normal Then 
  S += "N" 
  Else 
  S += "-" 
  End If 
  If .Attributes And FileAttributes.ReadOnly Then 
  S += "R" 
  Else 
  S += "-" 
  End If 
  End With 
  Return S 
  
  End Function 
  
  End Module
  

Приведем еще один пример — ниже показано, как использовать метод CreateText для создания объекта StreamWriter и записи в новый текстовый файл:
'---------------------------------------- 
  ' Использование класса FileInfo 
  '---------------------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  Dim FileName As String = "c:\temp\mytext01.txt" 
  Dim Writer As StreamWriter 
  Dim MyFile As New FileInfo(FileName) 
  
  Writer = MyFile.CreateText() 
  
  Writer.WriteLine("Created by " & MyFile.GetType.ToString) 
  Writer.WriteLine("Written by " & Writer.ToString) 
  
  Writer.Close() 
  
  End Sub 
  
В результате мы получим следующий текстовый файл.

Примеры использования других методов класса FileInfo приведены в разделе, посвященном классу File.
Этот класс позволяет создавать и перемещать каталоги, а также получать содержимое каталогов и подкаталогов. Класс DirectoryInfo содержит следующие свойства:
Следующий пример показывает, как использовать свойства Parent и Root для восстановления корневого каталога для данного каталога:
'---------------------------------------- 
  ' Использование класса DirectoryInfo 
  '---------------------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  
  Dim Path As String = GetPersonalFolder() & "\MyText" 
  Dim DirInfo As New DirectoryInfo(Path) 
  Dim Parent As String 
  
  Console.WriteLine("Initial Directory : " & DirInfo.FullName) 
  Parent = DirInfo.Parent.FullName 
  While Parent <> DirInfo.Root.FullName 
  Console.WriteLine("Parent Directory : " & _ 
  DirInfo.Parent.FullName) 
  Parent = DirInfo.Parent.FullName 
  DirInfo = New DirectoryInfo(Parent) 
  End While 
  
  End Sub 
  
  Function GetPersonalFolder() As String 
  
  Dim E As Environment 
  Return E.GetFolderPath(Environment.SpecialFolder.Personal) 
  
  End Function 
  
  End Module
  
Ниже приведены методы, доступные в классе DirectoryInfo:
 '---------------------------------------- 
  ' Использование класса DirectoryInfo 
  '---------------------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  
  Dim Path As String = "c:\temp\demos" 
  Dim DirInfo As New DirectoryInfo(Path) 
  DirInfo.Create() 
  DirInfo.CreateSubdirectory("ch04") 
  
  End Sub 
  
  End Module

 '---------------------------------------- 
  ' Использование класса DirectoryInfo 
  '---------------------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  
  Dim Path As String = "c:\" 
  Dim DirInfo As New DirectoryInfo(Path) 
  Dim Dirs() As DirectoryInfo 
  Dim I As Integer 
  
  Console.WriteLine("Initial Directory : " & DirInfo.FullName) 
  Dirs = DirInfo.GetDirectories 
  For I = 0 To Dirs.GetUpperBound(0) 
  Console.WriteLine(Dirs(I).FullName) 
  Next 
  
  End Sub 
  
  End Module
Данное перечисление используется для получения маршрутов к специальным системным каталогам типа Program Files, Programs, System, Startup и т.п. Ниже показаны члены перечисления SpecialFolder:
Ниже показаны типичные имена для специальных системных каталогов в системе Windows 2000:
'------------------------------------------------------ 
  ' Использование перечисления Environment.SpecialFolder 
  '------------------------------------------------------ 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  Dim E As Environment 
  Dim Names As String() 
  Dim Values() As Integer 
  Dim I As Integer 
  
  Console.WriteLine("SpecialFolder Enumeration") 
  Names = SpecialFolder.System.GetNames(SpecialFolder.System.GetType) 
  Values = SpecialFolder.GetValues(SpecialFolder.System.GetType) 
  
  For I = 0 To Names.GetUpperBound(0) 
  Console.WriteLine(ControlChars.Tab & Names(I) & "=" & _ 
  E.GetFolderPath(Values(I))) 
  Next 
  
  End Sub 

Этот класс обеспечивает набор статических методов, которые могут быть использованы для создания, копирования, удаления, перемещения и открытия файлов. Некоторые из методов класса File создают объекты StreamWriter и FileStream.
Метод Create(String), или Create (String, Integer), используется для создания файла в указанном каталоге с указанным размером буфера. Этот метод возвращает объект FileStream. Метод CreateText(String) создает объект StreamWriter, который записывает в новый текстовый файл с указанным полным именем. Мы используем метод AppendText(String) для создания объекта StreamWriter, используемого для добавления текста к существующему файлу или для создания нового файла. Для проверки того, существует файл или нет, используется метод Exists(String).
Метод Open(String, FileMode), или Open(String, FileMode, FileAccess), или Open(String, FileMode, FileAccess, FileShare), открывает объект FileStream для указанного файла, метод OpenRead(String) создает объект FileStream для чтения из существующего файла, а метод OpenWrite(String) создает объект FileStream с доступом к файлу через операции чтения и записи. Метод OpenText(String) создает объект StreamReader, используемый для чтения из файла.
На следующей диаграмме показано, как методы класса File соотносятся с потоковыми классами.
Метод Copy(String, String), или Copy(String, String, Boolean) используется для копирования существующего файла в новый файл либо с перезаписью содержимого файла, либо без таковой. Для удаления файла мы используем метод Delete(String), а для перемещения указанного файла в новое место и для опционального изменения имени файла — метод Move(String, String).
Класс File имеет четыре пары методов Get/Set, используемых для управления атрибутами, временем создания, временем доступа и временем последней записи в файл. Эти методы перечислены в следующей таблице.
Ниже демонстрируется использование метода Open для открытия потока FileStream для указанного файла:
'---------------------------- 
  ' Использование класса File 
  '---------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  Dim MyFile As String = "c:\temp\mytext\mytext01.txt" 
  Dim FS As FileStream 
  Dim Reader As StreamReader 
  
  FS = File.Open(MyFile, FileMode.Open) 
  Reader = New StreamReader(FS) 
  
  While Reader.Peek() > -1 
  Console.WriteLine(Reader.ReadLine()) 
  End While 
  Reader.Close() 
  FS.Close() 
  
  End Sub 
  
  End Module 
  
Обратите внимание на то, что при вызове метода Open объекта File мы указали способ доступа к файлу. Возможные модификаторы доступа к файлу доступны через перечисление FileMode и показаны ниже:
Следующий пример показывает использование метода OpenFile класса StreamReader:
'---------------------------- 
  ' Использование класса File 
  '---------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  
  Dim MyFile As String = "c:\temp\mytext\mytext01.txt" 
  Dim Reader As StreamReader 
  
  Reader = File.OpenText(MyFile) 
  While Reader.Peek() > -1 
  Console.WriteLine(Reader.ReadLine()) 
  End While 
  Reader.Close() 
  
  End Sub 
  
End Module
Ниже демонстрируется использование методов GetXXX:
  '---------------------------- 
  ' Использование класса File 
  '---------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  Dim MyFile As String = "c:\temp\mytext\mytext01.txt" 
  
  Console.WriteLine() 
  Console.WriteLine(MyFile) 
  Console.WriteLine("Attributes : " & _ 
  ShowAttribs(File.GetAttributes(MyFile))) 
  Console.WriteLine("Creation time : " & _ 
  File.GetCreationTime(MyFile)) 
  Console.WriteLine("Last access time : " & _ 
  File.GetLastAccessTime(MyFile)) 
  Console.WriteLine("Last write time : " & _ 
  File.GetLastWriteTime(MyFile)) 
  
  End Sub 
  
  Function ShowAttribs(ByVal Attributes As FileAttributes) As String 
  
  Dim S As String 
  
  If Attributes And FileAttributes.Archive Then 
  S = "A" 
  Else 
  S = "-" 
  End If 
  If Attributes And FileAttributes.Hidden Then 
  S += "H" 
  Else 
  S += "-" 
  End If 
  If Attributes And FileAttributes.Normal Then 
  S += "N" 
  Else 
  S += "-" 
  End If 
  If Attributes And FileAttributes.ReadOnly Then 
  S += "R" 
  Else 
  S += "-" 
  End If 
  
  Return S 
  
  End Function  

И еще один пример — в нем показано, как использовать метод OpenWrite для открытия потока FileStream для указанного файла и записи в него:
'---------------------------- 
  ' Использование класса File 
  '---------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  Dim MyFile As String = "c:\temp\mytext\mytext01.txt" 
  Dim FS As FileStream 
  Dim Writer As StreamWriter 
  
  FS = File.OpenWrite(MyFile) 
  Writer = New StreamWriter(FS) 
  FS.Seek(0, SeekOrigin.End) 
  Writer.WriteLine("One more line") 
  Writer.Flush() 
  Writer.Close() 
  FS.Close() 
  
  End Sub 
  
  End Module 
Класс Path предоставляет набор статических методов, используемых для обработки имен файлов и каталогов. Методы, реализованные в этом классе, следующие:
В следующем примере демонстрируется использование ряда методов класса Path:
'---------------------------- 
  ' Использование класса Path 
  '---------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  Dim FullPath As String = "c:\book\ch04\ch04.doc" 
  Dim FullPathExt As String = "c:\book\ch04.old\ch04.doc" 
  Dim Partial1 As String = "c:\book" 
  Dim Partial2 As String = "ch04" 
  
  Console.WriteLine("ChangeExtension : " & _ 
  Path.ChangeExtension(FullPath, ".bak")) 
  Console.WriteLine("Combine : " & _ 
  Path.Combine(Partial1, Partial2)) 
  Console.WriteLine("GetDirectoryName : " & _ 
  Path.GetDirectoryName(FullPath)) 
  Console.WriteLine("GetExtension : " & _ 
  Path.GetExtension(FullPathExt)) 
  Console.WriteLine("GetFileName : " & _ 
  Path.GetFileName(FullPath)) 
  Console.WriteLine("GetFileNameWithoutExtension : " & _ 
  Path.GetFileNameWithoutExtension(FullPath)) 
  Console.WriteLine("GetFullPath : " & _ 
  Path.GetFullPath(FullPath)) 
  Console.WriteLine("GetPathRoot : " & _ 
  Path.GetPathRoot(FullPath)) 
  Console.WriteLine("GetTempFileName : " & _ 
  Path.GetTempFileName) 
  Console.WriteLine("GetTempPath : " & _ 
  Path.GetTempPath) 
  Console.WriteLine("HasExtension : " & _ 
  Path.HasExtension(FullPathExt)) 
  Console.WriteLine("IsPathRooted : " & _ 
  Path.IsPathRooted(Partial2)) 
  
  End Sub 
  
  End Module 
  
Пять свойств класса Path содержат специфичные для конкретной платформы символы, которые перечислены ниже:
Следующий пример показывает содержимое этих свойств для платформы Microsoft Windows.
'---------------------------- 
  ' Использование класса Path 
  '---------------------------- 
  
  Imports System 
  Imports System.IO 
  
  Module VBDemo 
  
  Sub Main() 
  
  Console.WriteLine("AltDirectorySeparatorChar : " _ 
& Path.AltDirectorySeparatorChar) 
Console.WriteLine("DirectorySeparatorChar : " _ 
& Path.DirectorySeparatorChar) 
Console.WriteLine("InvalidPathChars : " _ 
& Path.InvalidPathChars) 
Console.WriteLine("PathSeparator : " _ 
& Path.PathSeparator) 
Console.WriteLine("VolumeSeparatorChar : " _ 
& Path.VolumeSeparatorChar) 
  
  End Sub 
  
  End Module 
  

На этом мы завершаем знакомство с Microsoft .NET Framework — дальнейшее обсуждение этой темы выходит за рамки тематики нашего издания.
Дополнительная информация
За дополнительной информацией обращайтесь в компанию Interface Ltd.
| INTERFACE Ltd. | 
  | ||||