19. Классы для работы с файлами и папками. Свойства папок и файлов.
Для работы с файлами и папками используются классы FileInfo
и DirectoryInfo
в пространстве имён System.IO
. Эти классы предоставляют методы экземпляра в отличие от методов File
и Directory
того же пространства имён, предоставляющих более общие статические методы для файлов и папок.
Работа с файлами
Работа с файлами может осуществляться при помощи классов File
или FileInfo
. File
предоставляет только статические методы и соответственно не хранит информацию о конкретном файле, а получает её в момент вызова метода. Используя FileInfo
можно создавать объекты, соответствующие файлам и хранящие данные о их свойствах. Помимо чтения файла и изменения его атрибутов, оба класса предоставляют возможность записи в файл. File
содержит статические методы AppendAllLines(String, IEnumerable<String>)
и AppendAllText(String, String)
позволяющие легко записать в файл информацию без использования дополнительных инструментов. Класс FileInfo
предоставляет возможность чтения/записи в файл только с использоанием объектов StreamReader
, StreamWriter
и FileStream
Список свойств и методов класса FileInfo
можно увидеть на странице в MSDN
В следующем коде демонстрируются основные возможности класса FileInfo
с использованием временных файлов, путь к которым получается при помощи класса Path
using System;
using System.IO;
class Test
{
public static void Main()
{
string path = Path.GetTempFileName();
FileInfo fi1 = new FileInfo(path);
//Создание файла для записи с использованием StreamWriter
using (StreamWriter sw = fi1.CreateText())
{
sw.WriteLine("Hello");
sw.WriteLine("And");
sw.WriteLine("Welcome");
}
//Открытие файла для чтения с использованием StreamReader
using (StreamReader sr = fi1.OpenText())
{
string s = "";
while ((s = sr.ReadLine()) != null)
{
Console.WriteLine(s);
}
}
try
{
string path2 = Path.GetTempFileName();
FileInfo fi2 = new FileInfo(path2);
//Удостовериться, что целевой файл не существует
fi2.Delete();
//Копирование файла
fi1.CopyTo(path2);
Console.WriteLine("{0} was copied to {1}.", path, path2);
//Удаление созданного файла
fi2.Delete();
Console.WriteLine("{0} was successfully deleted.", path2);
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
}
}
При выполнении данного кода будет выведено следующее (имена временных файлов могут отличаться):
Hello
And
Welcome
C:\Users\userName\AppData\Local\Temp\tmp70AB.tmp was copied to C:\Users\userName\AppData\Local\Temp\tmp70CB.tmp.
C:\Users\userName\AppData\Local\Temp\tmp70CB.tmp was successfully deleted.
Работа с папками
Работа с папками может осуществляться при помощи классов Directory
или DirectoryInfo
. Directory
предоставляет только статические методы и соответственно не хранит информацию о конкретной папке, а получает её в момент вызова метода. Используя DirectoryInfo
можно создавать объекты, соответствующие папкам в файловой системе, хранящие данные о свойствах конкретных папок.
Список свойств и методов класса DirectoryInfo
можно увидеть на странице в MSDN
Пример метода, копирующего папки с использованием DirectoryInfo
и FileInfo
using System;
using System.IO;
class CopyDir
{
public static void CopyAll(DirectoryInfo source, DirectoryInfo target)
{
if (source.FullName.ToLower() == target.FullName.ToLower())
{
return;
}
// Проверка существования целевой папки, если она не существует - создаём её
if (Directory.Exists(target.FullName) == false)
{
Directory.CreateDirectory(target.FullName);
}
// Копирование каждого файла исходной папки в целевую
foreach (FileInfo fi in source.GetFiles())
{
Console.WriteLine(@"Copying {0}\{1}", target.FullName, fi.Name);
fi.CopyTo(Path.Combine(target.ToString(), fi.Name), true);
}
// Рекурсивное копирование каждой подпапки
foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
{
DirectoryInfo nextTargetSubDir =
target.CreateSubdirectory(diSourceSubDir.Name);
CopyAll(diSourceSubDir, nextTargetSubDir);
}
}
public static void Main()
{
string sourceDirectory = @"c:\sourceDirectory"; // Путь к исходной папке
string targetDirectory = @"c:\targetDirectory"; // Путь к целевой папке
DirectoryInfo diSource = new DirectoryInfo(sourceDirectory); // Создание объектов DirectoryInfo
DirectoryInfo diTarget = new DirectoryInfo(targetDirectory);
CopyAll(diSource, diTarget);
}
}