首页 > 编程语言 >C#文件操作

C#文件操作

时间:2023-11-20 21:26:44浏览次数:31  
标签:文件 Console File C# 写入 FileStream WriteLine 操作

使用FIle的静态方法进行文件操作

1 //使用file的静态方法进行复制
2 File.Copy(path, destpath);
3 //使用File的静态方法删除路径下的一个文件
4 File.Delete(path);
5 //使用File的静态方法移动路径下的一个文件
6 File.Move(path, destpath);
7 File.ReadAllText(path); //打开一个文本文件*.txt ,读取文件中数据,然后关闭该文件
8 //写入
9 File.WriteAllText(path, "要写入文件的字符串"); //创建一个文件,向其中写入数据,如果此路径下有同名文件则会覆

PS:对文件进行写入操作,如果路径下有同名文件则会进行覆盖,所以最好进行一次判断,跟用户交互一下在进行覆盖

实例化FileInfo进行操作

1 FileInfo myfile = new FileInfo(path); //声明一个对象对某一个文件进行操作
2 myfile.CopyTo(destpath);  //对文件进行复制操作,复制路径为destpath
3 myfile.MoveTo(destpath);  //进行移动操作
4 myfile.Delete();          //进行删除操作

获取某一文件或文件夹的纤细信息(纤细日期,最后一次修改日期等等)

 1 获取一个文件,或者文件夹的详细信息。(创建日期,文件名等)
 2             FileInfo myfile = new FileInfo(path); //声明一个对象对某一个文件进行操作
 3             DateTime dt = myfile.CreationTime;  //获取或设置文件/文件夹的创建日期
 4             string filepath = myfile.DirectoryName; //仅能用于FileInfo,获得完整的路径名,路径+文件名
 5             bool file = myfile.Exists;              //此属性的值表示文件或文件夹是否存在,存在会返回True
 6             string fullname = myfile.FullName;     //获取文件或文件夹的完整路径名
 7             DateTime lastTime = myfile.LastAccessTime; //获取或设置最后一次访问文件或文件夹的时间
 8             DateTime lastWrite = myfile.LastWriteTime; //获取或设置最后一次修改文件夹或文件夹的时间
 9             string name = myfile.Name;                 //获取文件名,不能修改哦
10             long length = myfile.Length;                  //返回文件的字节大小
11             //CreationTime,LastAccessTime,LastWriteTime都是可以被修改的。

如何选择用File还是FileInfo

Directory/File只包含静态方法,不能被实例化,只需要提供合适的文件系统对象路径就可以使用,使用效率较高

当只对文件或文件夹执行一次操作,使用这些就很有效。

DirectoryInfo/FileInfo 如果使用一个对象执行多个操作,使用这些类就很高效。

因为它们在构造时就读取了文件系统对象的身份验证和其他信息,无论调用了多少方法,都不需要再次读取这些信息。

 

文件操作概述

  • 驱动器

  在Windows操作系统中,存储介质统称为驱动器,硬盘由于可以划分为多个区域,每一个区域称为一个驱动器。.NET Framework提供DriveInfo类和 DriveType枚举型,以方便在程序中直接使用驱动器。DriveInfo类的常用字段成员有DriveFormat(文件系统格式,如NTFS或FAT32)、DriveType(驱动器类型)、Name(驱动器名)、TotalSize(总空间)、TotalFreeSpace(获得驱动器可用空间)。常用的方法成员有GetDrives(获得可用驱动器列表)。 

DriveType枚举型的枚举值有CDRom(光驱)、Fixed(硬盘)、Network(网络驱动器)和Removeable(软盘或U盘)等。例如,以下代码可以输出每一个硬盘驱动器的剩余空间信息。

