目录管理

Directory类

需要先引入命名空间System.IO

创建目录:

private string pathName = @"E:\Test";//@不解释转义字符
Directory.CreateDirectory(pathName);

判断是否存在指定路径的目录:

bool isExists = Directory.Exists(pathName);

删除指定目录:

Directory.Delete(pathName);

获取当前工作的目录:

string pathName = Directory.GetCurrentDirectory()

Assembly类

需要引入命名空间System.Reflection

获取当前工作目录的程序集(用的更多):

string pathName = Assembly.GetExecutingAssembly().Location;

路径管理

Path类需要先引入命名空间System.IO

改变文件的后缀名:

private string fileName = @"E:\Test.txt";
Path.ChangeExtension(fileName,"docx");
//参数说明:第一个参数为要修改后缀名的文件目录,第二个参数为要改变为的后缀名
//不是真的给文件改后缀名,只是返回一个字符串
//如果真的想改后缀名可以先创建一个对应的后缀名的文件再将原本的删除

获得文件后缀名称:

string str = Path.GetExtension(fileName);

获得指定路径的文件名称:

string str = Path.GetFileName(fileName);

获得当前路径对应的绝对路径:

string str = Path.GetFullPath(fileName);
//将当前路径与写的文件名组合起来

文件管理

File类需要先引入命名空间System.IO

文件创建:

private string pathName1 = @"E:\Test.txt";
private string pathName2 = @"F:\Test.txt";
File.Create(pathName);

文件删除:

File.Delete(pathName1);

文件移动(剪贴):

//需要先创建才能移动
File.Move(pathName1,pathName2);

文件是否存在:

bool isExists = File.Exists(pathName2);

文件拷贝(复制):

//不允许覆盖同名文件(默认)
File.Copy(pathName1,pathName2);
//允许覆盖同名文件
File.Copy(pathName1,pathName2,true);

文件的直接读写

优点:简单

缺点:对于大的文件效率较低

读取文本文件中所有的内容,返回一个字符串数组(面向多行的文本文件):

private string pathName = @"E:\Test.txt";
string [] strArray = File.ReadAllLines(pathName,Encoding.UTF8);//其中有一个重载可以指定用什么编码格式读取

读取文本文件中所有的内容,返回一个字符串(单行的文本文件):

string str = File.ReadAllText(pathName);

写入文本文件中所有的内容,返回一个字符串数组:

private string pathName = @"E:\Test.txt";
string [] strArray = {"aa","bb"};
File.WriteAllLines(pathName,strArray,Encoding.UTF8);//其中有一个重载可以指定用什么编码格式读取

写入文本文件中所有的内容,返回一个字符串:

File.WriteAllText(pathName,"HelloWorld");

向文本文件中追加字符串:

string str = "HelloWorld";
File.AppendAllText(pathName,str,Encoding.UTF8);

文件流的读写

文件流相对于直接读写效率跟高,占用内存更小。

文件流的读取:

FileStream fs = new FileStream(pathName,FileMode.Open);//定义文件流
byte[] byteArray = new byte[1024];//开辟一块内存空间,单位为字节
int count = fs.Read(byteArray,0,byteArray.Length);//开始读取数据,返回值为实际读取的长度
string str = Encoding.UTF8.GetString(byteArray,0,count);//将读取的byte数组转换为字符串
fs.Close();//关闭文件流,清理资源

文件流的写入:

FileStream fs = new FileStream(pathName,FileMode.OpenOrCreate);//定义文件流
string str = "HelloWorld";//要写入的字符串
byte[] byteArray = Encoding.UTF8.GetBytes(str);//将要写入的字符串转为byte数组
fs.Write(byteArray,0,byteArray.Length);//写入文件
fs.Close();//关闭文件流,清理资源

大文件的拷贝

  • io操作操作硬盘需要使用try-catch-finaly语句
  • 可以使用Using语句来简化try-catch,如上面的例子使用using来自动释放资源(不需要再在finally中close了)
  • using括号内的语句仅在using语句内有效,在外面就无效了
  • 注意:使用Using语句()内的语句初始化的类如FileStream,必须是实现IDisposable接口的
string sourcePath = @"F:\xxx.mp4";
string targetPath = @"E:\xxx.mp4";
if(File.Exists(sourcePath))
{
    //读取
    using (FileStream fsRead = new FileStram(sourcePath,FileMode.Open))
    {
        //写入
        using (FileStream fsWrite = new FileStram(targetPath,FileMode.OpenOrCreate))
        {
            byte [] readArray = new byte[1024 * 1024];//每次读1M
            while(true)
            {
                int readCount = fsRead(readArray,0,readArray.Length);
                fsWrite.Write(readArray,0,readCount);
                if(readCount < readArray.Length)
                {
                    break;//说明拷贝完了,退出循环
                }
            }
        }
    }
}
else
{
    Console.WriteLine("源路径不存在");
}

文本文件的读写

FileStream需要进行文本和二进制的转换,如果只是想读写文本文件,可以使用StreamReader和StreamWriter。

文本文件的读取:

string pathName = @"F:\xxx.txt";
StreamReader sr = new StreamReader(pathName);
while(sr.Peek() >= 0)//返回下一个可用的字符
{
    Console.WriteLine(sr.ReadLine());
}
sr.Close();

文本文件的写入:

StreamWriter sw = new StreamWriter(pathName);
sw.WriteLine(str);
sw.Close();

序列化与反序列化(2进制)

序列化:将类的对象以文本的形式保存为文件

反序列化:创建相同的对象,然后将文本中的数据重新赋值给对象的字段

File类需要引入命名空间System.IO;

序列化与反序列化需要引入System.Runtime.SeriaLization.Formatters.Binary;命名空间

eg:实现Person类的序列化与反序列化,Person类中有姓名、年龄两个变量

序列化:

private string pathName = @"E:\Test.txt";//序列化后放文件的位置

Person p = new Person("name",16);
if(File.Exists(pathName))
{
    using(FileStream fs = new FileStream(pathName,FileMode.OpenOrCreate))
    {
        BinaryFormatter bf = new BinaryFormatter();
        bf.Serialize(fs,p);
    }
}

反序列化:

Person p = null;
if(File.Exists(pathName))
{
    using(FileStream fs = new FileStream(pathName,FileMode.OpenOrCreate))
    {
        BinaryFormatter bf = new BinaryFormatter();
        p = bf.Deserialize(fs) as Person;
    }
    Console.WriteLine(p.Name);
    Console.WriteLine(p.Age);
}

参考资料

https://docs.microsoft.com/zh-cn/dotnet/api/system.io?redirectedfrom=MSDN&view=net-6.0

https://www.bilibili.com/video/BV1G7411c773