C# 目录路径操作和读取文件详解

C# 目录路径操作和读取文件详解

1、Path 类 操作目录路径

string str = @"C:\3000soft\Red Spider\Data\Message\老赵.wav";
//获得文件名
Console.WriteLine(Path.GetFileName(str));
//获得文件名但是不包含扩展名
Console.WriteLine(Path.GetFileNameWithoutExtension(str));
//获得文件的扩展名
Console.WriteLine(Path.GetExtension(str));
//获得文件所在的文件夹的名称
Console.WriteLine(Path.GetDirectoryName(str));
//获得文件所在的全路径
Console.WriteLine(Path.GetFullPath(str));
//连接两个字符串作为路径
Console.WriteLine(Path.Combine(@"c:\a\" , "b.txt"));

结果

老赵.wav //获得文件名
老赵 //获得文件名但是不包含扩展名
.wav //获得文件的扩展名
C:\3000soft\Red Spider\Data\Message //获得文件所在的文件夹的名称
C:\3000soft\Red Spider\Data\Message\老赵.wav //获得文件所在的全路径
c:\a\b.txt //连接两个字符串作为路径

绝对路径和相对路径
绝对路径:通过给定的这个路径直接能在我的电脑中找到这个文件。
相对路径:文件相对于应用程序的路径。
结论:
我们在开发中应该去尽量的使用相对路径。

注意

C#的相对路径是以exe文件为标准的,不是cs文件

比如@"new.txt",文件

image-20210203145016206

2. File 类使用

编码格式:指的就是你以怎样的形式来存储字符串,数据
产生乱码的原因就是因为你保存这个文件的编码格式跟你打开这个文件的编码格式不一样。

File 类一般应用于小文件

2.1创建,删除,复制,剪切移动文件

//创建一个文件
File.Create(@"D:\new.txt");
 //删除一个文件
File.Delete(@"D:\new.txt");
//复制一个文件
File.Copy(@"D:\code.txt", @"D:\new.txt");//code.txt是源文件,new.txt是目标文件
//剪切移动,并且重命名
File.Move(@"C:\Users\SpringRain\Desktop\code.txt", @"C:\Users\SpringRain\Desktop\newnew.txt");

2.2 读取文件:ReadAllBytes,ReadAllLines,ReadAllText

【ReadAllBytes,按字节读取】

byte[] buffer = File.ReadAllBytes(@"C:\Users\SpringRain\Desktop\抽象类特点.txt");
//将字节数组中的每一个元素都要按照我们指定的编码格式解码成字符串
//UTF-8  GB2312 GBK ASCII  Unicode//Default国内默认编码GBK
string s = Encoding.Default.GetString(buffer);

一般不推荐使用Default,很容易产生乱码。

使用其他编码的方法有:

//a,这个方法编码不全
string s = Encoding.UTF8.GetString(buffer);
//b 这个方法适用于全部编码
string s = Encoding.GetEncoding("GBK").GetString(buffer);

**【ReadAllLines】**这种方式比较常用

string[] contents = File.ReadAllLines(@"C:\Users\mgboy\Desktop\1.txt", Encoding.GetEncoding("UTF-8"));
// 遍历
foreach (string item in contents)
{
    
    
    Console.WriteLine(item);
}

ReadAllLines使用其他编码的方法

//a,推荐,因为适用全部编码
string[] contents = File.ReadAllLines(@"C:\1.txt", Encoding.GetEncoding("UTF-8"));
// b
UTF8Encoding utf8 = new UTF8Encoding();
string[] contents = File.ReadAllLines(path, utf8);
//c
string[] contents2 = File.ReadAllLines(path, Encoding.UTF8);

【ReadAllText】整个文件读取

string str = File.ReadAllText("抽象类特点.txt", Encoding.Default);

2.3 写文件:WriteAllBytes,WriteAllLines,WriteAllText,AppendAllText

【WriteAllBytes】

//没有这个文件的话 会给你创建一个 有的话 会给你覆盖掉
string str = "今天天气好晴朗处处好风光";
//需要将字符串转换成字节数组,注意使用的编码
byte[] buffer = Encoding.UTF8.GetBytes(str);
File.WriteAllBytes(@"new.txt", buffer);

【WriteAllLines,WriteAllText】

//WriteAllLines 每个字符串占一行
File.WriteAllLines(@"C:\Users\SpringRain\Desktop\new.txt", new string[] {
    
     "aoe", "ewu" });

//WriteAllText
File.WriteAllText(@"C:\Users\SpringRain\Desktop\new.txt", "张三李四王五赵六");

【AppendAllText】追加文本内容

File.AppendAllText(@"C:\new.txt", "\n看我有木有把你覆盖掉");

3. 文件流读取

可以适用大文件

3.1 FileStream 读写

【读】

方式1

//使用FileStream来读取数据
//FileMode.OpenOrCreate文件模式是打开,如果没有就创建一个文件,这样如果没有文件就不会抛异常,FileAccess.Read是操作文件方式,为读取
FileStream fsRead = new FileStream(@"C:\new.txt", FileMode.OpenOrCreate, FileAccess.Read);
byte[] buffer = new byte[1024 * 1024 * 5];
//r是返回本次实际读取到的有效字节数。读取到buffer,如果文件大小不够buffer,会用空字符代替
int r = fsRead.Read(buffer, 0, buffer.Length);
//将字节数组中每一个元素按照指定的编码格式解码成字符串
string s = Encoding.UTF8.GetString(buffer, 0, r);
//关闭流
fsRead.Close();
//释放流所占用的资源
fsRead.Dispose();
Console.WriteLine(s);

//这种方式一定要手动关闭文件

方式2

//这种方式可以自动关闭文件
using (FileStream fsRead = new FileStream(@"C:\new.txt", FileMode.OpenOrCreate, FileAccess.Read))
{
    
    
    byte[] buffer = new byte[1024 * 1024 * 5];
int r = fsRead.Read(buffer, 0, buffer.Length);
string s = Encoding.UTF8.GetString(buffer, 0, r);
Console.WriteLine(s);
}

【写】

//使用FileStream来写入数据,会覆盖之前内容,不是把之前内容删除
using (FileStream fsWrite = new FileStream(@"C:\Users\mgboy\Desktop\new.txt", FileMode.OpenOrCreate, FileAccess.Write))
{
    
    
    string str = "看我游牧又把你覆盖掉";
    byte[] buffer = Encoding.UTF8.GetBytes(str);
    fsWrite.Write(buffer, 0, buffer.Length);
}

【复制文件】

//思路:就是先将要复制的多媒体文件读取出来,然后再写入到你指定的位置
public static void CopyFile(string source, string target)
{
    
    
    //首先我们先创建一个读取文件的流
    using (FileStream fsRead = new FileStream(source, FileMode.OpenOrCreate, 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);
                if (r == 0)
                {
    
    
                    break;
                }
                fsWrite.Write(buffer, 0, r);
            }
        }
    }
}

3.2 StreamReader和StreamWriter

StreamReader和StreamWriter是操作字符层面的

using (StreamReader sr = new StreamReader(@"C:\new.txt", Encoding.UTF8))
{
    
    
    // 如果不是文件结尾就继续按行读取文件
    while (!sr.EndOfStream)
    {
    
    
        Console.WriteLine(sr.ReadLine());
    }
}

//使用StreamWriter来写入一个文本文件
using (StreamWriter sw = new StreamWriter(@"C:\newnew.txt", true))//true是表示追加模式
{
    
    
    sw.Write("看我有木有把你覆盖掉");
}

猜你喜欢

转载自blog.csdn.net/qq_38463737/article/details/113617756
今日推荐