1 DriveInfo[] drivers = DriveInfo.GetDrives();
2 foreach(DriveInfo driver in drivers)
3 {
4     if(driver.DriveType == DriveType.Fixed && driver.DriveFormat == "NTFS")
5     {
6         Console.WriteLine("在{0}驱动器上还有{1}字节的剩余空间。", driver.Name, driver.AvailableFreeSpace);
7     }
8 }
9 Console.ReadLine();
  • 目录

   为了方便检索文件,需要在驱动器中先创建目录,然后把文件保存到这个目录中。在Windows操作系统中,目录又称文件夹。每个驱动器都有一个根目录,使用”\”表示,如”C:\”表示C驱动器的根目录。创建在根目录中的目录称为一级子目录。在一级子目录中创建的目录称为二级子目录,依此类推。文件系统的目录结构是一种树形结构。

  .NET Framework提供了Directory类和DirectoryInfo类,以方便在程序中直接操作目录。

  Directory类的常用方法成员有CreateDirectory(创建新目录)、Delete(删除目录)、Exists(判断目录是否存在)、Move(移动目录)、GetFiles(获得目录的文件列表)、GetDirectories(获得子目录列表)等。

  DirectoryInfo类的常用字段成员有Name(提取目录名)、Exists(判断目录是否存在)、Parent(父目录)、Root(根目录)、MoveTo(移动目录)、GetFiles(获得目录的文件列表)、GetDirectories(获得子目录列表)等。例如,以下代码分别展现了Directory类和DirectoryInfo类的基本方法。

 1 Directory.CreateDirectory(@"d:\C#程序设计");
 2 if(Directory.Exists(@"d:\C#程序设计"))
 3 {
 4     Console.WriteLine("创建成功");
 5 }
 6 Directory.Delete(@"d:\C#程序设计");
 7 if (!Directory.Exists(@"d:\C#程序设计"))
 8 {
 9     Console.WriteLine("删除成功");
10 }
11 
12 DirectoryInfo dir = new DirectoryInfo(@"d:\C#程序设计");
13 if (!dir.Exists)
14 {
15     dir.Create();
16 }
17 else
18 {
19     Console.WriteLine("该目录已经存在");
20 }
  • 文件

  .NET Framework提供了File类和FileInfo类,以方便在程序中直接操作文件。File和FileInfo类位于System.IO命名空间,都可以用来实现创建、复制、移动、打开文件等操作。File类和FileInfo类与Directory类和DirectoryInfo类的工作方式相似。File类是一个静态类,可直接调用其方法成员。FileInfo类不是静态类,需要先创建实例。

  •  文件类File常用方法

常 用 方 法

介 绍

Open()

打开文件

Create()

创建文件

Copy()

复制文件

Delete()

删除文件

Exists()

判断文件是否存在

Move()

移动文件

Replace()

替换文件

AppendAllText()

新建文件并添加文本

ReadAllText()

打开并读取文本内容

  • 文件信息类FileInfo

  文件信息类FileInfo与File类不同,它虽然也提供类创建、复制、删除、移动和打开文件的方法,并且帮助创建FileStream对象,但是它提供的仅仅是实例方法。下表分别展示类FileInfo类的常用字段和方法。

常用字段

介绍

Name

提取文件名

Directory

所属目录

Exists

是否存在(继承自父类FileSystemInfo)

Extension

文件扩展名

Length

文件长度

IsReadOnly

是否为只读

 

常用方法

介绍

Open()

打开文件

Create()

创建文件

CopyTo()

复制到新文件

Delete()

删除文件

MoveTo()

移动文件

Replace()

替换文件

EnCrypt()

加密文件

Decrypt()

解密文件

 

  • 路径

  每个驱动器包含一个或多个目录,而每个目录又可以包含一个或多个子目录,目录的结构为树形结构。一个文件只能保存在树形结构的某个特定的目录中,文件所在位置为路径。要检索文件时,必须首先确定文件的路径。路径由驱动器盘符、目录名、文件名、文件扩展名和分隔符组成,有两种种表示方法:一种是从驱动器的根目录开始书写,如C:\Windows\System32\notepad.exe,这种路径称为绝对路径;另一种是从当前目录位置开始书写,如System32\notepad.exe(假设当前目录为C:\Windows),这种路径称为相对路径。

  在C#中,使用文件和目录路径时要十分谨慎。C#将反斜杠”\”字符视作转义符,因此当路径表示为字符串时,要使用两个反斜杠表示,例如:

“C:\\Windows\\System32\\notepad.exe”

  另外,C#允许在字符串前添加”@”标志,以提示编译器不要把”\”字符视作转义符,而视作普通字符,例如:

@”C:\Windows\System32\notepad.exe”

  .NET Framework提供了Path类,以帮助在程序中管理文件和目录路径,Path类位于System.IO命名空间,是一个静态类,可以用来操作路径的每一个字段,如驱动器盘符、目录名、文件名、文件扩展名和分隔符等。Path类的常用字段成员有PathSeperator(路径分隔符,如”;”)、DirectorySeparatorChar(目录分隔符,如”\”)、VolumeSeparator(卷分隔符,如”:”)、AltDirectorySeparator(替换目录分隔符,如”/”),常用的方法成员有GetDirectoryName(取目录名)、GetFileName(取文件名)、GetExtension(取文件扩展名)、GetFullPath(取完整路径)、GetTempPath(取操作系统的临时文件路径)等,例如,以下代码表示提取并显示路径中的目录名和文件名。

 1 tring path = @"c:\windows\System32\notepad.exe";

