我的C#学习笔记(三)文件操作

作者 Zhendong Ho 日期 2018-08-30
C#
我的C#学习笔记(三)文件操作

Path类

GetFileName:获得文件名

//快速获得一个路径中的文件名
string str = @"C:\aaa\bbb\c.txt";
Console.WriteLine(Path.GetFileName(str));//c.txt

GetFileNameWithoutExtension:获得文件名但不包含扩展名

//获得文件名但不包括扩展名
string str = @"C:\aaa\bbb\c.txt";
Console.WriteLine(Path.GetFileNameWithoutExtension(str));//c

GetExtension:获得文件的扩展名

//直接获得扩展名
string str = @"C:\aaa\bbb\c.txt";
Console.WriteLine(Path.GetFileNameWithoutExtension(str));//.txt

GetDirectoryName:获得文件所在文件夹的名称

//获得文件所在文件夹的名称
string str = @"C:\aaa\bbb\c.txt";
Console.WriteLine(Path.GetDirectoryName(str));//C:\aaa\bbb

GetFullPath:获得文件所在的全路径

//获得文件所在的全路径
string str = @"C:\aaa\bbb\c.txt";
Console.WriteLine(Path.GetFullPath(str));//C:\aaa\bbb\c.txt

Combine:连接两个字符串作为路径

