所谓文件,就是在用户的计算机中,以实现某种功能或某个软件的部分功能为目的而定义的一个单位。而注册表是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。

1、文件系统

一个文件是一个存储在磁盘中带有指定名称和目录路径的数据集合。当打开文件进行读写时,它变成一个流。从根本上说,流是通过通信路径传递的字节序列。有两个主要的流:输入流和输入流。输入流用于从文件读取数据(读操作),输出流用于向文件写入数据(写操作)。

System.IO命名空间

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类,可以避免频繁创建和释放对象的系统开销。

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类。

FileSystemInfo类的常用属性及说明
属性 说明
Exists 确定文件是否存在,是只读抽象属性
Attributes 获取或设置当前文件或目录的特性
Extension 提取文件的扩展名,此属性只读
FullName 检索文件的完整路径,只读属性
Name 检索文件的完整路径,只读抽象属性

LastAccesstime

LastAcdessTimeUtc

获取或设置上次访问当前文件的日期和时间,可以使用UTC或非UTC版本

LastWriteTime

LastWriteTimeUtc

获取或设置上次访问当前文件的日期和时间,可以使用UTC或非UTC版本

CreationTime

CreationTimeUtc

获取当前文件的创建日期和时间,可以使用UTC或非UTC版本
FileInfo类的专用属性
属性 说明
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访问控制列表等。

Directory类的常用方法和说明
方法 说明
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命名空间的一部分,它表示磁盘上的物理目录,用于创建、删除和移动目录。它提供了执行与目录和子目录相关的操作的方法。该类是一个密封的类,所以不能继承它。

DirectoryInfo类的常用属性和说明
属性 说明
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类的枚举有几种成员,用于规定如何打开或创建文件,这些成员可以联合使用。

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时,表示打开文件,保留原来的数据,但是如果找不到文件,则创建一个新文件。

StreamWriter类的常用方法及说明
方法 说明
Close 关闭当前StreamWriter对象和基础流
Dispose 释放使用的所有资源
Flush 清理当前编写器的所有缓冲区,并使所有缓冲数据写入基础流
Write 写入流
WriteLine 写入指定的某些数据,后跟行结束符
StreamWriter类的常用属性及说明
属性 说明
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字符并在操作系统的本地化版本上提供一致的结果。

StreamReader类的常用方法及说明
方法 说明
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对象。

BinaryWriter类的常用方法及说明
方法 说明
Close 关闭当前的BinaryWriter和基础流。
Seek 设置当前流中的位置。
Writer 将值写入当前流。

2、BinaryReader类

BinaryReader类用于从文件读取二进制数据。通过将FileStream对象传递给其构造函数来创建BinaryReader对象。

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个属性。

Registry类的属性及说明
属性 说明
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注册表中的顶级节点。此类是注册表封闭。它提供了对注册表操作的方法:查看子键、创建新键、读取匮乏修改键中的值等。

