| Главная | Журнал | Форум | Wiki | DRKB | Страны мира |
Работа с файлами в C#В этой статье вы узнаете, как работать с директориями и файлами в системе. Кроме того, мы обсудим вопросы чтения и записи в файл, используя мощные классы .NET.Пространство именSystem.IO содержит все необходимые классы, методы и свойства для манипуляций с каталогами и файлами (В Таблице 1 приведены основные классы).
Таблица 1 - классы в System.IO Работа с классами DirectoryInfo и FileInfoКлассы DirectoryInfo и FileInfo унаследованы от FileSystemInfo, который является абстрактным. Это значит, что Вы не можете унаследовать от него свой класс, но можете использовать свойства, определённые в нём. Таблица 2 перечисляет его свойства и методы.
Таблица 2 - свойства и методы класса FileSystemInfo Класс DirectoryInfo содержит методы для создания, перемещение и удаление каталогов. Чтобы использовать вышеприведённые свойства, необходимо создать объект класса DirectoryInfo как показано в примере: DirectoryInfo dir1 = new DirectoryInfo(@"F:\WINNT"); После этого уже можно просмотреть свойства директории при помощи объекта dir1, как показано на фрагмент кода:
Console.WriteLine("Full Name is : {0}", dir1.FullName);
Console.WriteLine("Attributes are : {0}",
dir1.Attributes.ToString());
Можно также использовать значения перечисления FileAttributes. Они приведены в таблице 3.
Работа с файлами в директорииПредположим, вы хотите получить список всех файлов с расширением BMP в папке F:\Pictures. Для этого можно использовать следующий код:
DirectoryInfo dir = new DirectoryInfo(@"F:\WINNT");
FileInfo[] bmpfiles = dir.GetFiles("*.bmp);
Console.WriteLine("Total number of bmp files", bmpfiles.Length);
Foreach( FileInfo f in bmpfiles)
{
Console.WriteLine("Name is : {0}", f.Name);
Console.WriteLine("Length of the file is : {0}", f.Length);
Console.WriteLine("Creation time is : {0}", f.CreationTime);
Console.WriteLine("Attributes of the file are : {0}",
f.Attributes.ToString());
}
Создание подкаталоговСледующий фрагмент кода описывает как можно создать поддиректорию MySub в директории Sub:
DirectoryInfo dir = new DirectoryInfo(@"F:\WINNT");
try
{
dir.CreateSubdirectory("Sub");
dir.CreateSubdirectory(@"Sub\MySub");
}
catch(IOException e)
{
Console.WriteLine(e.Message);
}
Создание файлов при помощи класса FileInfoКласс FileInfo позволяет создавать новые файлы, получать информацию, удалять и перемещать их. В этом классе также есть методы для открытия, чтения и записи в файл. В следующем примере показано, как можно создать текстовый файл и получить доступ к его информации (времени его создания, полное имя, и так далее):
FileInfo fi = new FileInfo(@"F:\Myprogram.txt");
FileStream fstr = fi.Create();
Console.WriteLine("Creation Time: {0}",f.CreationTime);
Console.WriteLine("Full Name: {0}",f.FullName);
Console.WriteLine("FileAttributes: {0}",f.Attributes.ToString());
//Удаление файла Myprogram.txt.
Console.WriteLine("Press any key to delete the file");
Console.Read();
fstr.Close();
fi.Delete();
Описание метода Open()В классе FileInfo есть метод под названием Open () с помощью которого можно создавать файлы, подставляя в параметры значения перечислений FileMode и FileAccess. Следующий фрагмент кода показывает, как это делается:
FileInfo f = new FileInfo("c:\myfile.txt");
FileStream s = f.Open(FileMode.OpenorWrite, FileAccess.Read);
После этого, используя объект 's', можно читать и записывать в файл. В перегруженном методе Open() можно только читать из файла. Для записи в файл необходимо в параметрах открытия использовать значение FileAccess.ReadWrite. Таблицы 4 и 5 содержат возможные значения FileMode и FileAccess.
Таблица 4 - значения FileMode
Таблица 5 - значения FileAccess Запись в текстовый файл при помощи класса StreamWriterТекстовые данные или любую другую информацию можно записать в файл используя метод CreateText() в классе FileInfo. Однако предварительно необходимо получить валидный StreamWriter. Именно StreamWrite обеспечивает необходимую функциональность для записи в файл. Следующий пример иллюстрирует это:
FileInfo f = new FileInfo("Mytext.txt")
StreamWriter w = f.CreateText();
w.WriteLine("This is from");
w.WriteLine("Chapter 6");
w.WriteLine("Of C# Module");
w.Write(w.NewLine);
w.WriteLine("Thanks for your time");
w.Close();
Чтение из текстового файлаДля чтения из текстового файла можно воспользоваться классом StreamReader. Для этого необходимо указать имя файла в статическом методе OpenText() класса File. Следующий пример считывает содержимое файла, которое было записано в предыдущем примере:
Console.WriteLine("Reading the contents from the file");
StreamReader s = File.OpenText("Mytext.txt");
string read = null;
while ((read = s.ReadLine()) != null)
{
Console.WriteLine(read);
}
s.Close();
Работа с разными кодировками.По умолчанию в .NET все текстовые данные в кодировке UTF8, но часто требуется считать текстовый файл, сохраненный в другой кодировке, допустим в WIN1251. В таком случае если в файле был русский текст в кодировке WIN1251, при считывании его в UTF8 мы получим нечитаемые данные. Для того чтобы переводить строки из одной кодировки в другую существует класс Encoding из пространства имен System.Text, благодаря которому зная исходную кодировку мы можем привести текстовые данные к нужной кодировке. Рассмотрим следующий пример, например, мы хотим конвертировать считанную строку в кодировке WIN1251 в кодировку DOS(866), для этого мы можем использовать следующий код:
class Program
{
private static string in1251;
private static readonly Encoding enc1251 = Encoding.GetEncoding(1251);
private static readonly Encoding enc866 = Encoding.GetEncoding(866);
static void Main(string[] args)
{
//....
//тут каким то образом получаем данные в in1251
byte[] sourceBytes = enc1251.GetBytes(in1251);
string outputString = enc866.GetString(sourceBytes);
//далее делаем то что требуется с полученной строкой
//....
}
}
В sourceBytes мы получили входную строку в виде массива байт, которые далее мы можем так же посредством Encoding сохранить в строку с нужной кодировкой. В случае, когда мы читаем текст уже известной кодировке из файла, дела обстоят еще проще. При создании экземпляра StreamReader мы можем явно указать кодировку источника, код будет выглядеть следующим образом:
using (var sr = new StreamReader("Mytext.txt", Encoding.GetEncoding(1251)))
{
string read = null;
while ((read = sr.ReadLine()) != null)
Console.WriteLine(read);
}
При записи в файл в нужной кодировке для StreamWriter так же можно указать кодировку, в которой будет текст. |
Основные разделы сайта
|
|
|