//连接两个字符串作为路径
Console.WriteLine(Path.Combine(@"C:\a\", @"b.txt");//C:\a\b.txt

File类的基本操作

Create:创建一个文件

//创建一个文件
File.Create(@"C:\Users\Administrator\Desktop\new.txt");

注意:如果使用Create创建同一个文件,不会重复创建,只会对文件进行修改。

Delete:删除一个文件

//删除一个文件
File.Delete(@"C:\Users\Administrator\Desktop\new.txt");

Copy:复制一个文件

//复制一个文件
File.Copy(@"C:\aaa\b.txt", @"C:\aaa\new.txt");

读文件的三个方法

  1. ReadAllBytes:以字节的形式读文件

    byte[] buffer = File.ReadAllBytes(@"C:\aaa\b.txt");
    //将字节数组中的每一个元素都要按照我们指定的编码格式解码成字符串
    string s = Encoding.Default.GetString(buffer);
    Console.WriteLine(s);
  2. ReadAllLines:以行的形式读文件

    string content[] = File.ReadAllLines(@"C:\aaa\bbb\new.txt", Encoding.Default);
    foreach (string item in content)
    {
    Console.WriteLine(item);
    }
  3. ReadAllText:以文本的形式读文件

    string str = File.ReadAllText(@"C:\aaa\bbb\new.txt", Encoding.Default);
    Console.WriteLine(str);

注意

  • ReadAllText和ReadAllLines只能读取文本文件,而ReadAllBytes读取所有文件,包括图片,音频,多媒体文件。
  • ReadAllLines返回字符串数组,ReadAllText返回字符串。

写文件的方法

  1. WriteAllBytes:以字节形式写文件

    string str = "今天天气好晴朗处处好风光";
    //需要将字符串转换成字节数组
    byte[] buffer = Encoding.Default.GetBytes(str);
    //如果文件不存在,则创建,否则覆盖该文件
    File.WriteAllBytes(@"C:\aaa\bbb\new.txt", buffer);
  2. WriteAllLines:以行的形式写文件

    File.WriteAllLines(@"C:\aaa\bbb\new.txt", new string[] str { "aoe", "iuy" });
  3. WriteAllText:以字符串的形式写文件

    File.WriteAllText(@"C:\aaa\bbb\new.txt", "张三李四王五");
  4. AppendAllText:不覆盖原文件,在后面追加文件

    File.AppendAllText(@"C:\aaa\bbb\new.txt", "看我有没有把你覆盖");

编码

定义

将字符串以什么样的形式保存为二进制,这个就是编码。

编码发展

  • ASC:美国人最早的128位编码,表示a-z,0-9等。
  • ASCII:256位编码,对ASC的扩充。
  • GB2312:简体字。
  • Big5:繁体字。
  • unicode:基本囊括各个国家的语言,但是解析起来慢。
  • UTF-8:用于web的编码。

注意

  1. UTF-8和UTF-7,UTF-32共同组成unicode。
  2. GBK和GB2312区别,GB2312只有简体中文,GBK既有简体,又有繁体。

产生乱码的原因

就是保存文件所采用的编码,跟打开这个文件所采用的编码格式不一样。

绝对路径和相对路径

绝对路径:通过给定的这个路径直接能在计算机中找到这个文件。

相对路径:文件相对于应用程序的路径。在开发中应该尽量去使用相对路径。

FileStream类

File类和FileStream类的区别

File:读取或者操作整个文件,只能操作小文件。

FileStream:把文件分割成很多份去操作(字节),可以操作大文件。

使用FileStream来读取数据

//参数一:要操作的文件路径。
//参数二:针对该文件的操作。
//参数三:对文件中的数据的操作。
FileStream fdRead = new FileStream(@"c:/aaa/b.txt", FileMode.OpenOrCreate, FileAccess.Read);

byte[] buffer = new byte[1024 * 1024 * 5];

//参数一:要存放的字节数据
//参数二:从哪个位置开始读取字节数组
//参数三:最多读取的字节数
int r = fdRead.Read(buffer, 0, buffer.Length);//返回本次实际读取到的有效字节数
//将字节数组中每一个元素按照指定的编码格式解码成字符串
string s = Encoding.Default.GetString(buffer, 0, r);
//关闭流
fdRead.Close();
//释放流所占用的资源
fdRead.Dispose();

使用FileStream来写入数据

注意:将创建文件流对象的过程写在using当中,会自动的帮助我们释放流所占用的资源。

using(FileStream fsWrite = new FileStream(@"c:/aaa/b.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
string str = "看我有没有把你覆盖掉";
byte[] buffer = Encoding.Default.GetBytes(str);
fsWrite.Write(buffer, 0, buffer.Length);
}
Console.WriteLine("写入ok");
Console.ReadKey();

实现多媒体文件的复制

思路:先将要复制的多媒体文件读取出来,然后再写入另外一个指定的文件中。

Main函数

static void Main(string[] args)
{
string source = @"C:\Users\Administrator\Desktop\1.基础练习.avi";
string target = @"C:\Users\Administrator\Desktop\new.avi";
CopyFile(source, target);
Console.WriteLine("复制成功");
Console.ReadKey();
}

CopyFile方法

public static void CopyFile(string source, string target)
{
//创建一个负责读取的流
using (FileStream fsRead = new FileStream(source, FileMode.Open, FileAccess.Read))
{
//创建一个负责写入的流
using (FileStream fsWrite = new FileStream(target, FileMode.OpenOrCreate, FileAccess.Write))
{
byte[] buffer = new byte[1024 * 1024 * 5];
//因为文件可能会比较大,所以我们在读取的时候,应该通过一个循环去读取
while (true)
{
//返回本次读取实际读到的字节数
int r = fsRead.Read(buffer, 0, buffer.Length);
//如果返回一个0,就意味着什么都没有读取到,读取完了
if (r == 0)
{
break;
}
fsWrite.Write(buffer, 0, r);
}
}
}
}

StreamReader和StreamWriter

StreamReader读取文本文件

//使用StreamReader来读取一个文本文件
using (StreamReader sr = new StreamReader(@"C:\Users\Administrator\Desktop\备忘录.txt", Encoding.Default))
{
while (!sr.EndOfStream)
{
Console.WriteLine(sr.ReadLine());
}
}
Console.ReadKey();

StreamWriter写入文本文件

//使用StreamWriter写入文本文件,第二个参数表示覆盖或者追加
using (StreamWriter sw = new StreamWriter(@"C:\Users\Administrator\Desktop\备忘录.txt", true))
{
sw.Write("Hello");
}
Console.WriteLine("OK");
Console.ReadKey();