C#文件和目录操作
文件与目录操作
System.IO
命名空间中有一些可以进行文件和目录操作(例如复制和移动、创建目录,以及设置文件的属性和权限)的实用类型。对于大多数的特性我们都有两种选择:一种是静态方法,而另一种则是实例方法。
静态类:File
和Directory
,还有Path
用于处理文件名称或者目录路径。
实例方法类(使用文件或者目录创建):FileInfo
和DirectoryInfo
File类
提供用于创建、复制、删除、移动和打开单一文件的静态方法,并协助创建 FileStream 对象。
File.Exists(string)方法
使用File.Exists(path)
可以检测文件是否存在,如果存在返回true
,否则返回false
。
string path = @"d:\temp\MyTest.txt";
if (!File.Exists(path))
{
// ...
}
File.OpenText(String) 方法
打开一个UTF8编码的文本文件以进行读取。
using (StreamReader sr = File.OpenText(path))
{
string s = "";
while ((s = sr.ReadLine())!=null)
{
Console.WriteLine(s);
}
}
File.CreateText(String) 方法
创建或打开用于写入 UTF-8 编码文本的文件。 如果该文件已存在,将覆盖其内容。
// 定义文件路径
string path = @"d:\temp\mytest.txt";
if (!File.Exists(path))
{
// 如果文件不存在创建文件并写入
using (StreamWriter sw = File.CreateText(path))
{
sw.WriteLine("hello");
sw.WriteLine("And");
sw.WriteLine("Welcome");
}
}
File.AppendAllLines 方法
向一个文件中追加行,然后关闭该文件。 如果指定文件不存在,此方法会创建一个文件,向其中写入指定的行,然后关闭该文件。
AppendAllLines(String, IEnumerable<String>)
使用指定的编码向一个文件中追加行,然后关闭该文件。 如果指定文件不存在,此方法会创建一个文件,向其中写入指定的行,然后关闭该文件。
AppendAllLines(String, IEnumerable<String>, Encoding)
如果文件不存在,则该方法将创建该文件,但不会创建新的目录。 因此,参数的值 path 必须包含现有目录。
string dataPath = @"d:\temp\timestamps.txt";
CreateSample(dataPath);
var JulyWeekends = from line in File.ReadLines(dataPath)
where (line.StartsWith("2")
|| line.StartsWith("Sunday"))
& line.Contains("9")
select line;
File.WriteAllLines(@"d:\temp\selectedDays.txt", JulyWeekends);
var MarchMondays = from line in File.ReadLines(dataPath)
where line.StartsWith("1") &&
line.Contains("9")
select line;
File.AppendAllLines(@"d:\temp\selectedDays.txt", MarchMondays);
static void CreateSample(string dataPath)
{
DateTime TimeStamp = new DateTime(1700, 1, 1);
using (StreamWriter sw = new StreamWriter(dataPath))
{
for (int i = 0; i < 500; i++)
{
DateTime TS1 = TimeStamp.AddYears(i);
DateTime TS2 = TS1.AddMonths(i);
DateTime TS3 = TS2.AddDays(i);
sw.WriteLine(TS3.ToLongDateString());
}
}
}
更多方法参考File类的方法
Directory类和DirectoryInfo
如何从目录中检索所有文本,并将其移动到新目录。
string sourceDirectory = @"d:\temp\current";
string archiveDirectory = @"d:\temp\archive";
if (!Directory.Exists(sourceDirectory))
{
Directory.CreateDirectory(sourceDirectory);
Console.WriteLine("Create sourceDirectory successed!");
}
if (!Directory.Exists(archiveDirectory))
{
Directory.CreateDirectory(archiveDirectory);
Console.WriteLine("Create archiveDirectory successed!");
}
try
{
var txtFiles = Directory.EnumerateFiles(sourceDirectory, "*.txt");
foreach (string currentFile in txtFiles)
{
string filename = currentFile.Substring(sourceDirectory.Length + 1);
Directory.Move(currentFile, Path.Combine(archiveDirectory, filename));
}
}
catch (Exception e)
{
Console.WriteLine(e.Message); ;
}
Directory.CreateDirectory方法
在指定路径中创建所有目录和子目录,除非它们已经存在。
Directory.Delete 方法
删除指定目录及(可选地)删除其任意子目录。
创建目录并删除。
string path = @"d:\tmp\mydir\mydircdr";
try
{
if (Directory.Exists(path))
{
Console.WriteLine("That path exists already.");
return;
}
// try to create the directory
DirectoryInfo di = Directory.CreateDirectory(path);
Console.WriteLine("The director was created successfully at {0}.", Directory.GetCreationTime(path));
// delete the diectory
di.Delete();
Console.WriteLine("The directory was deleted successfully.");
}
catch (Exception e)
{
Console.WriteLine("The process failed: {0}", e.ToString());
}
Directory.EnumerateDirectories 方法
返回指定路径中的目录完整名称的可枚举集合。
Directory.Exists 方法
确定给定路径是否引用磁盘上的现有目录。
Directory.GetDirectories 方法
确定给定路径是否引用磁盘上的现有目录。
更多方法参考Directory类的方法
FileInfo类和DirectoryInfo类
File
和Directory
类型的静态方法便于操作单个文件或目录。但是如果要针对一个项目进行一系列调用,则FileInfo
和DirectoryInfo
类提供的对象模型更加适合。
FileInfo
类以实例成员的形式提供了File类型静态方法的大部分功能。此外还包含一些额外的属性,如Extensions
、Length
、IsReadOnly
以及Directory
(返回一个DirectoryInfo对象)。
FileInfo fileInfo = new FileInfo(@"d:\temp\FileInfo.txt");
Console.WriteLine(fileInfo.Exists); // False
using (TextWriter w = fileInfo.CreateText())
{
w.Write("some text");
}
Console.WriteLine(fileInfo.Exists); //False
fileInfo.Refresh();
Console.WriteLine(fileInfo.Exists); // True
Console.WriteLine(fileInfo.Name); // FileInfo.txt
Console.WriteLine(fileInfo.FullName); // d:\temp\FileInfo.txt
Console.WriteLine(fileInfo.DirectoryName); // d:\temp
Console.WriteLine(fileInfo.Directory.Name); // temp
Console.WriteLine(fileInfo.Extension); // .txt
fileInfo.Attributes = FileAttributes.Hidden;
fileInfo.IsReadOnly = false;
Console.WriteLine(fileInfo.Attributes); // ReadOnly, Hidden
Console.WriteLine(fileInfo.CreationTime); // 2022 / 2 / 4 16:09:29
fileInfo.MoveTo(@"d:\temp\FileInfoX.txt");
DirectoryInfo directoryInfo = fileInfo.Directory;
Console.WriteLine(directoryInfo.Name); // temp
Console.WriteLine(directoryInfo.FullName); // d:\temp
Console.WriteLine(directoryInfo.Parent.FullName); // d:\
directoryInfo.CreateSubdirectory("SubFolder");
查看指定目录下的文件和目录:
DirectoryInfo directoryInfo = new DirectoryInfo(@"d:\temp");
foreach (FileInfo file in directoryInfo.GetFiles("*.txt"))
{
Console.WriteLine(file.Name);
}
foreach (DirectoryInfo sunDir in directoryInfo.GetDirectories())
{
Console.WriteLine(sunDir.Name);
}