操作变量和常量时,数据都是存储在内存中的,程序运行结束后会被全被删除。想要长久地保存数据,可以选用文件或数据库来存储。
C#提供了DriveInfo、Directory、DirectoryInfo、File、FileInfo、Path等文件操作类,来实现在程序运行时对文件进行创建、读写、移动等操作。
密封类,用来查看计算机驱动器信息。主要包括查看磁盘的空间、磁盘的文件格式、磁盘的卷标等 。
Driveinfo driveInfo=new Driveinfo("C");
常用属性和方法:
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
DriveInfo driveInfo = new DriveInfo("D");
Console.WriteLine("驱动器的名称:" + driveInfo.Name);
Console.WriteLine("驱动器的根目录:" + driveInfo.RootDirectory);
Console.WriteLine("驱动器是否准备好:" + driveInfo.IsReady);
Console.WriteLine("磁盘上可用空闲量:" + driveInfo.AvailableFreeSpace);
Console.WriteLine("驱动器上的可用空闲空间总量:" + driveInfo.TotalFreeSpace);
Console.WriteLine("驱动器上存储空间总大小:" + driveInfo.TotalSize);
Console.WriteLine("文件系统格式名称:" + driveInfo.DriveFormat);
Console.WriteLine("驱动器类型:" + driveInfo.DriveType);
Console.WriteLine("驱动器的卷标:" + driveInfo.VolumeLabel);
Console.ReadLine();
}
}
}
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//获取计算机中所有驱动器名称和文件格式
DriveInfo[] drives = DriveInfo.GetDrives();
foreach (DriveInfo drive in drives)
{
if (drive.IsReady)
{
Console.WriteLine("驱动器名称:" + drive.Name);
Console.WriteLine("文件格式:" + drive.DriveFormat);
}
}
Console.ReadLine();
}
}
}
在 C# 中 Directory 类和 DirectoryInfo 类都是对文件夹进行操作的。
DirectoryInfo 类提供了一个构造方法,语法形式如下:
DirectoryInfo(string path)
在这里 path 参数用于指定文件的目录,即路径。
例如创建路径为 D 盘中的 test 文件夹的实例,代码如下。
DirectoryInfo directoryInfo = new DirectoryInfo("D:\\test");
需要注意的是路径中如果使用 \
,要使用转义字符来表示,即 \\
;或者在路径中将 \
字符换成 /
。
Directory 类是一个静态类,不能创建该类的实例,直接通过“类名 . 类成员”的形式调用其属性和方法。
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//使用 Directory 类在 D 盘上操作 code 文件夹,要求先判断是否存在该文件夹,如果存在则删除,否则创建该文件夹
if (Directory.Exists(@"D:\code"))
Directory.Delete(@"D:\code",true);
else
Directory.CreateDirectory(@"D:\code");
}
}
}
C#中 File 类和 FileInfo 类都是用来操作文件的,且作用相似,都能完成创建文件、更改文件名称、删除文件、移动文件等操作。
static void Main(string[] args)
{
//在 D 盘的 code 文件夹下创建名为 test1.txt 的文件,并获取该文件的相关属性,然后将其移动到D盘下的 code-1 文件夹中。
Directory.CreateDirectory(@"D:\code");
FileInfo fileInfo = new FileInfo(@"D:\code\test1.txt");
if (!fileInfo.Exists)
fileInfo.Create().Close();//创建文件。Close()关闭流并释放与之关联的所有资源
fileInfo.Attributes = FileAttributes.Normal;
Console.WriteLine("文件名:" + fileInfo.Name);
Console.WriteLine("文件父目录:" + fileInfo.Directory);
Console.WriteLine("文件的完整目录:" + fileInfo.FullName);
Console.WriteLine("目录的完整路径:" + fileInfo.DirectoryName);
Console.WriteLine("文件创建时间:" + fileInfo.CreationTime);
Console.WriteLine("文件扩展名:" + fileInfo.Extension);
Console.WriteLine("文件是否只读:" + fileInfo.IsReadOnly);
Console.WriteLine("上次访问文件时间:" + fileInfo.LastAccessTime);
Console.WriteLine("上次写入文件时间:" + fileInfo.LastWriteTime);
Console.WriteLine("文件大小:" + fileInfo.Length);
Console.ReadLine();
Directory.CreateDirectory(@"D:\code-1");//创建 code-1 文件夹
FileInfo newFileInfo = new FileInfo(@"D:\code-1\test1.txt");//判断 code-1文件夹下是否存在test1.txt
if (!newFileInfo.Exists)
fileInfo.MoveTo(@"D:\code-1\test1.txt");//不存在则移动文件
}
}
}
对包含文件或目录路径信息的System.String实例进行操作的静态类。
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//从控制台输入一个路径,输出该路径的不含扩展名的路径、扩展名、文件全名、文件路径、更改文件扩展名
Console.WriteLine("请输入一个路径:");
string path = Console.ReadLine();
Console.WriteLine("不含扩展名的路径:" + Path.GetFileNameWithoutExtension(path));
Console.WriteLine("扩展名:" + Path.GetExtension(path));
Console.WriteLine("文件全名:" + Path.GetFileName(path));
Console.WriteLine("文件绝对路径:" + Path.GetFullPath(path));
Console.WriteLine("文件路径:" + Path.GetDirectoryName(path));
Console.WriteLine("更改文件扩展名:" + Path.ChangeExtension(path, null));
Console.ReadLine();
}
}
}
计算机中的流实际上是一种信息的转换,它是一种有序流。相对于某一对象而言,通常我们把对象接收外界的信息输入称为输入流 (Input) ,从对象向外界输出的流称为输出流(Output)。合称为输入/输出流(I/O Streams)。
对象间进行信息或数据的交换时总是先将信息或数据转换成某种形式的流,通过流进行传输,到达目的对象后再将流转换为对象数据。
所以, 可以把流看作是一种数据的载体,用来实现数据的传输和交换。
流所在的命名空间也是System.IO,主要包括文本文件的读写、图像和声音文件的读写、二进制文件的读写等。
流是字节序列的抽象概念,例如文件、输入/输出设备、内部进程通信管道等。
流提供一种向后备存储器写入字节和从后备存储器读取字节的方式。
除了和磁盘文件直接相关的文件流以外,流还有多种类型。
例如数据流 (Stream) ,是对串行传输数据的一种抽象表示,是对输入/输出的一种抽象。
数据有来源和目的地,衔接两者的就是串流对象。
如果将数据从来源取出,可以试用输入 ( 读 ) 串流,把数据储存在内存缓冲区;如果将数据写入目的地,可以使用输出 ( 写 ) 串流,把内存缓冲区的数据写入目的地。
当希望通过网络传输数据,或者对文件数据进行操作时,首先需要将数据转化为数据流。
典型的数据流和某个外部数据源相关,数据源可以是文件、外部设备、内存、网络套接字等。
根据数据源的不同,.Net 提供了多个从 Stream 类派生的子类,每个类代表一种具体的数据流类型,比如磁盘文件直接相关的文件流类 FileStream,和套接字相关的网络流类 NetworkStream,和内存相关的内存流类 MemoryStream 等。
C# 中 StreamReader 类用于从流中读取字符串
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
Directory.CreateDirectory(@"D:\code");
File.Create(@"D:\code\test.txt").Close();
//读取 D 盘 code 文件夹下 test.txt 文件中的信息。
string path = @"D:\code\test.txt";
StreamReader reader = new StreamReader(path);
if (reader.Peek() != -1)//判断文件中是否有字符
{
string str = reader.ReadLine();
Console.WriteLine(str);
Console.ReadLine();
}
reader.Close();
}
}
}
在读取文件中的信息时,除了可以使用 ReadLine 方法以外,还可以使用Read、ReadToEnd方法
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
//向 D 盘 code 文件夹的 test.txt 文件中写入姓名和手机号码
string path = @"D:\code\test.txt";
using (StreamWriter writer = new StreamWriter(path))
{
writer.WriteLine("姓名");
writer.WriteLine("手机号码");
writer.Flush();//刷新缓存
}
}
}
}
主要用于文件的读写,不仅能读写普通的文本文件,还可以读取图像文件、声音文件等不同格式的文件。
在创建 FileStream 类的实例时还会涉及多个枚举类型的值, 包括 FileAccess、FileMode、FileShare、FileOptions 等。
FileAccess 枚举类型主要用于设置文件的访问方式:
FileMode 枚举类型主要用于设置文件打开或创建的方式:
FileShare 枚举类型主要用于设置多个对象同时访问同一个文件时的访问控制:
FileOptions 枚举类型用于设置文件的高级选项,包括文件是否加密、访问后是否删除等:
class Program
{
static void Main(string[] args)
{
//在 D 盘 code 文件夹的 student.txt 文件中写入学生的学号信息
File.Create(@"D:\code\student.txt").Close();
string path = @"D:\code\student.txt";
string mes = "学号:3188906224";
byte[] bytes = Encoding.UTF8.GetBytes(mes);//将数据从字符串类型转换成字节类型
using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Write))
{
fileStream.Write(bytes, 0, bytes.Length);
fileStream.Flush();
}
//从 D 盘的 code 文件夹中将 student.txt 文件中的学号读取出来,并显示到控制台上
if (File.Exists(path))
{
using (FileStream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
byte[] b = new byte[fileStream.Length];//定义存放文件信息的字节数组
fileStream.Read(b, 0, b.Length);//读取文件信息
char[] c = Encoding.UTF8.GetChars(b);//将读取的数据从字节类型转换成字符类型
Console.WriteLine(c);
}
}
else
Console.WriteLine("文件不存在");
Console.ReadLine();
}
}
}