2 Console.WriteLine(Path.GetDirectoryName(path));

3 Console.WriteLine(Path.GetFileName(path)); 

  • 文件流操作

  在.NET Framework中,文件和流是有区别的。文件是存储在磁盘上的数据集,它具有名称和相应的路径。当打开一个文件并对其进行读/写时,该文件就称为流(stream)。但是,流不仅仅是指打开的磁盘文件,还可以是网络数据。.Net Framework允许在内存中创建流。此外,在控制台应用程序中,键盘输入和文本显示都是流。流包括以下基本操作:

  * 读取(read):把数据从流传输到某种数据结构中,如输出到字符数组中。

  * 写入(write):把数据从某种数据结构传输到流中,如把字节数组中的数据传输到流中。

  * 定位(seek):在流中查找或重新定位当前位置。

  • 操作流的类

  • Stream类

  Stream类是所有流的抽象基类。Stream类的主要属性有CanRead(是否支持读取)、CanSeek(是否支持查找)、CanTimeout(是否可以超时)、CanWrite(是否支持写入)、Length(流的长度)、Position(获取或设置当前流中的位置)、ReadTimeout(获取或设置读取操作的超时时间)、WriteTimeout(获取或设置写操作的超时时间),主要方法有BeginRead(开始异步读操作),BeginWrite(开始异步写操作)、Close(关闭当前流)、EndRead(结束异步读操作)、EndWrite(结束异步写操作)、Flush(清除流的所有缓冲区并把缓冲数据写入基础设备)、Read(读取字节序列)、ReadByte(读取一个字节)、Seek(设置查找位置)、Write(写入字节序列)、WriteByte(写入一个字节)。 

  • FileStream MemoryStream和BufferedStream类

  文件流类FileStream以流的形式读、写、打开、关闭文件。另外,它还可以用来操作诸如:管道、标准输入/输出等其他与文件相关的操作系统句柄。

  内存流MemoryStream类用来在内存中创建流,以暂时保持数据,因此有了它就无须在硬盘上创建临时文件。它将数据封装为无符号的字节序列,可以直接进行读、写、查找操作。

  缓冲流BufferedStream类表示把流先添加到缓冲区,再进行数据的读/写操作。缓冲区是存储区中用来缓存数据的字节块。使用缓冲区可以减少访问数据时对操作系统的调用次数,增强系统的读/写功能。

  注意,FileStream类也有缓冲功能,在创建FileStream类的实例时,只需要指定缓冲区的大小即可。

  • StreamReader和StreamWrite类

  流读取器StreamReader类用来以一种特定的编码(如:UTF-8)从字节流中读取字符,流写入器StreamWriter类用来以一种特定的编码(如:UTF-8)向流中写入字符。StreamReader和StreamWriter类一般用来操作文本文件。

  • BinaryReader和BinaryWriter

  BinaryReader类用特定的编码将基元数据类型读作二进制。BinaryWriter类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串。

  • 文件流类FileStrem

  文件流类FileStream公开了以文件为主的Stream,既支持同步读/写操作,也支持异步读/写操作,FileStream类的特点是操作字节和字节数组。这种方式不适合操作用字符数据构成的文本文件,适合处理非文本文件。FileStream类提供了对文件的低级而复杂的操作,因此能够实现更多高级的功能。

以下为FileStreamWriter代码演示:

 1 //要写入文件的字符数组
 2 char[] m_cDataWrite = new char[100];
 3 //包含要写入该流的数据的缓冲区
 4 byte[] m_bDataWrite = new byte[100];           
 5            
 6 try
 7 {
 8     //创建d:\file.txt的FileStream对象
 9     FileStream m_FileStream = new FileStream(@"d:\file.txt", FileMode.OpenOrCreate);
10     //将要写入的字符串转换成字符数组
11     m_cDataWrite = "test filestream".ToCharArray();
12  
13     //通过UTF-8编码方法将字符数组转成字节数组
14     Encoder m_Enc = Encoding.UTF8.GetEncoder();
15     m_Enc.GetBytes(m_cDataWrite, 0, m_cDataWrite.Length, m_bDataWrite, 0, true);
16  
17     //设置流当前位置为文件开始位置
18     m_FileStream.Seek(0, SeekOrigin.Begin);
19     //将字节数组中的内容写入文件
20     m_FileStream.Write(m_bDataWrite, 0, m_bDataWrite.Length);
21     if (m_FileStream != null)
22     {
23         //清除此流的缓冲区,使得所有缓冲的数据都写入到文件中
24         m_FileStream.Flush();
25         m_FileStream.Close();
26     }
27 }
28 catch (Exception ex)
29 {
30     Console.WriteLine("There is an IOException");
31     Console.WriteLine(ex.Message);
32 }
33 Console.WriteLine("Write to File Succeed!");

