C#目录教程展示了如何在C#中使用目录。在我们的示例中,我们创建目录、删除它们、列出目录或获取它们的权限。
C#列表目录教程侧重于在C#中列出目录内容。
目录定义
目录,也称为文件夹,是您计算机上用于存储文件的位置。除了文件,目录还存储其他目录或快捷方式。
在C#中,我们可以使用Directory
或DirectoryInfo
来处理目录。Directory
是一个静态类,它提供了处理目录的静态方法。DirectoryInfo
的实例提供有关特定目录的信息。
这些类在System.IO
命名空间中可用。
C#创建目录
目录是使用Directory.CreateDirectory
方法创建的。
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var dirName = $@"{docPath}\test"; DirectoryInfo di = Directory.CreateDirectory(dirName); Console.WriteLine($"Full name: {di.FullName}, Name: {di.Name}, Parent: {di.Parent}"); if (Directory.Exists(dirName)) { Console.WriteLine("Directory exists"); } else { Console.WriteLine("Directory does not exist"); }
该示例在用户的Documents
目录中创建一个新的test
目录。
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
我们使用Environment.GetFolderPath
方法确定MyDocuments
目录路径。
var dirName = $@"{docPath}\test";
这是要创建的目录的完整路径。
DirectoryInfo di = Directory.CreateDirectory(dirName); Console.WriteLine($"Full name: {di.FullName}, Name: {di.Name}, Parent: {di.Parent}");
Directory.CreateDirectory
创建一个新目录并返回一个DirectoryInfo
,它表示指定路径中的目录。从目录信息对象中,我们打印目录的全名、名称和父目录。
if (Directory.Exists(dirName)) { Console.WriteLine("Directory exists"); } else { Console.WriteLine("Directory does not exist"); }
使用Directory.Exists
方法,我们可以确定指定的目录是否存在。
C#获取当前目录
Directory.GetCurrentDirectory
获取应用程序的当前工作目录。
var curDir = Directory.GetCurrentDirectory(); Console.WriteLine(curDir); Console.WriteLine(Directory.GetDirectoryRoot(curDir));
程序打印当前工作目录(程序运行的目录)及其根目录。根由Directory.GetDirectoryRoot
确定。
$ dotnet run C:\Users\Jano\Documents\csharp\directory\CurrentDirectory C:\
C#删除目录
使用Directory.Delete
方法删除目录。
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var myDir = $@"{docPath}/test3"; Directory.CreateDirectory(myDir); Console.WriteLine(Directory.Exists(myDir)); Directory.Delete(myDir); Console.WriteLine(Directory.Exists(myDir));
该示例创建一个新目录,检查其是否存在,将其删除,最后再次检查其是否存在。
$ dotnet run True False
C#移动目录
Directory.Move
移动(重命名)目录。
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var sourceDir = $@"{docPath}\test"; var destDir = $@"{docPath}\test2"; Directory.Move(sourceDir, destDir);
该示例重命名目录。
Directory.Move(sourceDir, destDir);
Directory.Move
方法的参数是:源目录和目标目录。
C#列出驱动器
Directory.GetLogicalDrives
以:\
的形式检索计算机上逻辑驱动器的名称。
string[] drives = Directory.GetLogicalDrives(); foreach (string drive in drives) { System.Console.WriteLine(drive); }
该示例列出了计算机上的所有驱动器。
C#列出目录
Directory.GetDirectories
返回子目录的名称。子目录可能满足可选的指定条件。
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string[] myDirs = Directory.GetDirectories(docPath); Console.WriteLine("Directories:"); foreach (var myDir in myDirs) { Console.WriteLine(myDir); }
该示例列出了指定目录的所有子目录。
在下一个示例中,我们为列出的目录指定一些条件。
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); Console.WriteLine(docPath); string[] myDirs = Directory.GetDirectories(docPath, "w*", SearchOption.TopDirectoryOnly); Console.WriteLine("Directories:"); foreach (var myDir in myDirs) { Console.WriteLine(myDir); }
该示例列出了所有以w
字符开头的目录。
string[] myDirs = Directory.GetDirectories(docPath, "w*", SearchOption.TopDirectoryOnly);
Directory.GetDirectories
的第一个参数是要列出的目录。第二个参数是要与要列出的子目录名称相匹配的搜索字符串。第三个参数指定搜索操作是应该包括所有子目录还是只包括当前目录。
C#列出文件
Directory.GetFiles
返回满足(可选)标准的文件名。
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string[] myFiles = Directory.GetFiles(docPath); Console.WriteLine("Files:"); foreach (var myFile in myFiles) { Console.WriteLine(myFile); }
该示例列出了用户的Documents
目录中的所有文件。
C#目录时间
Directory.GetCreationTime
获取目录的创建日期和时间。Directory.GetLastAccessTime
获取上次访问指定文件或目录的日期和时间。Directory.GetLastWriteTime)
获取最后写入指定文件或目录的日期和时间。
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var myDir = $@"{docPath}\test"; var creationTime = Directory.GetCreationTime(myDir); var lastAccessTime = Directory.GetLastAccessTime(myDir); var lastWriteTime = Directory.GetLastWriteTime(myDir); Console.WriteLine($"Creation time: {creationTime}"); Console.WriteLine($"Last access time: {lastAccessTime}"); Console.WriteLine($"Last write time: {lastWriteTime}");
该示例打印指定目录的创建时间、最后访问时间和最后写入时间。
C#列表条目
Directory.GetFileSystemEntries
返回满足指定条件的所有文件和子目录的名称。
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); string[] entries = Directory.GetFileSystemEntries(docPath, "w*"); Console.WriteLine("Entries:"); foreach (var entry in entries) { Console.WriteLine(entry); }
程序列出指定目录中的所有条目。条目必须以w
字符开头。
C#目录大小
在下面的示例中,我们确定目录的大小。
var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); long size = 0; var myDir = $@"{docPath}/csharp"; var dirInfo = new DirectoryInfo(myDir); foreach (FileInfo fi in dirInfo.GetFiles("*", SearchOption.AllDirectories)) { size += fi.Length; } Console.WriteLine($"The directory size: {size} bytes");
要获取目录的大小,我们使用DirectoryInfo的
GetFiles
方法。它返回FileInfo
类型的数组。FileInfo的
Length
属性检索文件的大小。
foreach (FileInfo fi in dirInfo.GetFiles("*", SearchOption.AllDirectories)) { size += fi.Length; }
我们搜索指定目录及其子目录中的所有文件。我们获取每个检索到的文件的大小并将它们相加。
C#复制目录
在下面的例子中,我们复制了一个目录。
var source = @"C:\Users\Jano\Documents\websites"; var dest = @"C:\Users\Jano\Documents\websites-2"; DirectoryCopy(source, dest, true); Console.WriteLine("Copying finished"); void DirectoryCopy(string source, string dest, bool copySubDirs = true) { var dir = new DirectoryInfo(source); if (!dir.Exists) { throw new DirectoryNotFoundException( $"Source directory does not exist or could not be found: {source}"); } DirectoryInfo[] dirs = dir.GetDirectories(); if (!Directory.Exists(dest)) { Directory.CreateDirectory(dest); } FileInfo[] files = dir.GetFiles(); foreach (FileInfo file in files) { string tempPath = Path.Combine(dest, file.Name); file.CopyTo(tempPath, false); } if (copySubDirs) { foreach (DirectoryInfo subdir in dirs) { string tempPath = Path.Combine(dest, subdir.Name); DirectoryCopy(subdir.FullName, tempPath, copySubDirs); } } }
在示例中,我们将一个目录及其所有子目录复制到一个新位置。
var source = @"C:\Users\Jano\Documents\websites"; var dest = @"C:\Users\Jano\Documents\websites-2";
我们定义源目录和目标目录。
DirectoryCopy(source, dest, true);
复制委托给DirectoryCopy
方法。第三个参数决定是否也复制子目录。
var dir = new DirectoryInfo(source); if (!dir.Exists) { throw new DirectoryNotFoundException( $"Source directory does not exist or could not be found: {source}"); }
我们从源路径创建一个DirectoryInfo
对象。如果目录不存在,我们将抛出一个DirectoryNotFoundException
。
DirectoryInfo[] dirs = dir.GetDirectories();
我们使用GetDirectories
方法获取所有顶级目录。
if (!Directory.Exists(dest)) { Directory.CreateDirectory(dest); }
如果目标目录不存在,我们会创建它。
FileInfo[] files = dir.GetFiles(); foreach (FileInfo file in files) { string tempPath = Path.Combine(dest, file.Name); file.CopyTo(tempPath, false); }
我们获取目录中的文件并将它们复制到新位置。
if (copySubDirs) { foreach (DirectoryInfo subdir in dirs) { string tempPath = Path.Combine(dest, subdir.Name); DirectoryCopy(subdir.FullName, tempPath, copySubDirs); } }
如果设置了copySubDirs
,我们将子目录及其内容复制到新位置。我们递归调用DirectoryCopy
方法。
C#目录访问控制列表
访问控制列表(ACL)是访问控制条目(ACE)的列表。ACL中的每个ACE标识一个受托者并指定允许、拒绝或审核该受托者的访问权限。
DirectoryInfo
GetAccessControl
方法获取当前目录的访问控制列表(ACL)条目。
$ dotnet add package System.IO.FileSystem.AccessControl
我们需要添加System.IO.FileSystem.AccessControl
包。
using System.Security.AccessControl; var docPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); var myDir = $@"{docPath}\test"; var dirInfo = new DirectoryInfo(myDir); DirectorySecurity dSecurity = dirInfo.GetAccessControl(); AuthorizationRuleCollection acl = dSecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount)); foreach (FileSystemAccessRule ace in acl) { Console.WriteLine("Account: {0}", ace.IdentityReference.Value); Console.WriteLine("Type: {0}", ace.AccessControlType); Console.WriteLine("Rights: {0}", ace.FileSystemRights); Console.WriteLine("Inherited: {0}", ace.IsInherited); Console.WriteLine("------------------------"); }
该示例打印指定目录的ACL。
var dirInfo = new DirectoryInfo(myDir);
DirectoryInfo
对象被创建。
DirectorySecurity dSecurity = dirInfo.GetAccessControl();
GetAccessControl
方法返回一个DirectorySecurity对象,它封装了目录的访问控制规则。
AuthorizationRuleCollection acl = dSecurity.GetAccessRules(true, true, typeof(System.Security.Principal.NTAccount));
我们使用GetAccessRules
方法获取一组安全规则。
foreach (FileSystemAccessRule ace in acl) { Console.WriteLine("Account: {0}", ace.IdentityReference.Value); Console.WriteLine("Type: {0}", ace.AccessControlType); Console.WriteLine("Rights: {0}", ace.FileSystemRights); Console.WriteLine("Inherited: {0}", ace.IsInherited); Console.WriteLine("------------------------"); }
我们在foreach循环中枚举访问控制规则。
在本文中,我们使用了C#中的目录。
列出所有C#教程。