RegistryKey类的方法及说明
方法 说明
Close 关闭该项,如果其内容已修改,则将其刷新到磁盘
CreateSubKey 创建一个新的子项,或打开一个现有子项
DeleteSubKey 删除指定的子项,字符串subkey不区分大小写
DeleteSubKeyTree 递归删除子项和任何子级子项。字符串subkey不区分大小写
DeleteValue 从此项中删除指定值
GetValue 检索与指定的名称关联的值
GetSubKeyNames 检索包含所有子键名称的字符串数组
GetValueKind 检查与指定名称关联的注册表数据类型
GetValueNames 检索包含与此项关联的所有名称的字符串数值
OpenSubKey 检索指定的子项
SetValue 设置注册表项中的名称/值对的值
RegistryKey类的属性及说明
属性 说明
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#文件操作——文件、数据流与注册表相关推荐

  1. 注册表中shell文件不见了_win7系统注册表中的shell文件不小心被删除的解决方法...

    我们在操作电脑的时候,win7系统注册表中的shell文件不小心被删除的问题对于我们来说其实是比较少见的,一般情况下的正常使用都不会遇到win7系统注册表中的shell文件不小心被删除的状况.但在wi ...

  2. java在regedit找不到_Windows找不到文件regedit打不开注册表怎么解决

    Windows找不到文件regedit打不开注册表怎么解决很多小伙伴都还不知道,下面IEfans小编为大家整理了解决regedit打不开注册表方法说明,一起来看看吧! 方法/步骤分享: 1.电脑桌面, ...

  3. java流与文件——操作文件

    [0]README 0.1) 本文描述转自 core java volume 2, 旨在理解 java流与文件--操作文件 的相关知识: 0.2) for source code, please vi ...

  4. Linux——权限|shell运行原理——外壳程序|Linux权限的概念|对人操作|角色和文件操作|文件类型访问权限|修改权限ugo+-|8进制|修改权限|更改文件的拥有

    目录 shell运行原理--外壳程序 Linux权限的概念 对人操作 角色和文件操作 文件类型

  5. JSP中的文件操作:数据流、File类、文件浏览、目录操作、上传下载

    ​ 文件可以永久地存储信息,从本质上讲文件就是存放在盘上的一系列数据的集合.应用程序如果想长期保存数据,就必须将数据存储到文件中,这就涉及到文件的操作.而在编写网站应用程序的过程中,有许多地方要对文件 ...

  6. 32位应用程序操作64位Windows注册表的方法

    64位的Windows操作系统中能够运行32位的应用程序,主要是由于Windows中提供了WOW64子系统. 1.WOW64子系统 WOW64 (Windows-on-Windows 64-bit)是 ...

  7. 【Delphi入门】文件系统(文件分类 文件文本变量 文件操作 文件流操作)

    文件分类 文本文件(TextFile) & 二进制文件(Flie) 二进制形式存放数据占有存储空间较少,但不直观:文本文件与之相反 文件是由相同类型的数据元素组成的序列.在DELPHI中对文件 ...

  8. VC 文件操作(文件查找,打开/保存,读/写,复制/删除/重命名)

    右击项目->属性->字符集:使用多字节字符集. 这样可以使用char到CString的转化. char sRead[20] = ""; CString strtest ...

  9. 【C 语言】文件操作 ( 文件加密解密 | 使用第三方 DES 加密解密库 | 头文件导入 | 兼容 C++ 语言 | 加密解密函数说明 )

    文章目录 一.导入第三方库头文件 二.头文件说明 1.兼容 C++ 语言 2.头文件导入限制 3.加密解密函数说明 一.导入第三方库头文件 对文件进行加密 , 将文件中的数据分成若干块 , 一块一块的 ...

  10. python文件读取与输出_python基本文件操作(文件输入和输出)

    文件输入输出中常用的文件对象方法: open: 返回一个新的文件对象,调用该对象的上的方法可对文件进行任何操作 readline: 读取一行数据包括结尾的换行符在内 write: 将数据写入文件中 c ...

最新文章

  1. UNP总结 Chapter 11 名字与地址转换
  2. python函数内部变量能改变外部吗_python中,如何利用函数修改外部变量,注意我的要求...
  3. carsim学习笔记4——路面的一些设置1
  4. Spring Cloud——基于OpenFeign调用PaddleOCR的Restful API服务解决方案
  5. python就是玩具_极客老爹的玩具DIY之路:Python + Kids + Building Stuff == Fun
  6. Linux定时任务Crontab详解_定时备份
  7. Istio流量管理实践之(5): 使用cert-manager部署Istio自定义入口网关及进行证书管理...
  8. 秋意正浓,和存储大师们来一场美丽的邂逅
  9. codevs1026 逃跑的拉尔夫
  10. ios+测试版软件,ios15测试版描述文件
  11. vs2010 破解版,试用版变正式版
  12. MYSQL 随机字符串
  13. CSS 中的@media
  14. 哈工大数字逻辑与数字系统设计大作业(数字密码锁)
  15. springboot整合数据库
  16. 华科计算机系教学大纲,《批判性思维》课程教学大纲
  17. Hive——Hive数据类型
  18. android 仿微信demo————微信消息界面实现(移动端)
  19. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java宠物医院管理系统fy9ez
  20. JAVA面试题|JAVA锁相关面试题总结(一)

热门文章

  1. Python爬虫lxml解析实战
  2. java 计时器归零_加一计时器——每隔1s六位数码管显示数字加1,直至999999,之后归零,重新开始。...
  3. 硬件--如何安全删除USB后不重新插拔而自动重连
  4. spark初始:spark腾讯雅虎优酷成功应用解析
  5. 考研经验计算机信息技术,考研经验:失败者的4条血泪教训
  6. 数据分析步骤(思维导图)
  7. 作业——05 理解爬虫原理
  8. modelsim vopt
  9. 【项目总结】ACM Recsys2019
  10. HttpWatch工具简介及使用技巧(转)