C# 文件IO

判断某个文件夹是否存在

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

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

Console.WriteLine(Directory.GetCurrentDirectory());
//或
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个中文,这样中文字符被截断出现乱码
我目前还没有找到很好的解决该问题的方法

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值