C#文件操作——文件、数据流与注册表

所谓文件,就是在用户的计算机中,以实现某种功能或某个软件的部分功能为目的而定义的一个单位。而注册表是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

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值