C#文件操作——文件、数据流与注册表
所谓文件,就是在用户的计算机中,以实现某种功能或某个软件的部分功能为目的而定义的一个单位。而注册表是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。
1、文件系统
一个文件是一个存储在磁盘中带有指定名称和目录路径的数据集合。当打开文件进行读写时,它变成一个流。从根本上说,流是通过通信路径传递的字节序列。有两个主要的流:输入流和输入流。输入流用于从文件读取数据(读操作),输出流用于向文件写入数据(写操作)。
System.IO命名空间
System.IO命名空间有各种不同的类,用于执行各种文件操作,如创建和删除文件、读取或写入文件,关闭文件等。
I/O类 | 描述 |
BinaryReader | 从二进制流读取原始数据 |
BinaryWriter | 以二进制格式写入原始数据 |
BufferedStream | 字节流的临时存储 |
Directory | 有助于操作目录结构 |
DirectoryInfo | 用于对目录执行操作 |
DriveInfo | 提供驱动器的信息 |
File | 有助于处理文件 |
FileInfo | 用于对文件执行操作 |
FileStream | 用于文件中任何位置的读写 |
MemoryStream | 用于随机访问存储在内存中的数据流 |
Path | 对路径信息执行操作 |
StreamReader | 用于从字节流中读取字符 |
StreamWriter | 用于向一个流中写入字符 |
StringReader | 用于读取字符串缓冲区 |
StringWriter | 用于写入字符串缓冲区 |
File类与FileInfo类
File类和FileInfo类的作用是提供有关文件的各种基本操作,如用于创建、复制、删除、移动和打开文件等,还用于协助创建FileStream对象
1、File类
File类是一个静态类,主要提供一些静态方法,用于对文件的基本操作,包括创建、复制、移动、删除和打开一个文件。如果在判断文件是否存在或者对很多的文件进行操作时,建议使用File类,可以避免频繁创建和释放对象的系统开销。
方法 | 说明 |
Copy | 将现有文件复制到新文件 |
Create | 在指定路径中创建文件 |
Delete | 删除指定的文字,如果指定的文件不存在,则不引起异常 |
Exists | 确定指定的文件是否存在 |
Move | 将指定文件移到新位置,并提供指定新文件名的选项 |
Open | 打开指定路径上的FileStream |
GetCreationTime | 返回指定文件或目录的创建日期和时间 |
OpenRead | 打开现有文件进行读取 |
OpenText | 打开现有UTF-8编码文本文件以进行读取 |
OpenWrite | 打开现有文件进行写入 |
File类方法的参量很多时候都是路径Path。File的一些方法可以返回FileStream和StreamWriter的对象,可以与它们配套使用。
2、FileInfo类
FileInfo类的许多方法和File类中的方法类似,但是如果进行单一方法调用,则可以调用静态File类上的方法。由于.NET Framework不必实例化新对象,因此在这种情况下单一调用的速度要快一些;如果应用程序在文件上执行几种操作,则实例化FileInfo对象并使用其他方法会更好一些。因为这样会提高效率,而静态类必须 每次都寻找文件。
FileInfo类的对象表示磁盘或者网络位置上的文件,只要提供文件路径就可以创建。
FileInfo类也提供了与底层文件相关的属性,其中一些属性可以用来更新文件。该类的很多属性都继承于FileSystemInfo,所以可应用于FileInfo和DirectoryInfo类。
属性 | 说明 |
Exists | 确定文件是否存在,是只读抽象属性 |
Attributes | 获取或设置当前文件或目录的特性 |
Extension | 提取文件的扩展名,此属性只读 |
FullName | 检索文件的完整路径,只读属性 |
Name | 检索文件的完整路径,只读抽象属性 |
LastAccesstime LastAcdessTimeUtc |
获取或设置上次访问当前文件的日期和时间,可以使用UTC或非UTC版本 |
LastWriteTime LastWriteTimeUtc |
获取或设置上次访问当前文件的日期和时间,可以使用UTC或非UTC版本 |
CreationTime CreationTimeUtc |
获取当前文件的创建日期和时间,可以使用UTC或非UTC版本 |
属性 | 说明 |
Directory | 包含当前文件的目录,只读属性 |
DirectoryName | 返回文件目录的路径,只读属性 |
IsReadonly | 只读特性的快捷方式,也可以通过Attributes来访问这个属性 |
Length | 获取文件的大小(以字节为单位),返回long值,只读属性。 |
注意:
(1)File类与FileInfo类在使用时都需要引用System.IO命名空间。
(2)File类是静态方法,FileInfo类是动态方法,使用时必须通过new关键字来创建实例。
Directory类与DirectoryInfo类
DirectoryInfo类的使用方法和Directory类基本相同,但DirectoryInfo类能建立对象。在使用这两个类时都需要引用System.IO命名空间。如果执行单一调用,就使用Directory类;如果执行一系列调用,就使用实例化的DirectoryInfo的对象。
1、Directory类
Directory类提供了在目录和子目录中进行创建、移动和列举操作的静态方法。此外,用户还可以访问和操作各种各样的目录属性,例如,创建或最后一次修改时间以及Windows访问控制列表等。
方法 | 说明 |
CreateDirectory | 按指定路径创建所有文件夹和子文件夹 |
Delete | 删除指定文件夹 |
Exists | 检查指定路径的文件夹是否存在,如果存在则返回true |
GetCreationTime | 返回指定文件或文件夹的创建日期和时间 |
GetCurrentDirectory | 获取应用程序的当前工作文件夹 |
GetDirectories | 获取指定文件夹中子文件夹的名称 |
GetDirectoryRoot | 返回指定路径的卷信息、根信息或两者同时返回 |
GetFiles | 返回指定文件夹中子文件的名称 |
GetFileSystemEntries | 返回指定文件夹中所有文件和子文件的名称 |
GetLastAccessTime | 返回上次访问指定文件或文件夹的创建日期和时间 |
GetLastWriteTime | 返回上次写入指定文件或文件夹的创建日期和时间 |
GetLogicalDrives | 检索计算机中的所有驱动器,例如A:、C:等 |
GetParent | 获取指定路径的父文件夹,包括绝对路径和相对路径 |
Move | 将指定文件或文件夹及其内容移动到新位置 |
SetCreationTime | 设置指定文件或文件夹的创建日期和时间 |
SetCurrentDiretory | 将应用程序的当前工作文件夹设置为指定文件夹 |
SetLastAccessTime | 设置上次访问指定文件或文件夹的日期和时间 |
SetLastWriteTime | 设置上次写入指定文件夹的日期和时间 |
2、DirectoryInfo类
DirectoryInfo类是System.IO命名空间的一部分,它表示磁盘上的物理目录,用于创建、删除和移动目录。它提供了执行与目录和子目录相关的操作的方法。该类是一个密封的类,所以不能继承它。
属性 | 说明 |
Attributes | 用于获取或设置当前文件或目录的属性 |
CreationTime | 用于获取或设置当前文件或目录的创建时间 |
CreationTimeUtc | 用于在协调的世界时间(UTC)中获取或设置创建时间 |
Exists | 用于获取一个值,指示目录是否存在 |
Extension | 用于获取表示文件扩展部分的字符串 |
FullName | 用于获取目录的完整路径 |
LastAccessTime | 用于获取或设置上次访问当前文件或目录的时间 |
LastAccessTimeUtc | 用于在当前文件或目录被上次访问的协调世界时间(UTC)中获取或设置时间 |
LastWriteTime | 用于获取或设置当前文件或目录最后写入的时间 |
LastWriteTimeUtc | 最后一次写入当前文件或目录时,它用于在协调世界时(UTC)中获取或设置时间 |
Name | 用于获取此DirectoryInfo实例的名称 |
Parent | 用于获取指定子目录的父目录 |
Root | 用于获取目录的根部分 |
2、文件的基本操作
文件的操作有一套完整的流程。当用户操作一个文件时,首先需要判断该文件是否存在,如果不存在就对其进行创建,然后就可以进行复制、移动等操作,最后不需要该文件时可以进行删除操作。
判断文件是否存在
判断文件是否存在可以使用File类的Exists方法来实现,也可以使用FileInfo类的Exists属性来实现。
1、File类的Exists方法
File类Exists方法的语法格式如下:
public static bool Exists(string path)
该方法用于确定指定文件是否存在,其中,变量path表示要检查 的文件名称。
编写程序,判断 一个文件夹中是否存在FileText01.txt文件,并输出对应信息。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path=@"\FileText01.Txt";if(File.Exists(path)){Console.WriteLine("文件\"" + path + "\"存在");}else{Console.WriteLine("文件\"" + path + "\"不存在");}}}
}
运行结果如下:
在代码中,首先要指明文件的路径,所以,需要定义一个string类型的变量path,并将要判断的文件的路径赋值给该变量;接着通过if语句进行判断,由于File类是静态类,所以可以直接引用它的静态方法Exists。需要注意的是,由于文件中含有许多反斜杠,为避免反斜框带来的转义字符,所以必须 使用@字符 。
2、FileInfo类的Exists属性
FileInfo类的Exists属性是用于获取一个值,如果该值为true,则说明文件存在;若为false,则说明该文件不存在或者是该文件的目录。
其语法格式如下:
public override bool Exists{get;}
注意:在使用FileInfo类的Exists属性时,需要实例化对象。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"\FileText01.Txt";FileInfo fileinfo=new FileInfo(path);if(fileinfo.Exists){Console.WriteLine("文件\"" + path + "\"存在");}else{Console.WriteLine("文件\"" + path + "\"不存在");}Console.ReadLine();}}
}
运行结果如下:
创建文件
创建文件可以使用File类的Create方法,也可以使用FileInfo类的Create方法来实现。
1、File类的Create方法
File的Create方法有4种重载方法,但是一般使用如下 的重载方法:
public static FileStream Create(string path)
其中,path是一个路径名,表示 文件的完整路径,该方法的返回值 是一个FileStream实例。
注意:需要使用FileStream类的Close方法将所创建的文件关闭。由于File.Create方法默认向所有用户授予对新文件的完全读/写访问权限,所以文件是用读和写访问权限打开的,必须关闭后才能由其他应用程序打开。
编写程序,在一个文件夹中创建一个文件FileText.txt。
完整代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"c:\FileText\";//路径加上文件夹FileStream newText = File.Create(path + "FileText.txt");newText.Close();Console.WriteLine("文件创建成功");Console.ReadLine();}}
}
运行结果:
如文件夹不存在,则运行失败。
在代码中,首选定义一个string类型的变量path,用于存放文件的路径;然后使用File类的静态方法Create创建一个文件,并将该文件赋给FileStream类的对象newText;最后通过newText引用Close方法,关闭文件。
2、FileInfo类的Create方法
该方法的语法格式如下:
public FileStream Create()
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){//指定文件位置string path = @"c:\FileText\FileText.txt";//创建文件信息实例FileInfo file = new FileInfo(path);//创建一个空文件file.Create();Console.WriteLine(" 成功创建文件");Console.ReadLine();}}
}
运行结果:
未经处理的异常:
复制或移动文件
1、文件的复制
复制文件可以用File类的Copy方法以及FileInfo类的CopyTo方法来实现
(1)用File类的Copy方法来复制文件。
该方法有两个重载方式:
public static void Copy(string sourceFileName, string destFileName)
public static void Copy(string sourceFileName, string destFileName, bool overwrite)
对Copy方法参数的说明如下:
sourceFileName:表示要复制的文件。
destFileName:表示目标文件的名称,不能是目录,如果是第一种重载,则目标文件参数不能是现有文件。
overwrite:表示是否可以改写目标文件。
编写程序,将C盘根目录下的FileText.txt文本文件复制到“C:\FileText\”目录中。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){//首先声明两个路径//源文件string pathSource = @"C:\FileText.txt";//目标文件string pathDestination = @"C:\FileText\FileTextCopy.txt";if(File.Exists(pathSource)){if(!File.Exists(pathDestination)){File.Copy(pathSource, pathDestination,false);Console.WriteLine("文件复制成功");}else{Console.WriteLine("是否进行覆盖操作:\n1.覆盖文件\t2.取消复制\n请输入选项:");string mystr=Console.ReadLine();if(mystr=="1"){File.Copy(pathSource, pathDestination, true);Console.WriteLine("已覆盖同名文件");}if(mystr=="2"){Console.WriteLine("用户已取消复制");}}}else{Console.WriteLine("文件不存在,请重新选择!");}Console.ReadLine();}}
}
运行结果后的文件夹不存在:
创建新的文件夹,重新运行:
重新运行:
重新运行:
(2)用FileInfo类的CopyTo方法来复制文件。
CopyTo方法也有两种重载方式:
public FileInfo CopyTo(string destFileName)
//将现有文件复制到新文件,不允许覆盖现有文件
public FileInfo CopyTo(string destFileName, bool overwrite)
//将现有文件复制到新文件,允许覆盖现有文件
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){FileInfo fileinfo = new FileInfo(@"C:\FileText.txt");fileinfo.CopyTo(@"C:\FileText\FileTextCopy1.txt", true);Console.ReadLine();}}
}
运行成功了。
2、文件的移动
移动文件用File类的More方法和FileInfo类的MoveTo方法来实现。
(1)用File类的Move方法来移动文件。
语法格式如下:
public static void Move(string sourceFileName, string destFileName)
其中,参数sourceFileName表示要移动的文件名称,参数destFileName表示文件的新路径。
编写程序,将C盘根目录下的FileText.txt文本文件移动到“C:\FileText\”目录中。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string pathSource = @"C:\FileText.txt";string pathDestination = @"C:\FileText\FileText.txt";if(File.Exists(pathSource)){if(!File.Exists(pathDestination)){File.Move(pathSource, pathDestination);Console.WriteLine("文件移动成功,被移至\"" + pathDestination + "\"");}}else{Console.WriteLine("移动的文件不存在!");}Console.ReadLine();}}
}
运行结果:
(2)用FileInfo类的MoveTo方法来移动文件。
语法格式如下:
public void MoveTo(string destFileName)
该方法用于将指定文件移到新位置,并提供指定新文件名的项。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){FileInfo fileinfo = new FileInfo(@"C:\FileText.txt");fileinfo.MoveTo(@"C:\FileText\FileText.txt");}}
}
删除文件
删除文件可通过File类的Delete方法或者使用FileInfo类的Delete方法来实现。
1、File类的Delete方法
语法格式如下:
public static void Delete(string path)
输入文件名称,就可以删除对应文件。
编写程序,删除“C:\”目录下的FileText.txt文件。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"C:\FileText.txt";Console.WriteLine("请输入你要删除的文件,回车键确认:");string inputstr=Console.ReadLine();//用户输入的文件名称不具有指定路径的功能,所有需要将其连接起来string pathTemp = path + inputstr;if(File.Exists(pathTemp)){File.Delete(pathTemp);Console.WriteLine("文件" + pathTemp + "删除成功");}else{Console.WriteLine("文件" + pathTemp + "不存在");}}}
}
运行结果如下:
2、FileInfo类的Delete方法
语法格式如下:
public void Delete(string path)
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){FileInfo fileinfo=new FileInfo(@"C:\FileText.txt");fileinfo.Delete();}}
}
获取文件的基本信息
获取文件的基本信息可通过System.IO命名空间下的FileInfo类来实现。这里需要注意,由于FileInfo类是一个非静态的类,所以在使用时需要对其进行实例化。
编写程序,获取 “C:\”目录下的FileText.txt文件的基本信息。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"C:\FileText.txt";//实例化FileInfo类FileInfo fileInfo=new FileInfo(path);if (fileInfo.Exists){Console.WriteLine("文件的属性:");Console.WriteLine(fileInfo.Attributes.ToString());Console.WriteLine("文件的扩展名:");Console.WriteLine(fileInfo.Extension.ToString());Console.WriteLine("全路径:");Console.WriteLine(fileInfo.FullName.ToString());Console.WriteLine("要查看的名称:");Console.WriteLine(fileInfo.Name.ToString());Console.WriteLine("文件的创建时间:");Console.WriteLine(fileInfo.CreationTime.ToString());Console.WriteLine("文件上次访问时间:");Console.WriteLine(fileInfo.LastAccessTime.ToString());Console.WriteLine("文件上次的修改时间:");Console.WriteLine(fileInfo.LastWriteTime.ToString());Console.WriteLine("文件所在的文件夹:");Console.WriteLine(fileInfo.Directory.ToString());Console.WriteLine(fileInfo.DirectoryName.ToString());Console.WriteLine("文件是否可读:");Console.WriteLine(fileInfo.IsReadOnly);Console.WriteLine("文件的大小:");Console.WriteLine(fileInfo.Length.ToString()+"字节");}else { Console.WriteLine("文件" + path + "不存在"); }Console.ReadLine();}}
}
运行结果如下:
3、文件夹的基本操作
Directory类用于操作文件夹,带有创建、移动和枚举目录和子目录的静态方法,DirectoryInfo类用于典型操作,如复制、移动、重命名、创建和删除目录。它们都可用于获取和设置相关属性或有关创建、访问及定稿操作的DateTime信息。
Directory类和DirectoryInfo类同File类和FileInfo类类似,Directory类是静态方法,DirectoryInfo类是动态方法,使用时必须通过new关键字来创建实例。
判断文件夹是否存在
判断文件夹是否存在可通过Directory类的Exists方法或者DirectoryInfo类的Exists属性来实现。
1、Directory类的Exists方法
Exists方法的语法格式如下:
public static bool Exists(string path)
该方法用来检查指定路径的文件夹是否存在,其中,path表示要测试的路径。
编写程序,判断 文件夹FileText是否存在于目录“C:\”中。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"C:\FileText";if (Directory.Exists(path)){Console.WriteLine("文件夹" + path + "存在");}else{Console.WriteLine("文件夹" + path + "不存在");}Console.ReadLine();}}
}
运行结果:
2、Directory类的Exists属性
该属性用于判断指定的文件夹是否存在。语法格式如下:
public override bool Exists { get;}
如果属性值为true时则表示目录存在,为false时表示目录不存在。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"C:\FileText";DirectoryInfo di=new DirectoryInfo(path);if (di.Exists){Console.WriteLine("文件夹" + path + "存在");}else{Console.WriteLine("文件夹" + path + "不存在");}Console.ReadLine();}}
}
运行结果如下:
创建文件夹
创建文件夹可以通过Directory类的CreateDirectory方法和DirectoryInfo类的Create方法类实现。
1、Directory类的CreateDirectory方法
该方法的语法格式如下:
public static DirectoryInfo CreateDirectory(string path);
该方法用于在指定路径中创建所有目录和子目录,除非它们已经存在。path表示要创建的目录。
编写程序 ,在文件夹中创建文件夹。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"C:\FileText";if(Directory.Exists(path)){Console.WriteLine("文件夹存在,无须创建");}else {Directory.CreateDirectory(path);}Console.ReadLine();}}
}
运行结果如下:
2、Directory类的Create方法
该方法有以下两种重载格式:
public void Create()
public void Create(DirectorySecurity directorySecurity)
其中,参数directorySecurity主要用于参数控制。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){DirectoryInfo dif = new DirectoryInfo(@"C:\FileText1");dif.Create();}}
}
移动文件夹
移动文件夹主要通过Directory类的Move方法和DirectoryInfo类的MoveTo方法来实现。
1、Directory类的Move方法
语法格式如下:
public static void Move(string sourceDirName, string destDirName)
该方法用于将文件或目录及其内容移到新位置,参数sourceDirName表示要移动的文件或目录的路径;参数destDirName表示指向sourceDirName的新位置的路径。
注意:通过移动文件夹,不仅可以改变文件夹的目录,还可以实现对文件夹的重命名。
编写程序,将目录“C:\FileText”中的Movetext文件夹移动到“C:\FileText1”中,并重命名为Newtext。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string sourceDirName = @"C:\FileText\Movetext";string destDirName = @"C:\FileText1\Newtext";//判断路径是否存在if(Directory.Exists(sourceDirName)){Directory.Move(sourceDirName, destDirName);Console.WriteLine("文件夹" + sourceDirName + "移动成功");}else{Console.WriteLine("源文件不存在,无法移动");}Console.ReadLine();}}
}
运行结果如下:
2、DirectoryInfo类的MoveTo方法
该方法的语法格式如下:
public void MoveTo(string destDirName)
该方法用于将DirectoryInfo实例及其内容移动到新路径。参数destDirName表示要将此目录移动到的目标位置的名称和路径。目标不能是另一个具有相同名称的磁盘卷或目录。它可以是用户要将此目录作为子目录添加到某个现有目录。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string sourceDirName = @"C:\FileText1\Newtext";string destDirName = @"C:\FileText\Newtext1";DirectoryInfo di=new DirectoryInfo(sourceDirName);di.MoveTo(destDirName);}}
}
文件夹的删除
文件的删除可以通过Directory类的Delete方法和DirectoryInfo类的Delete方法来实现。
1、Directory类的Delete方法
该方法有两种重载形式:
public static void Delete(string path)
public static void Delete(string path,bool recursive)
该方法用于从指定路径删除空目录。其中,参数path表示要移除的空目录/目录名称;参数recursive表示若要移除path中的目录、子目录以及文件,则参数值为true。
编写程序,使用Directory类的Delete方法删除文件夹。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"C:\FileText\Newtext1";if(Directory.Exists(path)){Console.WriteLine("该文件存在,请选择删除方式:\n1.仅当空文件夹时删除;\n2.删除整个目录");Console.WriteLine("输入选项数字,按确认删除!");string mystr=Console.ReadLine();if(mystr=="1"){//第一个参数是给定删除路径//第二个参数如果false则表示仅当空文件删除Directory.Delete(path, false);Console.WriteLine("当前文件夹为空文件夹,已删除");}else if(mystr=="2"){//第二个参数如果为true则表示删除目录Directory.Delete(path, true);Console.WriteLine("当文件夹含有子文件或子文件夹,已删除");}else {Console.WriteLine("未正确输入选项");}}else{Console.WriteLine("文件夹" + path + "不存在,无须删除");}Console.ReadLine();}}
}
运行结果如下:
2、DirectoryInfo类的Delete方法
该方法也有两个重载形式:
public override void Delete()
public void Delete(bool recursive)
该方法用于删除DirectoryInfo的实例,指定是否删除子目录和文件。参数recursive表示如果要删除此目录,则为true;否则为false。
代码搞不清楚
获取文件夹的基本信息
要想获取当前文件夹下的所有文件,可通过Directory类的GetFile方法和GetDirectories方法来实现。
1、GetFiles方法
语法格式如下:
public static string[] GetFiles (string path)
该方法返回一个包含指定目录中的文件的完整名称(包含路径)的数组,如果未找到任何文件,则为空数组。其中,参数path表示要搜索的目录的相对或绝对路径,此字符串不区分大小写。
2、GetDirectories方法
语法格式如下:
public static string[] GetDirectories (string path)
该方法返回指定路径中子目录的完整名称(包含路径)的数组;如果未找到任何目录,则为空数组。其中,参数path表示要搜索的目录的相对或绝对路径,此字符串不区分大小写。
编写程序,获取指定目录下的文件及文件夹。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"C:\FileText";//定义字符串数组,用于接收文件或文件夹if(Directory.Exists(path)){string[] Files=Directory.GetFiles(path);//获取当前目录的子目录string[] Folders=Directory.GetDirectories(path);Console.WriteLine("指定目录下的内容:");foreach(string str in Folders){Console.WriteLine(str);}foreach(string str in Files){Console.WriteLine(str);}}else{Console.WriteLine("指定的目录不存在");}Console.ReadLine();}}
}
运行结果如下:
4、数据流
System.IO下的Stream类是所有数据流的基类,当用户对数据进行逐字节操作时,首先需要将数据转换为数据流。C#中有许多类型的流,但在处理文件输入/输出 (I/O)时,最主要的类型为FileStream类,它提供了读取和写入的方式,还有StreamReader类、StreamWriter类、BinaryWriter类和BinaryReader类,在处理文件I/O时也经常被使用到。
流操作类介绍
通俗地讲,流是一个用于传输数据的对象,数据的传输一般有以下两种方法:
(1)数据从外部源传输到程序中,这种流称为读取流。
(2)数据从程序中传输到外部源,这种流称为写入流。
流一般具有以下几个基本操作。
(1)读(Read)操作:读出流对象中的数据,并把它存放到另外一个数据结构中。
(2)写(Write)操作:从另一种数据结构中读取数据并存放到流对象中。
(3)搜索(Seek)操作:从流中的当前位置开始搜索定位到指定的位。
文件流类
文件流(FileStream)类,是用来实现对文件的读取和写入。FileStream是操作字节的字节数组,当提供向文件读取和写入字节的方法时,常用StreamReader类或StreamWriter类来完成,它们是操作字符的。
FileStream类的构造有多种形式,最简单的一种如下所示:
FileStream(string path, FileMode mode, FileAccess access)
其中,参数path表示将要操作的文件路径;而参数mode和access都是一个枚举值。FileMode类的枚举有几种成员,用于规定如何打开或创建文件,这些成员可以联合使用。
枚举值 | 说明 |
Append | 打开现有文件并定位至文件结尾,或创建新文件 |
Create | 创建新文件,如存在,它将被改写 |
CreateNew | 创建新文件,如存在,将引发异常 |
Open | 打开现有文件 |
OpenOrCreat | 如文件存在,打开;如不存在,创建新文件 |
Truncate | 打开现有文件,文件一旦被打开,将被截断为0字节大小 |
FileStream枚举有三个枚举值:只读模式(Read),读/写模式(ReadWrite),只写模式(Write)。该枚举的作用是基于用户的权限级别改变用户对文件的访问权限。
注意:在不使用FileAccess枚举参数的版本中,默认值使用的是ReadWrite模式。
FileStream类有三个重要方法,分别为Seek方法、Read方法和Write方法。其中,Seek方法用于直接在文件中查找具体位置;Read方法是从数据流中读取字节块并将该数据写入给定的缓冲区中;Write方法主要是向文件中写入数据,其使用方法和Read一致。
文本文件的写入与读取
FileStream类的对象只能以字节形式读取/写入数据,这就使操作变得非常困难,一般有了FileStream对象,都会借用StreamWriter对象或StreamReader对象的方法来处理文件。
1、StreamWriter类
StreamWriter类允许直接将字符和字符串写入文件,一般不针对二进制数据。
创建StreamWriter类的对象有以下两种方式。
(1)先创建FileStream对象,然后再创建StreamWriter对象。
FileStream fs=new File Stream(string path, FileMode mode);
StreamWriter sw=new StreamWriter(fs);
(2)直接从文件中创建StreamWriter对象。
StreamWriter sw=new Stream Writer(string path, bool append);
其中,参数path表示文件所处的路径;参数append是一个bool值,当该值为false时,表示创建一个新文件或将现有文件打开;该值为true时,表示打开文件,保留原来的数据,但是如果找不到文件,则创建一个新文件。
方法 | 说明 |
Close | 关闭当前StreamWriter对象和基础流 |
Dispose | 释放使用的所有资源 |
Flush | 清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流 |
Write | 写入流 |
WriteLine | 写入指定的某些数据,后跟行结束符 |
属性 | 说明 |
Encoding | 获取将输出写入到其中的Encoding |
FormatProvide | 获取控制格式设置对象 |
NewLine | 获取或设置当前TextWriter使用的行结束符字符串 |
StreamWriter默认使用UTF8Encoding编码,如若使用其他编码,就需要构造UTF8Encoding的这个实例使得Encoding.GetPreamble方法返回以UTF-8格式编写的Unicode字节。
编写程序,往文件“"C:\FileText\FileText.txt"”中写入字符串“一寸光阴一寸金”。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"C:\FileText\FileText.txt";FileStream fs = new FileStream(path, FileMode.OpenOrCreate);StreamWriter sw = new StreamWriter(fs);string mystr = "一寸光阴一寸金";sw.WriteLine(mystr);sw.Close();Console.WriteLine("写入完成");Console.ReadLine();}}
}
2、StreamReader类
StreamReader类用于从文件中读取数据。该类是一个通用类,可用于任何流,构造方法和StreamWriter类格式是一样的。
创建StreamWriter类的对象有以下两种方式。
(1)先创建FileStream类再创建StreamReader类。
FileStream fs=new File Stream(string path, FileMode mode);
StreamReader sr=new Stream Reader(fs);
(2)直接创建StreamReader类。
StreamReader类以一种特定的编码输入字符,而Stream类用于字节的输入和输出。使用StreamReader类可读取标准文本文件的各行信息。StreamReader的默认编码为UTF-8,UTF-8可以正确处理Unicode字符并在操作系统的本地化版本上提供一致的结果。
方法 | 说明 |
Close | 关闭当前StreamReader对象和基础流。 |
Dispose | 释放使用的所有资源。 |
Peek | 返回下一个可用的字符。 |
Read | 读取输入流中的下一个字符或下组字符。 |
ReadLine | 从数据流中读取一行数据,并作为字符串返回。 |
编写程序,读取文本文件“"C:\FileText\FileText.txt"”中的内容。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){string path = @"C:\FileText\FileText.txt";FileStream fs = new FileStream(path, FileMode.OpenOrCreate);StreamReader sw = new StreamReader(fs);string mystr = sw.ReadLine();Console.WriteLine(mystr);Console.WriteLine("读取完成");Console.ReadLine();}}
}
二进制文件的定稿与读取
BinaryReader和BinaryWriter类用于读取和写入二进制文件。
1、BinaryWriter类
BinaryWriter类用于将二进制数据写入流。通过将FileStream对象传递给其构造函数来创建BinaryWriter对象。
方法 | 说明 |
Close | 关闭当前的BinaryWriter和基础流。 |
Seek | 设置当前流中的位置。 |
Writer | 将值写入当前流。 |
2、BinaryReader类
BinaryReader类用于从文件读取二进制数据。通过将FileStream对象传递给其构造函数来创建BinaryReader对象。
方法 | 说明 |
Close | 关闭当前阅读器及基础流。 |
PeekChar | 返回下一个可用的字符,并且不提升字节或字符的位置。 |
Read | 从基础流中读取字节,并将流的当前位置前移 |
ReadBoolean | 从当前流中读取Boolean值,并使该流的当前位置提升1个字节。 |
ReadByte | 从当前流中读取下一个字节,并使流的当前位置提升1个字节。 |
ReadBytes | 从当前流中读取指定的字节数以写入字节数组中,并将当前位置前移相应的字节数。 |
ReadChar | 从当前流中读取下一个字符,并根据所使用的Encoding和从流中读取的特定字符,提升流的当前位置。 |
ReadChars | 从当前流中读取指定的字符数,并以字符数组的形式返回数据,然后根据所使用的Encoding和从流中读取的特定字符,将当前位置前移。 |
ReadInt32 | 从当前流中读取4字节有符号整数,并使流的当前位置提升4个字节。 |
ReadString | 从当前流中读取读取一个字符串。字符串有长度前缀,一次7位地被编码为整数。 |
编写程序,以二进制的形式对文件进行读写。
代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.Threading;namespace ConsoleApp1
{internal class Program{static void Main(string[] args){Console.WriteLine("二进制文字的写入");Console.WriteLine("请输入文件名:");string path = Console.ReadLine();FileStream fs = new FileStream(path, FileMode.OpenOrCreate);BinaryWriter bw = new BinaryWriter(fs);int a = 40;double b = 6.28;bool c = true;string d = "Hello World";bw.Write(a);bw.Write(b);bw.Write(c);bw.Write(d);Console.WriteLine("成功写入");bw.Close();fs.Close();Console.WriteLine("二进制文件的读取");BinaryReader br = new BinaryReader(new FileStream(path,FileMode.Open));a=br.ReadInt32();Console.WriteLine("int型数据:\t{0}", a);b = br.ReadDouble();Console.WriteLine("double型数据:\t{0}", b);c= br.ReadBoolean();Console.WriteLine("bool型数据:\t{0}", c);d = br.ReadString();Console.WriteLine("String型数据:\t{0}", d);br.Close();Console.ReadLine();}}
}
5、注册表基础
注册表(Registry,繁体中文版Windows操作系统称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。
Windows注册表
1、注册表存放的位置
在C盘中,打开Windows文件,找到regidit.exe文件,双击后就会弹出“注册表编辑器”对话框。
2、怎样快速运行注册表
按住Windows+R组合键,会弹出“运行”对话框,并在文本框中输入regedit,就会弹出“注册表编辑器”窗口。
注册表的基本结构
不论是什么操作系统 ,其注册表的结构大体上是基本相同的,都是一种层叠式结构 的复杂数据库存,由根键、子键、分支、值项和默认值几部分组成。
1、HKEY_CLASSES_ROOT根键
HKEY_CLASSES_ROOT根键中记录的是Windows操作系统中所有数据文件的信息内容,主要记录了不同文件的文件名后缀和与之对应的应用程序。当
HKEY_CLASSES_ROOT根键是由多个子键组成的,可分为两种:一种是已经注册的各类文件的扩展名,另一种是各种文件类型的有关信息。
2、HKEY_CURRENT_USER根键
HKEY_CURRENT_USER根键中保存了当前登录用户的配置信息,包括环境变量、个人程序、桌面设置等。它与HKEY_USERS\.Default分支中所保存的信息是一样的。任何对HKEY_CURRENT_USER根键中的信息的修改都会导致对HKEY_USERS\.Default中子键信息的修改。
3、KEY_LOCAL_MACHINE根键
KEY_LOCAL_MACHINE根键中存放的是用来控制系统和软件的设置。由于这些设置是针对那些使用Windows系统的用户而设置的,是一个公共配置信息,所以它与具体用户没有多大关系。
4、HKEY_USERS根键
HKEY_USERS根键中保存的是计算机的所有用户使用的配置数据,这些数据只有在用户登录在系统上时方能访问。这些信息告诉系统当前用户使用的图标、激活的程序组、“开始”菜单的内容以及颜色、字体等。
5、HKEY_CURRENT_CONFIG根键
如果用户在Windows中设置了两套或者两套以上的硬件配置文件(Hardware Configuration File),则在系统启动时将会让用户选择使用哪套配置文件。而HKEY_CURRENT_CONFIG根键中存放的正是当前配置文件的信息。
实现访问注册表的两大类
要想通过C#语言访问注册表,可通过Registry类和RegistryKey类两个类来实现。这两个类都是密封类,不允许被继承,它们都位于Microsoft.win32命名空间。
1、Registry类
Registry类只能对注册表进行单一的访问,执行简单的操作。它还提供了表示 Windows注册表中的根项的RegistryKey对象,以及访问项/值对的static方法。Registry类提供了7个属性。
属性 | 说明 |
CurrentUser | 包含有关当前用户首选项的信息。对应于HKEY_CURRENT_USER根键 |
LocalMachine | 包含本地计算机的配置数据。对应于KEY_LOCAL_MACHINE根键 |
ClassesRoot | 定义文档的类型(或类)以及与那些类型关联的属性。对应于HKEY_CLASSES_ROOT根键 |
Users | 包含有关默认用户配置的信息。对应于HKEY_CURRENT_USER根键 |
PerformanceData | 包含软件组件的性能信息。对应于HKEY_PERFORMANCE_DATA根键 |
CurrentConfig | 包含有关非用户特定的硬件的配置信息。对应于HKEY_CURRENT_CONFIG根键 |
DynData | 包含动态注册表数据。对应于HKEY_DYN_DATA根键 |
2、RegistryKey类
RegistryKey类表示Windows注册表中的顶级节点。此类是注册表封闭。它提供了对注册表操作的方法:查看子键、创建新键、读取匮乏修改键中的值等。
方法 | 说明 |
Close | 关闭该项,如果其内容已修改,则将其刷新到磁盘 |
CreateSubKey | 创建一个新的子项,或打开一个现有子项 |
DeleteSubKey | 删除指定的子项,字符串subkey不区分大小写 |
DeleteSubKeyTree | 递归删除子项和任何子级子项。字符串subkey不区分大小写 |
DeleteValue | 从此项中删除指定值 |
GetValue | 检索与指定的名称关联的值 |
GetSubKeyNames | 检索包含所有子键名称的字符串数组 |
GetValueKind | 检查与指定名称关联的注册表数据类型 |
GetValueNames | 检索包含与此项关联的所有名称的字符串数值 |
OpenSubKey | 检索指定的子项 |
SetValue | 设置注册表项中的名称/值对的值 |
属性 | 说明 |
Name | 检索项的名称 |
SubKeyCount | 检索当前项的子项数目 |
ValueCount | 检索项中的值的计数 |
6、注册表的操作基础
作为编程开发人员,有必要了解注册表并学会操作注册表。
读取注册表信息
要读取注册表中的信息,用户可以借用RegistryKey类的四个方法,分别为OpenSubKey、GetSubKeyName、GetValueNames和GetValue。
1、OpenSubKey
该方法用于检索指定的子键,并指定是否将写访问权限应用于该键。其语法格式如下:
public RegistryKey OpenSubKey(string name, bool writable)
参数说明:
name:表示要打开的子键的名称或路径。
writable:表示是否应用于读写操作。如果需要键的写操作,则设置为true。
2、GetSubKeyNames方法
该方法用于检索根键下面所有子键的名称,它的返回值是字符串的数组。其语法格式如下:
public string[] GetSubKeyNames()
编写程序,创建一个窗体应用,用于读取注册表子键的信息。
添加RichTextBox和Button控件
代码如下:
using Microsoft.Win32;
using System;
using System.Windows.Forms;namespace WindowsFormsApp2
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){RegistryKey hklm=Registry.LocalMachine;RegistryKey software = hklm.OpenSubKey(@"SOFTWARE");richTextBox1.Clear();foreach(string str in software.GetSubKeyNames()){richTextBox1.Text += str + "\n";}hklm.Close();software.Close();}}
}
运行结果如下:
3、GetValueNames方法
该方法用于检索与此键关联的所有值名称的字符串数组 。其语法格式如下:
public string[] GetValueName ()
4、GetValue方法
该方法用于检索与指定名称关联的值。如果注册表中不存在名称/值对,则返回null。其语法格式如下:
public object GetValue (string name)
参数name表示要检索的值的名称。此字符串不区分大小写。
编写程序,创建一个窗口应用,读取子键中值的信息。
添加listbox和button控件
代码如下:
using Microsoft.Win32;
using System;
using System.Windows.Forms;namespace WindowsFormsApp2
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){listBox1.Items.Clear();RegistryKey hklm=Registry.LocalMachine;RegistryKey sys = hklm.OpenSubKey(@"SOFTWARE");foreach(String str in sys.GetSubKeyNames()){listBox1.Items.Add("子键名:" + str);RegistryKey sikey = sys.OpenSubKey(str);foreach(string sValName in sikey.GetValueNames()){listBox1.Items.Add(sValName + sikey.GetValue(sValName));}}if(listBox1.Items.Count == 0){MessageBox.Show("未找到相关数据");}else{MessageBox.Show("读取完成");}}}
}
运行结果如下:
新增注册表信息
C#创建修改注册表信息需要调用以下两个方法。
1、CreateSubKey方法
该方法用于创建一个新子键或打开一个现有子键以进行写访问。其语法格式如下:
public RegistryKey CreateSubKey (string subkey)
参数subkey表示要创建或打开的子项的名称或路径。此字符串不区分大小写。
2、SetValue方法
该方法用于设置指定的名称/值对。其语法格式如下:
public void SetValue (string name, object value)
参数name表示要存储的值的名称,而参数value表示要存储的数据。
编写程序,通过窗体应用,实现新增注册表信息。
删除注册表信息
C#中实现删除注册信息可以通过调用DeleteSubKey、DeleteSubKeyTree、DeleteValue方法来实现。
1、DeleteSubKey方法
该方法用于删除指定的子键,它有两种重载方式:
//删除指定子键,如果子键下有目录则会引发异常
public void DeleteSubKey(string subkey)
//删除指定的子键,并指定在找不到该子键时是否引发异常
public void DeleteSubKey(string subkey, bool throwOnMissingSubKey)
参数说明
subkey:表示要删除的子键的名称。此字符串不区分大小写。
throwOnMissingSubKey:指定在找不到指定子键的情况下是否引发异常。如果该参数为true,并且指定的子键不存在,则引发异常。如果该参数为false,并且指定的子键不存在,则不执行任何操作。
2、DeleteSubKeyTree方法
该方法能够删除子键下的目录,语法格式如下:
public void DeleteSubKeyTree (string subkey)
subkey表示 要删除的子键。此字符串不区分大小写。17
3、DeleteValue方法
该方法用于删除指定的键值,语法格式如下:
public void DeleteValue (string name)
参数name表示要删除的值的名称。
编写程序,通过窗体应用,删除指定的子键。18
C#文件操作——文件、数据流与注册表相关推荐
- 注册表中shell文件不见了_win7系统注册表中的shell文件不小心被删除的解决方法...
我们在操作电脑的时候,win7系统注册表中的shell文件不小心被删除的问题对于我们来说其实是比较少见的,一般情况下的正常使用都不会遇到win7系统注册表中的shell文件不小心被删除的状况.但在wi ...
- java在regedit找不到_Windows找不到文件regedit打不开注册表怎么解决
Windows找不到文件regedit打不开注册表怎么解决很多小伙伴都还不知道,下面IEfans小编为大家整理了解决regedit打不开注册表方法说明,一起来看看吧! 方法/步骤分享: 1.电脑桌面, ...
- java流与文件——操作文件
[0]README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件--操作文件 的相关知识: 0.2) for source code, please vi ...
- Linux——权限|shell运行原理——外壳程序|Linux权限的概念|对人操作|角色和文件操作|文件类型访问权限|修改权限ugo+-|8进制|修改权限|更改文件的拥有
目录 shell运行原理--外壳程序 Linux权限的概念 对人操作 角色和文件操作 文件类型
- JSP中的文件操作:数据流、File类、文件浏览、目录操作、上传下载
文件可以永久地存储信息,从本质上讲文件就是存放在盘上的一系列数据的集合.应用程序如果想长期保存数据,就必须将数据存储到文件中,这就涉及到文件的操作.而在编写网站应用程序的过程中,有许多地方要对文件 ...
- 32位应用程序操作64位Windows注册表的方法
64位的Windows操作系统中能够运行32位的应用程序,主要是由于Windows中提供了WOW64子系统. 1.WOW64子系统 WOW64 (Windows-on-Windows 64-bit)是 ...
- 【Delphi入门】文件系统(文件分类 文件文本变量 文件操作 文件流操作)
文件分类 文本文件(TextFile) & 二进制文件(Flie) 二进制形式存放数据占有存储空间较少,但不直观:文本文件与之相反 文件是由相同类型的数据元素组成的序列.在DELPHI中对文件 ...
- VC 文件操作(文件查找,打开/保存,读/写,复制/删除/重命名)
右击项目->属性->字符集:使用多字节字符集. 这样可以使用char到CString的转化. char sRead[20] = ""; CString strtest ...
- 【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )
文章目录 一.导入第三方库头文件 二.头文件说明 1.兼容 C++ 语言 2.头文件导入限制 3.加密解密函数说明 一.导入第三方库头文件 对文件进行加密 , 将文件中的数据分成若干块 , 一块一块的 ...
- python文件读取与输出_python基本文件操作(文件输入和输出)
文件输入输出中常用的文件对象方法: open: 返回一个新的文件对象,调用该对象的上的方法可对文件进行任何操作 readline: 读取一行数据包括结尾的换行符在内 write: 将数据写入文件中 c ...
最新文章
- UNP总结 Chapter 11 名字与地址转换
- python函数内部变量能改变外部吗_python中,如何利用函数修改外部变量,注意我的要求...
- carsim学习笔记4——路面的一些设置1
- Spring Cloud——基于OpenFeign调用PaddleOCR的Restful API服务解决方案
- python就是玩具_极客老爹的玩具DIY之路:Python + Kids + Building Stuff == Fun
- Linux定时任务Crontab详解_定时备份
- Istio流量管理实践之(5): 使用cert-manager部署Istio自定义入口网关及进行证书管理...
- 秋意正浓,和存储大师们来一场美丽的邂逅
- codevs1026 逃跑的拉尔夫
- ios+测试版软件,ios15测试版描述文件
- vs2010 破解版,试用版变正式版
- MYSQL 随机字符串
- CSS 中的@media
- 哈工大数字逻辑与数字系统设计大作业(数字密码锁)
- springboot整合数据库
- 华科计算机系教学大纲,《批判性思维》课程教学大纲
- Hive——Hive数据类型
- android 仿微信demo————微信消息界面实现(移动端)
- 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java宠物医院管理系统fy9ez
- JAVA面试题|JAVA锁相关面试题总结(一)