以下为FileStreamReader代码演示:

 1 //要写入文件的字符数组
 2 char[] m_cDataWrite = new char[100];
 3 //包含要写入该流的数据的缓冲区
 4 byte[] m_bDataWrite = new byte[100];
 5  
 6 try
 7 {
 8     //创建d:\file.txt的FileStream对象
 9     FileStream m_FileStream = new FileStream(@"d:\file.txt", FileMode.Open);
10  
11     //设置流当前位置为文件开始位置
12     m_FileStream.Seek(0, SeekOrigin.Begin);
13     //将文件的内容存到字节数组中(缓存)
14     m_FileStream.Read(m_bDataWrite, 0, 100);               
15 }
16 catch (Exception ex)
17 {
18     Console.WriteLine("There is an IOException");
19     Console.WriteLine(ex.Message);
20 }
21  
22 //通过UTF-8编码方法将字符数组转换成字符数组
23 Decoder m_Dec = Encoding.UTF8.GetDecoder();
24 m_Dec.GetChars(m_bDataWrite, 0, m_bDataWrite.Length, m_cDataWrite, 0);
25 Console.WriteLine("Read from file Succeed!");
26 Console.WriteLine(m_cDataWrite);
  • StreamWriter和StreamReader类

应用FileStream类需要许多额外的数据类型转换操作,十分影响效率。StreamWriter类允许直接将字符和字符串写入文件。下面演示其用法:

 1 try
 2 {
 3     //保留文件现有数据,以追加写入的方式打开d:\file.txt文件
 4     StreamWriter m_SW = new StreamWriter(@"d:\file.txt", true);
 5     //向文件写入新字符串,并关闭StreamWriter
 6     m_SW.WriteLine("Another File Operation Method");
 7     m_SW.Close();               
 8 }
 9 catch (Exception ex)
10 {
11     Console.WriteLine("There is an IOException");
12     Console.WriteLine(ex.Message);
13          }
14   StreamWriter类提供了另一种从文件中读取数据的方法,下面演示其用法:
15 try
16 {
17     //以绝对路径方式构造新的StreamReader对象
18     StreamReader m_SR = new StreamReader(@"d:\file.txt");
19  
20     //用ReadToEnd方法将d:\file.txt中的数据全部读入到字符串m_Data中,并关闭StreamReader
21     string m_Data = m_SR.ReadToEnd();
22     m_SR.Close();
23     Console.WriteLine(m_Data);
24 }
25 catch (Exception ex)
26 {
27     Console.WriteLine("There is an IOException");
28     Console.WriteLine(ex.Message);
29 }
  • BinaryReader和BinaryWriter类

  BinaryWriter类是除了FileStream和StreamWriter类之外另一种向文件写入数据的方式,与之前两种方式不同,BinaryWriter类将基础数据(如:字符串)以二进制形式写入文件流中,并支持用特定的编码写入。下面演示其用法:

 1 FileStream m_FS = new FileStream(@"d:\data.dat", FileMode.Create);
 2 //通过文件流创建相应的BinaryWriter
 3 BinaryWriter m_BW = new BinaryWriter(m_FS);
 4 for(int i = 0; i < 11; i++)
 5 {
 6     //向d:\data.dat中写入数据
 7     m_BW.Write((int)i);
 8 }
 9  
10 m_BW.Close();
11 m_FS.Close();

  代码中首先给出了文件夹的路径,利用BinaryWriter类的Write方法向文件中写入部分二进制字符。该文件是以二进制存储的,因此用记事本打开时,将无法观察到正确的字符,必须使用支持二进制的文本阅读器。

  BinaryReader类是和BinaryWriter类相对应的二进制数据读取类。它用特定的编码将基元数据类型(如:字符串类型)读作二进制值。

 1 FileStream m_FS = new FileStream(@"d:\data.dat", FileMode.Open, FileAccess.Read);
 2 //通过文件流创建相应的BinaryReader
 3 BinaryReader m_BR = new BinaryReader(m_FS);
 4 //从d:\data.dat中读取数据
 5 for(int i = 0; i < 11; i++)
 6 {
 7     Console.WriteLine(m_BR.ReadInt32());
 8 }
 9  
