C# 文件IO

文章目录

  • 判断某个文件夹是否存在
  • 获取当前运行程序(exe或dll)所在路径
  • 创建文件夹
  • 移动(剪切)文件夹
  • 复制文件
  • 创建文件
  • 覆盖写文件
    • 方式一:使用FileStream
    • 方式二:使用StreamWriter
  • 追加写文件
  • 读文件
    • 一:一次性读完文件所有内容
    • 二:读部分

判断某个文件夹是否存在

Console.WriteLine(Directory.Exists(@"C:\Windows"));

获取当前运行程序(exe或dll)所在路径

Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);

创建文件夹

DirectoryInfo directoryInfo = Directory.CreateDirectory(@"D:/test1/test2/test3/test4");

移动(剪切)文件夹

Directory.Move(@"D:/sourceDir", @"D:/destDir");

复制文件

File.Copy(@"D:/sourceFile", @"D:/destFile");

创建文件

FileStream fileStream = File.Create("D:/test/file1.txt")

注意File.Create是覆盖的,即如果文件已存在则会被清空
File.Create是独占的,文件创建后关闭前,其它程序不能访问该文件

覆盖写文件

方式一:使用FileStream

using (FileStream fileStream = File.Create("D:/test/file1.txt"))
{
     
	//将内容写入缓冲区
    fileStream.Write(Encoding.UTF8.GetBytes("hello\r\nhello2"));
    //清空缓冲区,这时缓冲区的内容才会被真正写入文件中,此处的Flush方法可不调用,因为使用了using,当离开using时fileStream关闭,将自动清空缓冲区。反之,如果不使用using则需要手动调用fileStream.Flush()方法或fileStream.Close()方法,否则内容不会被写入文件中
    //fileStream.Flush();
}

方式二:使用StreamWriter

using (StreamWriter streamWriter = new StreamWriter("D:/test/file1.txt"))
{
     
    streamWriter.WriteLine("hello3");
    streamWriter.WriteLine("hello4");
    //streamWriter.Flush();
}

追加写文件

using (StreamWriter streamWriter = File.AppendText(@"D:\test\file1.txt"))
{
     
    streamWriter.WriteLine("hello5");
}

读文件

一:一次性读完文件所有内容

1.一次性读完分行保存在string[]中:

foreach(string line in File.ReadAllLines("D:/test/file1.txt"))
{
     
    Console.WriteLine(line);
}

2.一次性读完所有内容保存在一个string变量中

string fileString = File.ReadAllText("D:/test/file1.txt");
Console.WriteLine(fileString);

3.一次性读完所有内容保存在bite[]中

byte[] fileBytes = File.ReadAllBytes("D:/test/file1.txt");
Console.WriteLine(Encoding.Default.GetString(fileBytes));

一次性读完文件所有内容有个问题,就是当文件特别大时一次性把文件的内容读到内存中显然是不现实的,因此需要有一次性读文件的一部分到内存中的方法

二:读部分

1.一次读取一行

StreamReader streamReader = new("D:/test/file1.txt");
string line = string.Empty;
while (true)
{
     
    line = streamReader.ReadLine();
    if (line is not null)
    {
     
        Console.WriteLine(line);
    }
    else
    {
     
        break;
    }
}

2.一次读取固定长度的byte[]

const int MAXSIZE = 1024;
byte[] buffer = new byte[MAXSIZE];

using (var fileStream = File.OpenRead("D:/test/file1.txt"))
{
     
    int numOfByte = 0;
    do
    {
     
        Console.Write(Encoding.Default.GetString(buffer));
        numOfByte = fileStream.Read(buffer, 0, MAXSIZE);
    }
    while (numOfByte == MAXSIZE);
}

以上程序运行时出现乱码,原因是中文UTF8编码后占三个字节
如果按固定长度读取byte[],可能导致中文字符截断,
例如假设byte[]最大长度为100,则只能存放33个中文加上1/3个中文,这样中文字符被截断出现乱码
我目前还没有找到很好的解决该问题的方法

你可能感兴趣的:(C#,c#)