原文: https://zetcode.com/csharp/directory/

C# 目录教程显示了如何使用 C# 中的目录。 在我们的示例中,我们创建目录,删除目录,列出目录或获取其权限。

目录定义

目录,也称为文件夹,是在计算机上存储文件的位置。 除文件外,目录还存储其他目录或快捷方式。

在 C# 中,我们可以使用DirectoryDirectoryInfo处理目录。 Directory是一个静态类,提供用于处理目录的静态方法。 DirectoryInfo的实例提供有关特定目录的信息。

这些类在System.IO命名空间中可用。

C# 创建目录

使用Directory.CreateDirectory()方法创建目录。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace CreatingDirectory
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
  10. var dirName = $@"{docPath}\test";
  11. DirectoryInfo di = Directory.CreateDirectory(dirName);
  12. Console.WriteLine($"Full name: {di.FullName}, Name: {di.Name}, Parent: {di.Parent}");
  13. if (Directory.Exists(dirName))
  14. {
  15. Console.WriteLine("Directory exists");
  16. }
  17. else
  18. {
  19. Console.WriteLine("Directory does not exist");
  20. }
  21. }
  22. }
  23. }

该示例在用户的Documents目录中创建一个新的test目录。

  1. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

我们用Environment.GetFolderPath()方法确定MyDocuments目录路径。

  1. var dirName = $@"{docPath}\test";

这是要创建的目录的完整路径。

  1. DirectoryInfo di = Directory.CreateDirectory(dirName);
  2. Console.WriteLine($"Full name: {di.FullName}, Name: {di.Name}, Parent: {di.Parent}");

Directory.CreateDirectory()创建一个新目录并返回DirectoryInfo,它代表指定路径下的目录。 从目录信息对象中,我们打印目录的全名,名称和父目录。

  1. if (Directory.Exists(dirName))
  2. {
  3. Console.WriteLine("Directory exists");
  4. }
  5. else
  6. {
  7. Console.WriteLine("Directory does not exist");
  8. }

使用Directory.Exists()方法,我们可以确定指定的目录是否存在。

C# 获取当前目录

Directory.GetCurrentDirectory()获取应用的当前工作目录。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace CurrentDirectory
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var curDir = Directory.GetCurrentDirectory();
  10. Console.WriteLine(curDir);
  11. Console.WriteLine(Directory.GetDirectoryRoot(curDir));
  12. }
  13. }
  14. }

该程序将打印当前的工作目录(运行程序的目录)及其根目录。 根由Directory.GetDirectoryRoot()确定。

  1. $ dotnet run
  2. C:\Users\Jano\Documents\csharp\directory\CurrentDirectory
  3. C:\

这是输出。

C# 删除目录

使用Directory.Delete()方法删除目录。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace DeleteDirectory
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
  10. var myDir = $@"{docPath}/test3";
  11. Directory.CreateDirectory(myDir);
  12. Console.WriteLine(Directory.Exists(myDir));
  13. Directory.Delete(myDir);
  14. Console.WriteLine(Directory.Exists(myDir));
  15. }
  16. }
  17. }

该示例创建一个新目录,检查它的存在,将其删除,最后再次检查它的存在。

  1. $ dotnet run
  2. True
  3. False

This is the output.

C# 移动目录

Directory.Move()移动(重命名)目录。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace MoveDirectory
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
  10. var sourceDir = $@"{docPath}\test";
  11. var destDir = $@"{docPath}\test2";
  12. Directory.Move(sourceDir, destDir);
  13. }
  14. }
  15. }

该示例重命名目录。

  1. Directory.Move(sourceDir, destDir);

Directory.Move()方法的参数是:源目录和目标目录。

C# 列出驱动器

Directory.GetLogicalDrives()<drive letter>:\的形式检索计算机上逻辑驱动器的名称。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace ListDrives
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. string[] drives = Directory.GetLogicalDrives();
  10. foreach (string drive in drives)
  11. {
  12. System.Console.WriteLine(drive);
  13. }
  14. }
  15. }
  16. }

该示例列出了计算机上的所有驱动器。

C# 列出目录

Directory.GetDirectories()返回子目录的名称。 子目录可能符合可选的指定条件。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace ListDirectories
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
  10. string[] myDirs = Directory.GetDirectories(docPath);
  11. Console.WriteLine("Directories:");
  12. foreach (var myDir in myDirs)
  13. {
  14. Console.WriteLine(myDir);
  15. }
  16. }
  17. }
  18. }

该示例列出了指定目录的所有子目录。