10 m_BR.Close();
11 m_FS.Close();
12  
13 Console.ReadLine();

 

标签:文件,Console,File,C#,写入,FileStream,WriteLine,操作
From: https://www.cnblogs.com/davisdabing/p/17817790.html

相关文章

  • CentOS7使用Docker-compose管理容器
    1.容器化的概念容器化是将应用程序代码和依赖项捆绑到一个单一的虚拟包中。容器化应用程序通常与其他应用程序并排放置,并通过计算机、服务器或云上的共享操作系统运行。2.容器化使用的场景1.简化不同环境配置差异虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平......
  • 常用的linux命令 docker常用命令
    mkdir新建目录rmdir删除目录rm只能删除文件,不能删除目录cptest.txtDocuments 进入容器的目录dockerexec-it<container_id_or_name>/bin/bash 挂载容器目录到本地目录dockerrun-it-v/host/path:/container/path<image_name>/bin/bash 从宿主机传输文件......
  • ARC168E
    简要题意给定一个长度为$n$的序列$a$,将$a$划分为$k$个连续段,最大化满足连续段中元素和$\geqs$的连续段数。题解首先发现是恰好$k$个连续段,这种类型的题套路地考虑wqs二分,然后你会惊喜的发现这玩意不是凸的,我的思考也就卡在这里了。正确的做法是观察到答案具有单......
  • JetBrains TeamCity 任意代码执行漏洞(CVE-2023-42793)研究
    一、JetBrainsTeamCity简介TeamCity是一款由JetBrains开发的强大的持续集成(ContinuousIntegration,CI)和持续部署(ContinuousDeployment,CD)工具。它帮助开发团队自动化构建、测试和部署过程,以确保软件项目的质量和快速交付。TeamCity的主要特点和优势包括:灵活的构建配......
  • Linux操作系统的优势官方开发App应用程序有哪些优缺点?
    随着技术的不断进步,Linux操作系统在应用程序开发中扮演着越来越重要的角色。其开放性、稳定性和定制性成为开发者的首选。图片来源:http://news.gulufenfa.com/post/211Linux系统简介Linux作为一个广泛使用的开源操作系统,它的核心是Linux内核,由LinusTorvalds在1991年首次发布。Linu......
  • 集成 NVDC 电源路径管理的1-4节电池升降压充电IC解决方案
    描述MP2760是一款集成窄电压DC(NVDC)电源路径管理功能和USBOn-the-Go(OTG)功能的升降压充电IC,兼容USBPD,适用于单节至4节串联的电池包应用。该芯片的充电输入电压范围广,可支持最高22V。当启用电池放电模式(Sourcemode)时,芯片的IN引脚可提供高达21V的电压。当提供电源输入时,MP2760通......
  • JavaWeb--SqlSessionFactory工具类抽取
    代码优化 Stringresource="mybatis-config.xml";InputStreaminputStream=Resources.getResourceAsStream(resource);SqlSessionFactorysqlSessionFactory=newSqlSessionFactoryBuilder().build(inputStream);//2.2获取SqlSession对象SqlSessionsqlSession=......
  • The Application of River Chief System on Water Pollution in Britain
    Waterpollutionisaglobalconcernthataffectsthehealthandwell-beingofbothhumansandecosystems.InBritain,despiteeffortstoaddressthisissue,waterpollutionremainsasignificantchallenge.However,apromisingsolutiontothisproblemis......
  • 【尝试逆向】零基础尝试寻找某个C++游戏的文件读取方法
    前言本游戏在国内知名度非常一般,而且在游戏领域也算是非常少见的厂商完全不考虑国际化的游戏系列,距今已有近30年的历史。这次为了尝试对此游戏的贴图进行提取,我尝试下载了本游戏系列的大概所有版本,并尝试通过脱壳等手段找到贴图的提取函数,并想办法写出来提取用的脚本。不过目前......
  • wpf 任意控件绑定Command
    <BorderBackground="White" BorderBrush="Gray" BorderThickness="1" CornerRadius="2"> <Border.InputBindings> <MouseBindingCommand="{BindingDataContext.BorderCommand,RelativeSource={RelativeS......