c#io学习.docx
- 文档编号:24278834
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:29
- 大小:50.06KB
c#io学习.docx
《c#io学习.docx》由会员分享,可在线阅读,更多相关《c#io学习.docx(29页珍藏版)》请在冰豆网上搜索。
c#io学习
System.IO命名空间包含允许在数据流和文件上进行同步和异步读取及写入的类型。
以下的区别有助于澄清文件和流的差异。
1)文件:
是一些具有永久存储及特定顺序的字节组成的一个有序的、具有名称的集合。
因此,对于文件,人们常会想到目录路径、磁盘存储、文件和目录名等方面。
2)流:
提供一种向后备存储器写入字节和从后备存储器读取字节的方式,后备存储器可以为多种存储媒介之一。
正如除磁盘外存在多种后备存储器一样,除文件流之外也存在多种流。
例如,还存在网络流、内存流和磁带流等。
基本的文件I/O
抽象基类Stream支持读取和写入字节。
Stream集成了异步支持。
其默认实现根据其相应的异步方法来定义同步读取和写入,反之亦然。
所有表示流的类都是从Stream类继承的。
Stream类及其派生类提供数据源和储存库的一般视图,使程序员不必了解操作系统和基础设备的具体细节。
流涉及三个基本操作:
1)可以从流读取。
读取是从流到数据结构(如字节数组)的数据传输。
2)可以向流写入。
写入是从数据结构到流的数据传输。
3)流可以支持查找。
查找是对流内的当前位置进行查询和修改。
根据基础数据源或储存库,流可能只支持这些功能中的一部分。
例如,NetworkStreams不支持查找。
Stream的CanRead、CanWrite和CanSeek属性及其派生类决定不同的流所支持的操作。
一:
从System.Object派生的I/O类
BinaryReader和BinaryWriter从Streams读取或向Streams写入编码的字符串和基元数据类型。
File提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream对象。
FileInfo类提供实例方法。
Directory提供通过目录和子目录进行创建、移动和枚举的静态方法。
DirectoryInfo类提供实例方法。
Path提供以跨平台的方式处理目录字符串的方法和属性。
File、Path和Directory是密封(在MicrosoftVisualBasic中为NotInheritable)类。
可以创建这些类的新实例,但它们没有派生类。
二:
System.IO.FileSystemInfo及其派生类
FileSystemInfo是FileInfo和DirectoryInfo对象的抽象基类。
FileInfo提供用于创建、复制、删除、移动和打开文件的实例方法,并协助创建FileStream对象。
File类提供静态方法。
DirectoryInfo提供通过目录和子目录进行创建、移动和枚举的实例方法。
Directory类提供静态方法。
FileInfo和DirectoryInfo是密封(在MicrosoftVisualBasic中为NotInheritable)类。
可以创建这些类的新实例,但它们可以没有派生类。
三:
从System.IO.Stream派生的类
FileStream支持通过其Seek方法随机访问文件。
默认情况下,FileStream以同步方式打开文件,但它也支持异步操作。
File包含静态方法,而FileInfo包含实例方法。
MemoryStream是一个非缓冲的流,可以在内存中直接访问它的封装数据。
该流没有后备存储器,可用作临时缓冲区。
NetworkStream表示网络连接上的Stream。
虽然NetworkStream是从Stream派生的,但它不是System.IO命名空间的一部分,而是在System.Net.Sockets命名空间中。
CryptoStream将数据流链接到加密转换。
虽然CryptoStream是从Stream派生的,但它不是System.IO命名空间的一部分,而是在System.Security.Cryptography命名空间中。
BufferedStream是向另一个Stream(例如NetworkStream)添加缓冲的Stream。
(FileStream内部已具有缓冲,MemoryStream不需要缓冲)。
BufferedStream对象可以围绕某些类型的流来构成以提高读写性能。
缓冲区是内存中的字节块,用于缓存数据,从而减少对操作系统的调用次数。
四:
System.IO.TextReader及其派生类
TextReader是StreamReader和StringReader对象的抽象基类。
抽象Stream类的实现用于字节输入和输出,而TextReader的实现用于Unicode字符输出。
StreamReader通过使用Encoding进行字符和字节的转换,从Streams中读取字符。
StreamReader具有一个构造函数,该构造函数根据是否存在专用于Encoding的preamble(例如一个字节顺序标记)来尝试确定给定Stream的正确Encoding是什么。
StringReader从Strings中读取字符。
StringReader允许您用相同的API来处理Strings,因此您的输出可以是String或以任何编码表示的Stream。
System.IO.TextWriter及其派生类
TextWriter是StreamWriter和StringWriter对象的抽象基类。
抽象Stream类的实现用于字节输入和输出,而TextWriter的实现用于Unicode字符输出。
StreamWriter通过使用Encoding将字符转换为字节,向Streams写入字符。
StringWriter向Strings写入字符。
StringWriter允许您用相同的API来处理Strings,这样您的输出可以是String或以任何编码表示的Stream。
枚举数
FileAccess、FileMode和FileShare枚举定义某些FileStream和IsolatedStorageFileStream构造函数及某些File.Open重载方法使用的常数。
这些常数影响创建、打开和共享基础文件的方式。
SeekOrigin枚举数定义用来指定随机访问文件入口点的常数。
这些常数和字节偏移量一起使用。
I/O和安全性
当在System.IO命名空间中使用类时,要使访问被允许,则必须满足诸如访问控制列表(ACL)等操作系统安全性要求。
该要求是在所有FileIOPermission要求之外的要求。
警告Internet和Intranet的默认安全策略不允许访问文件。
因此,如果您在编写将通过Internet下载的代码,则不要使用“regular”(即非隔离存储)IO类。
请改用独立存储。
警告当文件或网络流打开时,只有在构造流时才执行安全检查。
因此,当将这些流分发给受信度较低的代码或应用程序域时,请格外小心。
创建目录列表
下面的代码示例显示了如何使用IO类来创建目录列表。
[C#]
usingSystem;
usingSystem.IO;
classDirectoryLister
{
publicstaticvoidMain(String[]args)
{
DirectoryInfodir=newDirectoryInfo(".");
foreach(FileInfofindir.GetFiles("*.cs"))
{
Stringname=f.FullName;
longsize=f.Length;
DateTimecreationTime=f.CreationTime;
Console.WriteLine("{0,-12:
N0}{1,-20:
g}{2}",size,
creationTime,name);
}
}
}
在本示例中,DirectoryInfo对象是当前目录,用(".")表示,代码列出了当前目录中具有.cs扩展名的所有文件,同时还列出了这些文件的大小、创建时间和名称。
假设C:
\MyDir的\Bin子目录中存在多个.cs文件,该代码的输出可能如下所示:
9537/20/200010:
42AMC:
\MyDir\Bin\paramatt.cs
6647/27/20003:
11PMC:
\MyDir\Bin\tst.cs
4038/8/200010:
25AMC:
\MyDir\Bin\dirlist.cs
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Text;
usingSystem.IO;
namespaceDirectoryLister
{
classDirectoryLister
{
staticvoidMain(string[]args)
{
DirectoryInfodir=newDirectoryInfo(".");
foreach(FileInfofiindir.GetFiles("*.*"))
{
stringfullName=fi.FullName;
longsize=fi.Length;
DateTimecreateTime=fi.CreationTime;
//FileAttributesA=fi.Attributes;
Console.WriteLine("{0},{1},{2}",fullName,size.ToString(),createTime.ToLocalTime().ToString());
}
Console.ReadLine();
}
}
}
如果您要另一个目录中文件的列表,例如C:
\root目录,请记着使用反斜杠(\)转义符,如“C:
\\”中的反斜杠。
您也可以使用Unix样式的斜杠,如“C:
/”中的斜杠。
对刚创建的数据文件进行读取和写入
BinaryWriter和BinaryReader类用于读取和写入数据,而不是字符串。
下面的代码示例示范了向新的、空文件流(Test.data)写入数据及从该文件读取数据。
在当前目录中创建了数据文件之后,也就同时创建了相关的BinaryWriter和BinaryReader,BinaryWriter用于向Test.data写入整数0到10,Test.data在文件尾留下了一个文件指针。
在将文件指针设置回初始位置后,BinaryReader读出指定的内容。
[C#]
usingSystem;
usingSystem.IO;
classMyStream{
privateconststringFILE_NAME="Test.data";
publicstaticvoidMain(String[]args){
//Createthenew,emptydatafile.
if(File.Exists(FILE_NAME)){
Console.WriteLine("{0}alreadyexists!
",FILE_NAME);
return;
}
FileStreamfs=newFileStream(FILE_NAME,FileMode.CreateNew);
//Createthewriterfordata.
BinaryWriterw=newBinaryWriter(fs);
//WritedatatoTest.data.
for(inti=0;i<11;i++){
w.Write((int)i);
}
w.Close();
fs.Close();
//Createthereaderfordata.
fs=newFileStream(FILE_NAME,FileMode.Open,FileAccess.Read);
BinaryReaderr=newBinaryReader(fs);
//ReaddatafromTest.data.
for(inti=0;i<11;i++){
Console.WriteLine(r.ReadInt32());
w.Close();
}
}
}
如果Test.data已存在于当前目录中,则引发一个IOException。
始终使用FileMode.Create创建新文件,而不引发IOException。
打开并附加到日志文件
StreamWriter和StreamReader向流写入字符并从流读取字符。
下面的代码示例打开log.txt文件(如果文件不存在则创建文件)以进行输入,并将信息附加到文件尾。
然后将文件的内容写入标准输出,以便显示出来。
[C#]
usingSystem;
usingSystem.IO;
classDirAppend
{
publicstaticvoidMain(String[]args)
{
StreamWriterw=File.AppendText("log.txt");
Log("Test1",w);
Log("Test2",w);
//Closethewriterandunderlyingfile.
w.Close();
//Openandreadthefile.
StreamReaderr=File.OpenText("log.txt");
DumpLog(r);
}
publicstaticvoidLog(StringlogMessage,TextWriterw)
{
w.Write("\r\nLogEntry:
");
w.WriteLine("{0}{1}",DateTime.Now.ToLongTimeString(),
DateTime.Now.ToLongDateString());
w.WriteLine(":
");
w.WriteLine(":
{0}",logMessage);
w.WriteLine("-------------------------------");
//Updatetheunderlyingfile.
w.Flush();
}
publicstaticvoidDumpLog(StreamReaderr)
{
//Whilenotattheendofthefile,readandwritelines.
Stringline;
while((line=r.ReadLine())!
=null)
{
Console.WriteLine(line);
}
r.Close();
}
}
下面的代码示例读取整个文件,并在检测到文件尾时发出通知。
[C#]
usingSystem;
usingSystem.IO;
publicclassTextFromFile{
privateconststringFILE_NAME="MyFile.txt";
publicstaticvoidMain(String[]args){
if(!
File.Exists(FILE_NAME)){
Console.WriteLine("{0}doesnotexist!
",FILE_NAME);
return;
}
StreamReadersr=File.OpenText(FILE_NAME);
Stringinput;
while((input=sr.ReadLine())!
=null){
Console.WriteLine(input);
}
Console.WriteLine("Theendofthestreamhasbeenreached.");
sr.Close();
}
}
此代码通过调用File.OpenText创建一个指向MyFile.txt的StreamReader。
StreamReader.ReadLine将每一行都返回为一个字符串。
当没有要读取的字符时,一条消息显示该情况,然后流关闭。
向文件写入文本
下面的代码示例创建一个新文本文件并向其写入一个字符串。
[C#]
usingSystem;
usingSystem.IO;
publicclassTextToFile{
privateconststringFILE_NAME="MyFile.txt";
publicstaticvoidMain(String[]args){
if(File.Exists(FILE_NAME)){
Console.WriteLine("{0}alreadyexists!
",FILE_NAME);
return;
}
StreamWritersr=File.CreateText(FILE_NAME);
sr.WriteLine("Thisismyfile.");
sr.WriteLine("Icanwriteints{0}orfloats{1},andsoon.",
1,4.2);
sr.Close();
}
}
从字符串中读取字符
下面的代码示例允许您在现有字符串中从指定的位置开始读取一定数目的字符。
使用StringReader完成此操作,如下所示。
代码定义字符串并将其转换为字符数组,然后,可以使用适当的StringReader.Read方法按需要读取该字符数组。
[C#]
usingSystem;
usingSystem.IO;
publicclassCharsFromStr
{
publicstaticvoidMain(String[]args)
{
//Createastringtoreadcharactersfrom.
Stringstr="Somenumberofcharacters";
//Sizethearraytoholdallthecharactersofthestring,
//sothattheyareallaccessible.
char[]b=newchar[24];
//CreateaStringReaderandattachittothestring.
StringReadersr=newStringReader(str);
//Read13charactersfromthearraythatholdsthestring,starting
//fromthefirstarraymember.
sr.Read(b,0,13);
//Displaytheoutput.
Console.WriteLine(b);
//ClosetheStringReader.
sr.Close();
}
}
在C#中有2个类
FileStream类操作的是字节数据,
Stream类操作的是字符数据。
字符数据易于使用,但功能简单,某些高级功能则必须使用FileStream
通过读取字节数据,FileStream对象可以用于读取图像和声音,代价是FileStream对象不能将数据直接读入字符串。
//Stream打开文件
StreamReadersr=newStreamReader(@"c:
\a.txt",Encoding.UTF8);
stringsLine="";
StringBuildersb=newStringBuilder();
while((sLine=sr.ReadLine())!
=null)
{
sb.Append(sLine);
}
rechTextBox.Text=sb.ToString();
sr.Close();
//或者
StreamReadersr=newStreamReader(...
rechTextBox.Text=sr.ReadToEnd();
sr.Close();
//FileStream打开文件
FileStreamfs=newFileStream(@"c:
\a.txt",FileMode.Open);
byte[]bt=newbyte[fs.Length];
char[]ca=newchar[fa.Length];
fs.Read(bt,0,Convert.ToInt32(fs.Length));
Decoderdc=Encoding.UTF8.GetDecoder();
dc.GetChars(bt,0,bt.Length,ca,0);
StringBuildersb2=newStringBuilder();
for(inti=0;i { sb2.Append(ca[i]); } rechTextBox.Text=sb2.ToString(); fs.Close(); //写入文件 StreamWritersw=newStreamWriter(@"c: \a.txt") sw.Write(.....) sw.Close(); C#目录IO操作汇总2 (2009-03-1019: 22: 46) 转载 标签: f 杂谈 分类: 布恩.NET 问题8: 如何使用通配符搜索指定目录内的所有文件; 解决方案: 使用DirectoryInfo.GetFiles方法的重载版本,它可以接受一个过滤表达式,返回FileInfo数组,另外它的参数还可以指定是否对子目录进行查找。 如: dir.GetFiles("*.txt",SearchOption.AllDirectories); 问题9: 如何复制、移动、重命名、删除文件和目录; 解决方案: 使用FileInfo和DirectoryInfo类。 下面是FileInfo类的相关方法: FileInfo.CopyTo: 将现有文件复制到新文件,其重载版本还允许覆盖已存在文件; FileInfo.MoveTo: 将指定文件移到新位置,并提供指定新文件名的选项,所以可以用来重命名文件(而不改变位置);FileInfo.Delete: 永久删除文件,如果文件不存在,则不执行任何操作; FileInfo.Replace: 使用当前FileInfo对象对应文件的内容替换目标文件,而且指定另一个文件名作为被替换文件的备份,微软考虑实在周到。 下面是DirectoryInfo类的相关方法: DirectoryInfo.Create: 创建指定目录,如果指定路径中有多级目录不存在,该方法会一一创建; DirectoryI
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- io 学习