文章目录
前言
- 任何类的存在都是为了某个功能,而实现这些功能,有一套广而有效的抽象逻辑准则
- 只要这个准则掌握了,那些具体的实现细节和api的调用就很容易理解了
文件
- 对于文件,我们有 读取, 创建, 剪切,复制,写入,追加写入等操作
- 在System.IO命名空间下面
- 在创建一个与文本文件相关的实例时,都需以其相对路径或绝对路径作为参数
- 在创建文件时,需要注意覆盖问题,即在文件夹中存在与其同名的文件,则覆盖,或者报出错误
- 注意要标注上 后缀名
文件系统
- FileSystemInfo 表示任何文件系统对象的基类
- FileInfo 与File 表示文件系统上的文件
- DirectoryInfo 和Directory 表示文件系统的文件夹
- DriveInfo 属性和方法提供了驱动器的信息
FileInfo 与DirectoryInfo读取属性
- 通过FileInfo和DirectoryInfo类来读取文件和文件夹属性
- 查看文件属性,创建文件,移动文件,重命名文件
- 我们可以通过剪切时命名来达到重命名的目的
FileInfo file = new FileInfo("Hello.txt");
// 一些常用属性
Console.WriteLine(file.Exists); //是否存在
Console.WriteLine(file.FullName); //文件全名
Console.WriteLine(file.Extension); //文件扩展名
Console.WriteLine(file.IsReadOnly); //是否只读
Console.WriteLine(file.Length); //文件的长度
Console.WriteLine(file.Name); //文件的名字
Console.WriteLine(file.DirectoryName); //文件夹名字
file.Delete(); //删除
file.CopyTo("doit.txt", true); /复制 是否覆写
file.MoveTo("cut.txt"); //剪切
- 【常用方法】判断文件是否存在,不存在则创建文件
//创建一个文件夹
DirectoryInfo dirinfo = new DirectoryInfo("seqing");
if (dirinfo.Exists == false)
{
dirinfo.Create();
}
//创建一个文本文件
FileInfo fileinfo = new FileInfo("good.txt");
if (fileinfo.Exists == false)
{
fileinfo.Create();
}
通过File读写文件
- File是一个静态类,无法构造对象,我们可以通过它来对文件进行各种操作
- 如果只对文件执行一个操作时,这些类很有效,省去了实例化的开销
- 它和FileInfo有相同的公共方法,公共属性和构造函数,但都不是静态的,需要把每个实例与特定的文件夹或文件关联
- 如果同一个对象需要执行多个操作,使用这些类比较合适
- 并且两者都可以协助开启一个流对象
string[] sm = File.ReadAllLines("Hello.txt");
foreach (var item in sm)
{
Console.WriteLine(item);
}
string con = File.ReadAllText("Hello.txt");
byte[] data = File.ReadAllBytes("Hello.txt");
//他会进行覆盖
File.WriteAllText("moon.txt", "我爱你");
File.WriteAllLines("EnglishWord.txt", new string[] { "good", "bad", "happy", "ward" });
byte[] datas = File.ReadAllBytes("le_petit_prince.jpg"); //写入字节数组
File.WriteAllBytes("copy.jpg", datas);
- 指定编码格式
File.ReadAllText(FilePath, Encoding);
File.ReadAllText("love.txt", Encoding.UTF8);
使用流来读写文件
-
在UdpClient和TCPclient与TCPServer中,我们通过网络流读取数据,操作相似
-
流是一个用于传输数据的对象,数据可以向两个方向传输:
如果数据从外部源传输到程序中,这就是读取流
如果数据从程序传输到外部源中,这就是写入流 -
外部源可能是
一个文件
网络上的数据
内存区域上
读写到命名管道上 -
读写内存使用System.IO.MemorySystem
-
处理网络数据使用System.Net.Sockets.NetworkStream
通过FileStream来读取数据
- 这个类读取和写入的是字节数据 适合用于图片类型
- 对于文本数据,用StreamWriter和StreamReader不用在意格式问题
- 创建读取文件的流对象
- 创建写入文件的流对象
- 创建一个容器字节数组
- 循环将读取文件的字节传输到写入文件中,直到读取到文件末尾
- 关闭输入流对象
- 关闭输出流对象
- 当我们使用完了一个流之后,一定要调用fs.Close();方法去关闭流,关闭流会释放与它相关联的资源,允许其他应用程序为同一个文件设置流。这个操作也会刷新缓冲区。
FileStream readStream = new FileStream("le_petit_prince.jpg", FileMode.Open);
FileStream writeStream = new FileStream("副本图片.jpg", FileMode.Create);
byte[] dataDock = new byte[1024];
while (true)
{
int lengths = readStream.Read(dataDock, 0, dataDock.Length);
if (lengths == 0)
{
break; //已经到达文件末尾
}
writeStream.Write(dataDock, 0, lengths); //将数据写入到新文件中
}
//关闭流
writeStream.Close();
readStream.Close();
通过StreamWriter StreamReader读取
- 我们对文本文件的读写一般使用StreamReader和StreamWriter,因为不同的文本有不同的编码格式,这个StreamReader会帮我们自动处理,所以我们不需要关心文本文件的编码是什么
- 两种方式
// 创建文本的读取流(会检查字节码标记确定编码格式)
StreamReader sr = new StreamReader(@"c:\xx\ReadMe.txt");
//指定编码格式
StreamReader str = new StreamReader(@"c:\xx\xx.txt",Encoding.UTF8);
(可取的编码格式 ASCII Unicode UTF7 UTF8 UTF32)
//通过File来创建一个流
FileInfo myFile = new FileInfo(@"c:\xx\xx.txt");
StreamReader sr = myFile.OpenText();
//通过文件流来创建一个文本读取流
FileStream fs = new FileStream("good.txt", FileMode.Create);
StreamReader reader = new StreamReader(fs);
- 循环从文本文档中接收数据
- 读取可以采用
- ReadLine() 读取一行 读到末尾返回null
- Read() 读取一个字符。返回该字符的ASII值,需要强制转换 读到末尾返回 -1
- ReadToEnd() 直接读取到末尾
StreamReader reader = new StreamReader("Hello.txt");
while (true)
{
string str1 = reader.ReadLine();//读取一行字符串
if (str1 == null)
{
break;
}
Console.WriteLine(str1);
}
string str = reader.ReadToEnd(); //读取文本中的所有字符
Console.Write(str);
while (true)
{
int res = reader.Read(); //读取一个字符
if (res == -1)
{
break;
}
else
{
Console.Write((char)res); //强制转换成一个字符
}
}
- 循环从控制台接收用户输入存取到文本文档中
StreamWriter writer = new StreamWriter("liubi.txt");
while (true)
{
string luas = Console.ReadLine();
if (luas == "q")
{
break;
}
writer.WriteLine(luas);
}
writer.Close(); //如果不关闭,则无法将数据写入到文本当中
Console.ReadKey();
Path类
- path类不能被实例化,它提供了静态方法来对路径进行操作
Console.WriteLine(Path.Combine(@"c:\my documents","Readme.txt"));
- 它会根据系统来决定两个路径之间的连接符
- AltDirectorySeparatorChar 提供分割目录的字符,在windows上使用 \ 在Unix上用 /
- DirectorySpeparatorChar 提供分割目录的字符,在windows上使用 / 在Unix上用 \
- PathSeparator 提供一种与平台无关的方式,来指定划分环境变量的路径字符串,默认为分号
- VolumeSepartorChar 提供一种与平台无关的方式,来指定容量分割符,默认为冒号