在下一个示例中,我们为列出的目录指定一些条件。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace ListDirectories2
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
  10. Console.WriteLine(docPath);
  11. string[] myDirs = Directory.GetDirectories(docPath, "w*",
  12. SearchOption.TopDirectoryOnly);
  13. Console.WriteLine("Directories:");
  14. foreach (var myDir in myDirs)
  15. {
  16. Console.WriteLine(myDir);
  17. }
  18. }
  19. }
  20. }

该示例列出了所有以w字符开头的目录。

  1. string[] myDirs = Directory.GetDirectories(docPath, "w*", SearchOption.TopDirectoryOnly);

Directory.GetDirectories()的第一个参数是要列出的目录。 第二个参数是与要列出的子目录名称匹配的搜索字符串。 第三个参数指定搜索操作应包含所有子目录还是仅包含当前目录。

C# 列出文件

Directory.GetFiles()返回符合(可选)条件的文件名。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace ListFiles
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
  10. string[] myFiles = Directory.GetFiles(docPath);
  11. Console.WriteLine("Files:");
  12. foreach (var myFile in myFiles)
  13. {
  14. Console.WriteLine(myFile);
  15. }
  16. }
  17. }
  18. }

该示例列出了用户Documents目录中的所有文件。

C# 目录时间

Directory.GetCreationTime()获取目录的创建日期和时间。 Directory.GetLastAccessTime()获取上次访问指定文件或目录的日期和时间。 Directory.GetLastWriteTime()获取指定文件或目录的最后写入日期和时间。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace GetTimes
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
  10. var myDir = $@"{docPath}\test";
  11. var creationTime = Directory.GetCreationTime(myDir);
  12. var lastAccessTime = Directory.GetLastAccessTime(myDir);
  13. var lastWriteTime = Directory.GetLastWriteTime(myDir);
  14. Console.WriteLine($"Creation time: {creationTime}");
  15. Console.WriteLine($"Last access time: {lastAccessTime}");
  16. Console.WriteLine($"Last write time: {lastWriteTime}");
  17. }
  18. }
  19. }

该示例打印指定目录的创建时间,上次访问时间和上次写入时间。

C# 列出条目

Directory.GetFileSystemEntries()返回满足指定条件的所有文件和子目录的名称。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace ListEntries
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
  10. string[] entries = Directory.GetFileSystemEntries(docPath, "w*");
  11. Console.WriteLine("Entries:");
  12. foreach (var entry in entries)
  13. {
  14. Console.WriteLine(entry);
  15. }
  16. }
  17. }
  18. }

该程序列出了指定目录中的所有条目。 条目必须以w字符开头。

C# 目录大小

在下面的示例中,我们确定目录的大小。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace DirectorySize
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
  10. long size = 0;
  11. var myDir = $@"{docPath}/csharp";
  12. var dirInfo = new DirectoryInfo(myDir);
  13. foreach (FileInfo fi in dirInfo.GetFiles("*", SearchOption.AllDirectories))
  14. {
  15. size += fi.Length;
  16. }
  17. Console.WriteLine($"The directory size: {size} bytes");
  18. }
  19. }
  20. }

要获取目录的大小,我们使用DirectoryInfoGetFiles()方法。 它返回FileInfo类型的数组。 FileInfoLength属性检索文件的大小。

  1. foreach (FileInfo fi in dirInfo.GetFiles("*", SearchOption.AllDirectories))
  2. {
  3. size += fi.Length;
  4. }

我们搜索指定目录及其子目录中的所有文件。 我们获取每个检索到的文件的大小并添加它们。

C# 复制目录

在以下示例中,我们复制目录。

Program.cs

  1. using System;
  2. using System.IO;
  3. namespace CopyDirectory
  4. {
  5. class Program
  6. {
  7. static void Main(string[] args)
  8. {
  9. var source = @"C:\Users\Jano\Documents\websites";
  10. var dest = @"C:\Users\Jano\Documents\websites-2";
  11. DirectoryCopy(source, dest, true);
  12. Console.WriteLine("Copying finished");
  13. }
  14. private static void DirectoryCopy(string source, string dest, bool copySubDirs = true)
  15. {
  16. var dir = new DirectoryInfo(source);
  17. if (!dir.Exists)
  18. {
  19. throw new DirectoryNotFoundException(
  20. $"Source directory does not exist or could not be found: {source}");
  21. }
  22. DirectoryInfo[] dirs = dir.GetDirectories();
  23. if (!Directory.Exists(dest))
  24. {
  25. Directory.CreateDirectory(dest);
  26. }
  27. FileInfo[] files = dir.GetFiles();
  28. foreach (FileInfo file in files)
  29. {
  30. string tempPath = Path.Combine(dest, file.Name);
  31. file.CopyTo(tempPath, false);
  32. }
  33. if (copySubDirs)
  34. {
  35. foreach (DirectoryInfo subdir in dirs)
  36. {
  37. string tempPath = Path.Combine(dest, subdir.Name);
  38. DirectoryCopy(subdir.FullName, tempPath, copySubDirs);
  39. }
  40. }
  41. }
  42. }
  43. }

