Файлы и папки
Как объединить компоненты пути?
Console.WriteLine(Path.Combine("C:\\", "Windows", "System32"));
// Output: C:\Windows\System32
Как нормализовать слэши в пути?
public static string NormalizePath(string path)
{
return path.Replace('/', Path.DirectorySeparatorChar).Replace('\\', directorySeparatorChar);
}
Как получить текущий рабочий каталог?
Console.WriteLine(Directory.GetCurrentDirectory());
Как получить абсолютный путь из относительного?
Console.WriteLine(Path.GetFullPath("aleksey/projects/foo"));
Как проверить существование папки?
var exists = Directory.Exists(path);
Console.WriteLine($"Папка существует: {exists}");
// только для специалистов
if (exists)
{
Console.WriteLine("А мог бы делом заняться!");
}
else
{
Console.WriteLine("А мамка?");
}
Как проверить существование файла?
Console.WriteLine($"Файл существует: {File.Exists(path)}");
Как получить список папок?
foreach (var dir in Directory.GetDirectories(path))
{
Console.WriteLine(dir);
}
Как получить список файлов в папке?
Список всех файлов в указанной папке
var files = Directory.GetFiles(path);
foreach (var file in files)
{
Console.WriteLine(file);
}
Рекурсивно по заданному шаблону
var path = Directory.GetCurrentDirectory();
var pattern = "*.md";
var files = Directory.GetFiles(path, pattern, SearchOption.AllDirectories);
foreach (var file in files)
{
Console.WriteLine(file);
}
Постепенное получение, когда файлов очень много
var path = "C:\\Windows";
var pattern = "*.dll";
var files = Directory.EnumerateFiles(path, pattern, SearchOption.AllDirectories);
foreach (var file in files)
{
Console.WriteLine(file);
}
Как создать папку?
Directory.CreateDirectory(path);
Как удалить папку?
Directory.Delete(path);
// рекурсивно
Directory.Delete(path, true);
Как скопировать папку?
public static void CopyDirectory(string sourceDirectory, string destinationDirectory)
{
Directory.CreateDirectory(destinationDirectory);
foreach (var file in Directory.GetFiles(sourceDirectory))
{
var destFile = Path.Combine(destinationDirectory, Path.GetFileName(file));
File.Copy(file, destFile);
}
foreach (var directory in Directory.GetDirectories(sourceDirectory))
{
var nextDestinationDirectory = Path.Combine(destinationDirectory, Path.GetFileName(directory));
CopyDirectory(directory, nextDestinationDirectory);
}
}
Как переместить папку?
Directory.Move(sourceDirName, destDirName);
Как создать (перезаписать) текстовой файл?
Ленивый вариант перезаписи текстового файла
File.WriteAllText(path, content, Encoding.UTF8);
Ленивый вариант простой, но может привести к блокировке файлов. Лучше полностью контролировать этот процесс.
Правильный вариант перезаписи текстового файла
using (var fileStream = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None))
{
using (var writer = new StreamWriter(fileStream, Encoding.UTF8))
{
writer.Write(content);
}
}
Как добавить данные в конец текстового файла?
Ленивый вариант добавления данных в текстовой файл
File.AppendAllText(path, content, Encoding.UTF8);
Лениво добавить строку в конец текстового файла
File.AppendAllLines(path, [line], Encoding.UTF8);
Правильный вариант добавления данных в текстовой файл
using (var fileStream = new FileStream(path, FileMode.Append, FileAccess.Write, FileShare.None))
{
using (var writer = new StreamWriter(fileStream, Encoding.UTF8))
{
writer.Write(content);
}
}
Как прочитать текстовой файл?
Ленивый вариант чтения текстового файла
Console.WriteLine(File.ReadAllText(path));
Ленивый вариант может привести к блокировке файлов, лучше контролировать весь процесс работы с файлом самостоятельно.
Правильный вариант чтения текстового файла
using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (var reader = new StreamReader(fileStream, Encoding.UTF8))
{
Console.WriteLine(reader.ReadToEnd());
}
}
Как прочитать бинарный файл?
Ленивый вариант чтения бинарного файла
var bytes = File.ReadAllBytes(path);
Правильный вариант чтения бинарного файла
using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
using (var reader = new BinaryReader(fileStream))
{
var bytes = reader.ReadBytes((int)fileStream.Length);
}
}
Постепенное чтение бинарного файла
using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read))
{
int bufferSize = 2048;
int bytesRead;
var buffer = new byte[bufferSize];
while ((bytesRead = fileStream.Read(buffer, 0, bufferSize)) > 0)
{
var content = string.Join("", buffer.Take(bytesRead).Select(b => b.ToString("x2")));
Console.WriteLine($"Прочитан пакет {bytesRead} байт: {content}");
}
}
Как скопировать файл?
File.Copy(sourcePath, destinationPath);
Как переместить файл?
File.Move(sourcePath, destinationPath);
Как удалить файл?
Обычное удаление файла
File.Delete(path);
Попытка удалить файл
public static async Task DeleteFileAsync(
string path,
TimeSpan? accessTimeout = null,
CancellationToken cancellationToken = default
)
{
var totalTime = new TimeSpan();
var interval = TimeSpan.FromMilliseconds(100);
accessTimeout ??= TimeSpan.FromSeconds(5);
while (File.Exists(path))
{
try
{
File.Delete(path);
}
catch (IOException)
{
await Task.Delay(interval, cancellationToken);
totalTime += interval;
if (totalTime > accessTimeout)
{
throw;
}
}
}
}