当前位置: 首页 > article >正文

在 C# 中实现的目录基础操作

前言

在开发应用程序过程中,对操作系统上的文件夹存储文件和子文件夹操作是常见的需求。.NET中的Directory类提供了处理文件目录的功能。本文介绍如何读取文件夹的属性、获取文件夹的大小及文件个数、创建文件夹、遍历文件夹中的所有文件、移动文件夹和删除文件夹等常见基础操作。

Directory类提供了用于创建、复制、移动和删除目录和子目录的静态方法。在使用前,我们需要导入System.IO命名空间。

基础操作

1、校验目录是否存在

Exists方法是判断指定的文件目录是否存在。下面是校验目录是否存的代码段:

string path = @"C:\Temp";
// 校验目录是否存在,如果不存在则创建
if (!Directory.Exists(path))
{
}

2、创建文件目录

CreateDirectory方法是在指定路径中创建具有指定安全性的目录或文件夹。如果文件目录是在系统盘(如C:),我们的应用程序需要以管理员权限运行。下面是创建文件目录的代码段:


string path = @"C:\Temp";
string subPath = @"C:\Temp\test";
// 校验目录是否存在,如果不存在则创建
if (!Directory.Exists(path))
{
    // 创建目录
    Directory.CreateDirectory(path);
}
// 校验目录是否存在,如果不存在则创建
if (!Directory.Exists(subPath)) 
{
    // 创建子目录
    Directory.CreateDirectory(subPath);
}

3、删除文件目录

Delete方法是从指定路径中永久删除空文件目录,如果文件夹包含子文件夹和文件,则必须先删除它们,然后才能删除文件夹。下面是删除文件目录的代码段:


// 校验目录是否存在,如果存在才执行删除
if (Directory.Exists(subPath))
{
    // 删除目录 【非空目录报错】
    Directory.Delete(subPath);
}
// 校验目录是否存在,如果存在才执行删除
if (Directory.Exists(subPath))
{
    // 删除目录 及所有子目录与文件
    Directory.Delete(subPath,true);
}

4、移动文件目录

Move方法将现有目录移动到具有完整路径的新指定目录,它有原目录与目标目录两个参数。下面是移动文件目录的代码段:


string sourcePath = @"C:\Temp\test";
string destPath = @"C:\Temp\dest";
try
{
    Directory.Move(sourcePath, destPath);
}
catch (IOException ex)
{
    Console.WriteLine(ex.Message);
}

5、复制文件目录

下面是复制文件目录代码段:

public class DirectoryExtend
{
    /// <summary>
    /// 复制目录
    /// </summary>
    /// <param name="source"></param>
    /// <param name="target"></param>
    public static void Copy(string source, string target)
    {
        try
        {
            if (!Directory.Exists(source))
            {
                throw new DirectoryNotFoundException($"复制原目录不存在: {source}");
            }
            // 如果目标目录不存在,则创建
            if (!Directory.Exists(target))
            {
                Directory.CreateDirectory(target);
            }
            DirectoryInfo sourceDirectory = new DirectoryInfo(source);
            DirectoryInfo[] subDirectorys = sourceDirectory.GetDirectories();
            // 获取目录中的文件并将其复制到新位置
            FileInfo[] files = sourceDirectory.GetFiles();
            foreach (FileInfo file in files)
            {
                string tempPath = Path.Combine(target, file.Name);
                file.CopyTo(tempPath, false);
            }
            // 如果要复制子目录,请将它们及其内容复制到新位置
            foreach (DirectoryInfo sub in subDirectorys)
            {
                string tempPath = Path.Combine(target, sub.Name);
                Copy(sub.FullName, tempPath);
            }
        }
        catc h(Exception ex) 
        {
            throw ex;
        }
    }
}
string sourcePath = @"C:\Temp\test";
string destPath = @"C:\Temp\dest";
DirectoryExtend.Copy(sourcePath, destPath);

6、获取和设置目录创建时间

SetCreationTimeGetCreationTime方法用于设置和获取指定目录的创建日期和时间。下面是获取和设置目录创建时间的代码段:


// 设置目录创建时间
DateTime dateTime= Directory.GetCreationTime(path);
Console.WriteLine(dateTime.ToString("yyyy-MM-dd HH:mm:ss"));
// 注意,如果目录被打开,则修改失败,会提示异常
// 获取和设置目录创建时间
Directory.SetCreationTime(path, DateTime.Now);

7、获取和设置目录上次访问时间

SetLastAccessTimeGetLastAccessTime方法用于设置和获取指定目录的上次访问日期和时间。下面是获取和设置目录上次访问时间的代码段:


// 设置目录上次访问时间
DateTime dateTime =  Directory.GetLastAccessTime(path);
Console.WriteLine(dateTime.ToString("yyyy-MM-dd HH:mm:ss"));
// 获取目录上次访问时间
Directory.SetLastAccessTime(path, DateTime.Now);

8、获取和设置目录上次写入时间

