🐋作者简介:博主是一位.Net开发者,同时也是RPA和低代码平台的践行者。
🐬个人主页:会敲键盘的肘子
🐰系列专栏:.Net实用方法总结
🦀专栏简介:博主针对.Net开发和C站问答过程中遇到的问题进行总结,形成本专栏,希望可以帮助到您解决问题。
🐶座右铭:总有一天你所坚持的会反过来拥抱你。
🌈写在前面:
本文主要介绍System.IO命名空间的DirectoryInfo 类,介绍其常用的方法和示例说明。
👉本文关键字:System.IO、DirectoryInfo类、文件或目录路径信息、方法示例、C#
.NET中的IO操作命名空间,包含允许读写文件和数据流的类型以及提供基本文件和目录支持的类型。
我们在.NET中的IO操作,经常需要调用一下几个类。
文件流类,负责大文件的拷贝,读写。
Path类中方法,基本都是对字符串(文件名)的操作,与实际文件没多大关系。
File类
File类可以进行一些对小文件拷贝、剪切操作,还能读一些文档文件。
Dirctory类
目录操作,创建文件、删除目录,获取目录下文件名等等。
公开用于创建、移动和枚举目录和子目录的实例方法。 此类不能被继承。
public sealed class DirectoryInfo : System.IO.FileSystemInfo
public DirectoryInfo (string path);
参数
path
string
一个字符串,它指定要在其中创建
DirectoryInfo
的路径。
示例
下面的示例使用此构造函数创建指定的目录和子目录,并演示不能删除包含子目录的目录。
using System;
using System.IO;
class Test
{
public static void Main()
{
// Specify the directories you want to manipulate.
DirectoryInfo di1 = new DirectoryInfo(@"c:\MyDir");
DirectoryInfo di2 = new DirectoryInfo(@"c:\MyDir\temp");
try
{
// Create the directories.
di1.Create();
di2.Create();
// This operation will not be allowed because there are subdirectories.
Console.WriteLine("I am about to attempt to delete {0}.", di1.Name);
di1.Delete();
Console.WriteLine("The Delete operation was successful, which was unexpected.");
}
catch (Exception)
{
Console.WriteLine("The Delete operation failed as expected.");
}
finally {}
}
}
补充
此构造函数不检查目录是否存在。
protected string FullPath;
public DateTime CreationTime { get; set; }
public abstract bool Exists { get; }
public string Extension { get; }
public virtual string FullName { get; }
public override string Name { get; }
Name此属性仅返回目录的名称,例如"Bin"。 若要获取完整路径,例如"c:\public\Bin",请使用 FullName 属性。
public System.IO.DirectoryInfo? Parent { get; }
示例
using System;
using System.IO;
public class MoveToTest
{
public static void Main()
{
// Make a reference to a directory.
DirectoryInfo di = new DirectoryInfo("TempDir");
// Create the directory only if it does not already exist.
if (di.Exists == false)
di.Create();
// Create a subdirectory in the directory just created.
DirectoryInfo dis = di.CreateSubdirectory("SubDir");
// Get a reference to the parent directory of the subdirectory you just made.
DirectoryInfo parentDir = dis.Parent;
Console.WriteLine("The parent directory of '{0}' is '{1}'", dis.Name, parentDir.Name);
// Delete the parent directory.
di.Delete(true);
}
}
public System.IO.DirectoryInfo Root { get; }
public void Create ();
示例
using System;
using System.IO;
class Test
{
public static void Main()
{
// Specify the directories you want to manipulate.
DirectoryInfo di = new DirectoryInfo(@"c:\MyDir");
try
{
// Determine whether the directory exists.
if (di.Exists)
{
// Indicate that it already exists.
Console.WriteLine("That path exists already.");
return;
}
// Try to create the directory.
di.Create();
Console.WriteLine("The directory was created successfully.");
// Delete the directory.
di.Delete();
Console.WriteLine("The directory was deleted successfully.");
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
finally {}
}
}
补充
如果该目录已存在,则此方法不执行任何操作。
public System.IO.DirectoryInfo CreateSubdirectory (string path);
参数
path
string
指定的路径。
返回
DirectoryInfo
在
path
中指定的最后一个目录。
示例
下面的示例演示如何创建子目录。 在此示例中,创建的目录在创建后将被删除。 因此,若要测试此示例,请在代码中注释掉删除行。
using System;
using System.IO;
public class CreateSubTest
{
public static void Main()
{
// Create a reference to a directory.
DirectoryInfo di = new DirectoryInfo("TempDir");
// Create the directory only if it does not already exist.
if (di.Exists == false)
di.Create();
// Create a subdirectory in the directory just created.
DirectoryInfo dis = di.CreateSubdirectory("SubDir");
// Process that directory as required.
// ...
// Delete the subdirectory.
dis.Delete(true);
// Delete the directory.
di.Delete(true);
}
}
public void Delete (bool recursive);
参数
recursive
bool
如果要删除此目录,则为
true
;否则为false
。
示例
using System;
using System.IO;
public class DeleteTest
{
public static void Main()
{
// Make a reference to a directory.
DirectoryInfo di = new DirectoryInfo("TempDir");
// Create the directory only if it does not already exist.
if (di.Exists == false)
di.Create();
// Create a subdirectory in the directory just created.
DirectoryInfo dis = di.CreateSubdirectory("SubDir");
// Process that directory as required.
// ...
// Delete the subdirectory. The true indicates that if subdirectories
// or files are in this directory, they are to be deleted as well.
dis.Delete(true);
// Delete the directory.
di.Delete(true);
}
}
public System.Collections.Generic.IEnumerable EnumerateFiles ();
返回
IEnumerable
一个可枚举集合,它包含目录中
path
指定的文件的完整名称(包括路径)。
示例
// Create a DirectoryInfo of the directory of the files to enumerate.
DirectoryInfo DirInfo = new DirectoryInfo(@"\\archives1\library\");
DateTime StartOf2009 = new DateTime(2009, 01, 01);
// LINQ query for all files created before 2009.
var files = from f in DirInfo.EnumerateFiles()
where f.CreationTimeUtc < StartOf2009
select f;
// Show results.
foreach (var f in files)
{
Console.WriteLine("{0}", f.Name);
}
如果只需要文件的名称,请使用静态 Directory 类以提高性能。
和 EnumerateFiles GetFiles 方法不同,如下所示:
- 使用 时 EnumerateFiles ,可以在返回整个集合 FileInfo 之前开始枚举 对象的集合。
- 使用 时 GetFiles ,必须等待返回整个 对象数组 FileInfo ,然后才能访问数组。
因此,当你使用许多文件和目录时, EnumerateFiles 可能更高效。
public System.Collections.Generic.IEnumerable EnumerateFiles (string searchPattern);
参数
searchPattern
string
要与
path
中的文件名匹配的搜索字符串。 此参数可以包含有效文本路径和通配符(* 和 ?)的组合,但不支持正则表达式。例如,"*.txt"
返回
IEnumerable
一个可枚举集合,它包含目录中
path
指定的文件的完整名称(包括路径)。
public System.Collections.Generic.IEnumerable EnumerateFiles (string searchPattern, System.IO.SearchOption searchOption);
参数
searchPattern
string
要与
path
中的文件名匹配的搜索字符串。 此参数可以包含有效文本路径和通配符(* 和 ?)的组合,但不支持正则表达式。例如,"*.txt"
searchOption
指定搜索操作是应仅包含当前目录还是应包含所有子目录的枚举值之一。 默认值是 TopDirectoryOnly。
返回
IEnumerable
一个可枚举集合,它包含目录中
path
指定的文件的完整名称(包括路径)。
示例
下面的示例演示如何使用不同的搜索选项枚举目录中的文件。 该示例假设有一个目录,其中包含名为 log1.txt、log2.txt、test1.txt、test2.txt、test3.txt 的文件,以及一个包含名为 SubFile.txt 的文件的子目录。
using System;
using System.IO;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
DirectoryInfo di = new DirectoryInfo(@"C:\ExampleDir");
Console.WriteLine("No search pattern returns:");
foreach (var fi in di.EnumerateFiles())
{
Console.WriteLine(fi.Name);
}
Console.WriteLine();
Console.WriteLine("Search pattern *2* returns:");
foreach (var fi in di.EnumerateFiles("*2*"))
{
Console.WriteLine(fi.Name);
}
Console.WriteLine();
Console.WriteLine("Search pattern test?.txt returns:");
foreach (var fi in di.EnumerateFiles("test?.txt"))
{
Console.WriteLine(fi.Name);
}
Console.WriteLine();
Console.WriteLine("Search pattern AllDirectories returns:");
foreach (var fi in di.EnumerateFiles("*", SearchOption.AllDirectories))
{
Console.WriteLine(fi.Name);
}
}
}
}
/*
This code produces output similar to the following:
No search pattern returns:
log1.txt
log2.txt
test1.txt
test2.txt
test3.txt
Search pattern *2* returns:
log2.txt
test2.txt
Search pattern test?.txt returns:
test1.txt
test2.txt
test3.txt
Search pattern AllDirectories returns:
log1.txt
log2.txt
test1.txt
test2.txt
test3.txt
SubFile.txt
Press any key to continue . . .
*/
public void MoveTo (string destDirName);
参数
destDirName
string
新位置
sourceDirName
的路径或其内容。 如果sourceDirName
是文件,那么destDirName
也必须是文件名。
示例
以下示例演示如何将目录及其所有文件移动到新目录。 移动原始目录后不再存在。
using System;
using System.IO;
public class MoveToTest
{
public static void Main()
{
// Make a reference to a directory.
DirectoryInfo di = new DirectoryInfo("TempDir");
// Create the directory only if it does not already exist.
if (di.Exists == false)
di.Create();
// Create a subdirectory in the directory just created.
DirectoryInfo dis = di.CreateSubdirectory("SubDir");
// Move the main directory. Note that the contents move with the directory.
if (Directory.Exists("NewTempDir") == false)
di.MoveTo("NewTempDir");
try
{
// Attempt to delete the subdirectory. Note that because it has been
// moved, an exception is thrown.
dis.Delete(true);
}
catch (Exception)
{
// Handle this exception in some way, such as with the following code:
// Console.WriteLine("That directory does not exist.");
}
// Point the DirectoryInfo reference to the new directory.
//di = new DirectoryInfo("NewTempDir");
// Delete the directory.
//di.Delete(true);
}
}
如果要多次重用某个对象,请考虑使用的实例方法(而不是 DirectoryInfo 类的相应静态方法 Directory ),因为安全检查并不总是必需的。
更多方法请查阅官方文档DirectoryInfo 类。
⭐写在结尾:
文章中出现的任何错误请大家批评指出,一定及时修改。
希望写在这里的小伙伴能给个三连支持!