在示例中,我们将目录及其所有子目录复制到新位置。

  1. var source = @"C:\Users\Jano\Documents\websites";
  2. var dest = @"C:\Users\Jano\Documents\websites-2";

我们定义源目录和目标目录。

  1. DirectoryCopy(source, dest, true);

复制委托给DirectoryCopy()方法。 第三个参数确定是否也复制子目录。

  1. var dir = new DirectoryInfo(source);
  2. if (!dir.Exists)
  3. {
  4. throw new DirectoryNotFoundException(
  5. $"Source directory does not exist or could not be found: {source}");
  6. }

我们从源路径创建一个DirectoryInfo对象。 如果目录不存在,我们抛出DirectoryNotFoundException

  1. DirectoryInfo[] dirs = dir.GetDirectories();

我们使用GetDirectories()方法获取所有顶级目录。

  1. if (!Directory.Exists(dest))
  2. {
  3. Directory.CreateDirectory(dest);
  4. }

如果目标目录不存在,我们将创建它。

  1. FileInfo[] files = dir.GetFiles();
  2. foreach (FileInfo file in files)
  3. {
  4. string tempPath = Path.Combine(dest, file.Name);
  5. file.CopyTo(tempPath, false);
  6. }

我们将文件放在目录中,然后将其复制到新位置。

  1. if (copySubDirs)
  2. {
  3. foreach (DirectoryInfo subdir in dirs)
  4. {
  5. string tempPath = Path.Combine(dest, subdir.Name);
  6. DirectoryCopy(subdir.FullName, tempPath, copySubDirs);
  7. }
  8. }

如果设置了copySubDirs,我们会将子目录及其内容复制到新位置。 我们递归调用DirectoryCopy()方法。

C# 目录访问控制列表

访问控制列表(ACL)是访问控制条目(ACE)的列表。 ACL 中的每个 ACE 都标识一个受托者,并指定允许,拒绝或审核该受托者的访问权限。

DirectoryInfo GetAccessControl()方法获取当前目录的访问控制列表(ACL)条目。

  1. $ dotnet add package System.IO.FileSystem.AccessControl

我们需要添加System.IO.FileSystem.AccessControl包。

Program.cs

  1. using System;
  2. using System.IO;
  3. using System.Security.AccessControl;
  4. namespace DirectoryACL
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
  11. var myDir = $@"{docPath}\test";
  12. var dirInfo = new DirectoryInfo(myDir);
  13. DirectorySecurity dSecurity = dirInfo.GetAccessControl();
  14. AuthorizationRuleCollection acl = dSecurity.GetAccessRules(true, true,
  15. typeof(System.Security.Principal.NTAccount));
  16. foreach (FileSystemAccessRule ace in acl)
  17. {
  18. Console.WriteLine("Account: {0}", ace.IdentityReference.Value);
  19. Console.WriteLine("Type: {0}", ace.AccessControlType);
  20. Console.WriteLine("Rights: {0}", ace.FileSystemRights);
  21. Console.WriteLine("Inherited: {0}", ace.IsInherited);
  22. Console.WriteLine("------------------------");
  23. }
  24. }
  25. }
  26. }

该示例显示指定目录的 ACL。

  1. var dirInfo = new DirectoryInfo(myDir);

创建一个DirectoryInfo对象。

  1. DirectorySecurity dSecurity = dirInfo.GetAccessControl();

GetAccessControl()方法返回一个DirectorySecurity对象,该对象封装了目录的访问控制规则。

  1. AuthorizationRuleCollection acl = dSecurity.GetAccessRules(true, true,
  2. typeof(System.Security.Principal.NTAccount));

我们使用GetAccessRules()方法获得了一组安全规则。

  1. foreach (FileSystemAccessRule ace in acl)
  2. {
  3. Console.WriteLine("Account: {0}", ace.IdentityReference.Value);
  4. Console.WriteLine("Type: {0}", ace.AccessControlType);
  5. Console.WriteLine("Rights: {0}", ace.FileSystemRights);
  6. Console.WriteLine("Inherited: {0}", ace.IsInherited);
  7. Console.WriteLine("------------------------");
  8. }

我们在一个foreach循环中枚举访问控制规则。

在本教程中,我们使用了 C# 中的目录。

阅读 C# 教程或列出所有 C# 教程