SetLastWriteTimeGetLastWriteTime方法用于设置和获取指定目录的上次写入日期和时间。下面是设置和获取目录的上次写入日期和时间的代码段。


// 获取指定目录的上次写入日期和时间
DateTime dateTime = Directory.GetLastWriteTime(path);
// 设置指定目录的上次写入日期和时间
Directory.SetLastWriteTime(path, DateTime.Now);

9、枚举目录

EnumerateDirectories方法返回指定目录中目录名称的可枚举集合,下面是枚举目录的代码段:

var dirs = from dir in
    Directory.EnumerateDirectories(path)
    select dir;
    
Console.WriteLine("目录数: {0}", dirs.Count<string>().ToString());
// 遍历子目录
foreach (var dir in dirs)
{
    Console.WriteLine("{0}", dir.Substring(dir.LastIndexOf("\\") + 1));
}

10、获取并设置当前目录

SetCurrentDirectory和 GetCurrentDirectory方法是指定的目录设置为当前目录和返回当前目录。下面是获取和设置当前目录的代码段:

// 设置当前目录
Directory.SetCurrentDirectory(path);
// 获取当前目录
Console.WriteLine(Directory.GetCurrentDirectory());

11、获取子目录

GetDirectories 方法加载目录的所有子目录。要获取所有子目录,我们需要递归读取子目录。下面是获取子目录的代码段:

// 获取子目录
string[] subdirectorys = Directory.GetDirectories(path);

下面是使用递归获取所有子目录的代码段:


/// <summary>
/// 
/// </summary>
/// <param name="directory"></param>
public static void GetSubDirectories(string directory)
{
    string[] subdirectoryEntries = Directory.GetDirectories(directory);
    // 循环查看它们是否有其他子目录
    foreach (string subdirectory in subdirectoryEntries)
    {
        LoadSubDirectorys(subdirectory);
    }
}
/// <summary>
/// 
/// </summary>
/// <param name="directory"></param>
private static void LoadSubDirectorys(string directory)
{
    Console.WriteLine(directory);
    string[] subDirectorys = Directory.GetDirectories(directory);
    foreach (string subdirectory in subDirectorys)
    {
        LoadSubDirectorys(subdirectory);
    }
}

12、获取目录中的文件

GetFiles 方法获取指定目录中的文件列表,下面是获取目录中的文件的代码段:


string path = @"C:\Temp";
string[] files= Directory.GetFiles(path);
foreach (string fileName in files)
{
    Console.WriteLine(fileName);
}

13、获取根目录

GetRootDirecoty 方法返回指定目录的根目录,下面是获取根目录的代码段:


string path = @"C:\Temp";
string root = Path.GetDirectoryName(path);
Console.WriteLine(root);

14、所有驱动器

GetLogicalDrives 方法返回系统上的所有逻辑驱动器,下面是获取所有驱动器的代码段:


string[] drives = System.IO.Directory.GetLogicalDrives();
foreach (string drive in drives)
{
    Console.WriteLine(drive);
}

小结

以上是关于 Directory 类实现目录操作的内容,希望本文对您有所收获,如有不到之处,请多多包涵。


http://www.kler.cn/a/448707.html

相关文章:

  • 【从零开始入门unity游戏开发之——C#篇21】C#面向对象的封装——`this`扩展方法、运算符重载、内部类、`partial` 定义分部类
  • 高效处理PDF文件的终极工具:构建一个多功能PDF转换器
  • CCF-GESP 等级考试 2023年9月认证C++一级真题解析
  • 集成自然语言理解服务,让应用 “听得懂人话”
  • iOS + watchOS Tourism App(含源码可简单复现)
  • 圣诞快乐(h5 css js(圣诞树))
  • 【SpringBoot】日志文件
  • SpringBoot 整合 SQLite 数据库
  • 深入解析:Python中的决策树与随机森林
  • vue CSS 自定义宽高 翻页 剥离 效果
  • 解决 Ubuntu 24 连接正点 I.MX6ULL 的 uboot 使用 nfs 出现 Loading: T T T T T T T T
  • RCE总结
  • YOLOv9-0.1部分代码阅读笔记-general.py
  • Pinia---新一代的Vuex
  • OpenEuler 22.03 不依赖zookeeper安装 kafka 3.3.2集群
  • 基于微信小程序的短视频系统(SpringBoot)+文档
  • [c++进阶(三)]单例模式及特殊类的设计
  • [python] 基于matplotlib实现雷达图的绘制
  • springboot连接mongo性能优化参数配置
  • 智能汽车自动驾驶发展趋
  • AI 视频:初识 Pika 2.0,基本使用攻略
  • 探索Python的pytest库:简化单元测试的艺术
  • 使用 Vite 和 Redux Toolkit 创建 React 项目
  • YOLOv9-0.1部分代码阅读笔记-autobatch.py
  • ubuntu安装Goland
  • 1-Gin介绍与环境搭建 --[Gin 框架入门精讲与实战案例]