c#进行文件读写.docx

上传人:b****5 文档编号:3525684 上传时间:2022-11-23 格式:DOCX 页数:11 大小:21.61KB
下载 相关 举报
c#进行文件读写.docx_第1页
第1页 / 共11页
c#进行文件读写.docx_第2页
第2页 / 共11页
c#进行文件读写.docx_第3页
第3页 / 共11页
c#进行文件读写.docx_第4页
第4页 / 共11页
c#进行文件读写.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

c#进行文件读写.docx

《c#进行文件读写.docx》由会员分享,可在线阅读,更多相关《c#进行文件读写.docx(11页珍藏版)》请在冰豆网上搜索。

c#进行文件读写.docx

c#进行文件读写

写文件

 StreamWritersw=newStreamWriter(fileName);

 sw.Write(textBox1.Text);

 sw.Close();

读文件

 StreamReadersr=newStreamReader(fileName);

 textBox1.Text=sw.ReadToEnd();

 sr.Close();

StreamReader和StreamWriter是专门针对文本文件的读写器。

对于二进制文件可以考虑使用BinaryReader和BinaryWriter,不过他们的构造函数要传入一个FileStream

FileStreamfs=File.Open(fileName);

BinaryReaderbr=newBinaryReader(fs);

BinaryWriterbw=newBinaryWriter(fs);

另:

需要引用System.IO命名空间

 

1.你可以直接用File.Move()方法或者FileInfo的MoveTo()方法直接移动文件

System.IO操作try

{

//CreateaninstanceofStreamReadertoreadfromafile.

//TheusingstatementalsoclosestheStreamReader.

using(StreamReadersr=newStreamReader("TestFile.txt"))

{

Stringline;

//Readanddisplaylinesfromthefileuntiltheendof

//thefileisreached.

while((line=sr.ReadLine())!

=null)

{

Console.WriteLine(line);

}

}

}

catch(Exceptione)

{

//Lettheuserknowwhatwentwrong.

Console.WriteLine("Thefilecouldnotberead:

");

Console.WriteLine(e.Message);

}

读:

TextBox1.Text=File.ReadAllText("d:

/b.txt",Encoding.Default); 

写:

File.WriteAllText("d:

/a.txt",TextBox1.Text,Encoding.Default);

追加:

File.AppendAllText("d:

/a.txt",TextBox1.Text,Encoding.Default);

 

//写文件

StreamWritersw=newStreamWriter(fileName);

sw.Write(textBox1.Text);

sw.Close();

//读文件

StreamReadersr=newStreamReader(fileName);

textBox1.Text=sw.ReadToEnd();

sr.Close();

//StreamReader和StreamWriter是专门针对文本文件的读写器。

//对于二进制文件可以考虑使用BinaryReader和BinaryWriter,不过他们的构造函数要传入一个FileStream

FileStreamfs=File.Open(fileName);

BinaryReaderbr=newBinaryReader(fs);

BinaryWriterbw=newBinaryWriter(fs);

用C#读写文本文件

 理论上,可以使用FileStream类读取和显示文本文件。

前面已经介绍了这个类。

上面显示NewFile.txt文件的格式不太容易理解,但这并不是FileStream类的问题——而在于我们在文本框中显示结果所使用的方式。

    

    如果知道某个文件包含文本,通常就可以使用StreamReader和StreamWriter类更方便地读写它们。

这是因为这些类工作的级别比较高,特别适合于读写文本。

它们执行的方法可以根据流的内容,自动检测出停止读取文本较方便的位置,特别是:

    ●这些类执行的方法可以一次读写一行文本(StreamReader.ReadLine()和StreamWriter.WriteLine())。

在读取文件时,流会自动确定下一个回车符的位置,并在该处停止读取。

在写入文件时,流会自动把回车符和换行符添加到文本的末尾。

    

    ●使用StreamReader和StreamWriter类,就不需要担心文件中使用的编码方式(文本格式)了。

可能的编码方式是ASCII(一个字节表示一个字符)或者基于Unicode的格式,UNICODE、UTF7和UTF8.Windows9x系统上的文本文件总是ASCII格式,因为Windows9x系统不支持Unicode,但WindowsNT、2000、XP和2003都支持Unicode,所以文本文件除了包含ASCII数据之外,理论上可以包含Unicode、UTF7或UTF8数据。

其约定是:

如果文件是ASCII格式,就只包含文本。

如果是Unicode格式,就用文件的前两个或三个字节来表示,这几个字节可以设置为表示文件中格式的值的特定组合。

    

    这些字节称为字节码标记。

在使用标准Windows应用程序打开一个文件时,例如Notepad或WordPad,不需要考虑这个问题,因为这些应用程序都支持不同的编码方法,会自动正确地读取文件。

StreamReader类也是这样,它可以正确读取任何格式的文件,而StreamWriter类可以使用任何一种编码技术格式化它要写入的文本。

另一方面,如果要使用FileStream类读取和显示文本文件,就不必自己处理这个过程了。

    1.StreamReader类

    StreamReader用于读取文本文件。

用某些方式构造一个StreamReader要比构造一个FileStream实例更简单,因为使用StreamReader时不需要FileStream的一些选项。

特别是不需要模式和访问类型,因为StreamReader只能执行读取操作。

除此以外,没有指定共享许可的直接选项,但StreamReader有两个新选项:

    ●需要指定不同的编码方法所执行的不同操作。

可以构造一个StreamReader检查文件开头的字节码标记,确定编码方法,或者告诉StreamReader该文件使用某个编码方法。

    ●不提供要读取的文件名,而为另一个流提供引用。

    最后一个选项需要解释一下,因为它涉及到把读写数据的模型建立在流概念上的另一个优点。

StreamReader工作在相对比较高的级别上,如果有另一个流在读取其他源的数据,就要使用由StreamReader提供的工具来处理这个流,因为这个流包含文本,此时StreamReader就非常有用了。

可以把这个流的输出传送到

    StreamReader上,这样,StreamReader就可以读取和处理任何数据源(不仅仅是文件)中的数据了。

前面在讨论BinaryReader类时也讨论了这种情况。

但在本书中,只使用StreamReader来直接连接文件。

    其结果是StreamReader有非常多的构造函数。

而且,还有两个返回StreamReader引用的FileInfo方法:

OpenText()和CreateText()。

下面仅说明其中一些构造函数。

    最简单的构造函数只带一个文件名参数。

StreamReader会检查字节码标记,确定编码方法:

    StreamReadersr=newStreamReader(@"C:

"MyDocuments"ReadMe.txt");

    另外,如果指定UTF8编码方法:

    StreamReadersr=newStreamReader(@"C:

"MyDocuments"ReadMe.txt",

    Encoding.UTF8);

    使用类System.Text.Encoding上的几个属性之一,就可以指定编码方法。

    这个类是一个抽象基类,可以根据这个类定义许多类,其方法可执行实际的文本编码。

每个属性都返回相应类的一个实例,可以使用的属性包括:

    ●ASCII

    ●Unicode

    ●UTF7

    ●UTF8

    ●BigEndianUnicode

    下面的示例解释了如何把StreamReader关联到FileStream上。

其优点是可以显式指定是否创建文件和共享许可,如果直接把StreamReader关联到文件上,就不能这么做:

    FileStreamfs=newFileStream(@"C:

"MyDocuments"ReadMe.txt",

    FileMode.Open,FileAccess.Read,FileShare.None);

    StreamReadersr=newStreamReader(fs);

    对于本例,指定StreamReader查找字节码标记,以确定使用了什么编码方法,以后的示例也是这样,从一个FileInfo实例中获得StreamReader:

    FileInfomyFile=newFileInfo(@"C:

"MyDocuments"ReadMe.txt");

    StreamReadersr=myFile.OpenText();

    与FileStream一样,应在使用后关闭StreamReader。

如果没有这样做,就会致使文件一直锁定,因此不能执行其他过程(除非使用FileStream构造StreamReader和特定的FileShare.ShareReadWrite):

    sr.Close();

    介绍完实例化StreamReader后,就可以用该实例作一些工作了。

与FileStream一样,我们仅指出可以用于读取数据的许多方式,您应在SDK文档说明书中查阅其他不太常用的StreamReader方法。

    所使用的最简单的方式是ReadLine(),该方法一次读取一行,但返回的字符串中不包括标记该行结束的回车换行符:

    stringnextLine=sr.ReadLine();

    另外,还可以在一个字符串中提取文件的所有剩余内容(严格地说,是流的全部剩余内容):

    stringrestOfStream=sr.ReadToEnd();

    可以只读取一个字符:

    intnextChar=sr.Read();

    Read()的重载方法可以把返回的字符转换为一个整数,如果到达流的尾端,就返回-1。

    最后,可以用一个偏移值,把给定个数的字符读到数组中:

    //toread100charactersin.

    intnChars=100;

    char[]charArray=newchar[nChars];

    intnCharsRead=sr.Read(charArray,0,nChars);

    如果要求读取的字符数多于文件中剩余的字符数,nCharsRead应小于nChars。

    2.StreamWriter类

    StreamWriter类的工作方式与StreamReader的类似,但StreamWriter只能用于写入文件(或另一个流)。

构造StreamWriter的方法包括:

    StreamWritersw=newStreamWriter(@"C:

"MyDocuments"ReadMe.txt");

    上面的代码使用了UTF8编码方法,.NET把这种编码方法设置为默认的编码方法。

如果要指定其他的编码方法:

    StreamWritersw=newStreamWriter(@"C:

"MyDocuments"ReadMe.txt",true,

    Encoding.ASCII);

    在这个构造函数中,第二个参数是Boolean型,表示文件是否应以追加方式打开。

构造函数的参数不能仅是一个文件名和一个编码类。

    当然,可以把StreamWriter关联到一个文件流上,以获得打开文件的更多控制选项:

    FileStreamfs=newFileStream(@"C:

"MyDocuments"ReadMe.txt",

    FileMode.CreateNew,FileAccess.Write,FileShare.Read);

    StreamWritersw=newStreamWriter(fs);

    FileInfo不执行返回StreamWriter的任何方法。

    另外,如果要创建一个新文件,并开始给它写入数据,可以使用下面的代码:

    FileInfomyFile=newFileInfo(@"C:

"MyDocuments"NewFile.txt");

    StreamWritersw=myFile.CreateText();

    与其他流类一样,在使用完后,要关闭StreamWriter:

    sw.Close();

    写入流可以使用StreamWriter.Write()的4个重载方法来完成。

最简单的方式是写入一个流,后面加上一个回车换行符:

    stringnextLine="GroovyLine";

    sw.Write(nextLine);

    也可以写入一个字符:

    charnextChar=~a~;

    sw.Write(nextChar);

    也可以写入一个字符数组:

    char[]charArray=newchar[100];

    //initializethesecharacters

    sw.Write(charArray);

    甚至可以写入字符数组的一部分:

    intnCharsToWrite=50;

    intstartAtLocation=25;

    char[]charArray=newchar[100];

    //initializethesecharacters

    sw.Write(charArray,startAtLocation,nCharsToWrite);

    3.ReadWriteText示例

    ReadWriteText示例说明了StreamReader和StreamWriter类的用法。

它非常类似于前面的ReadBinaryFile示例,但假定要读取的文件是一个文

    文件,并显示其内容。

它还可以保存文件(包括在文本框中对文本进行的修改)。

它将以Unicode格式保存文件。

    

    图30-9所示的ReadWriteText用于显示前面的NewFile.aspx文件。

但这次读取内容会更容易一些。

    这里不打算介绍给打开文件对话框添加事件处理程序的详细内容,因为它们基本上与前面的BinaryFileReader示例相同。

与这个示例相同,打开一个新文件,将调用DisplayFile()方法。

其惟一的区别是DisplayFile的执行方式,本例有一个保存文件的选项。

这由另一个菜单项save来表示,这个选项的处理程序调用我们添加到代码中的另一个方法SaveFile()(注意,这个新文件总是重写原来的文件——这个示例没有写入另一个文件的选项)。

    图30-9首先看看SaveFile(),因为它是最简单的一个函数。

首先利用StreamReader.

    

WriteLine()方法把文本框中的每行文本依次写入StreamWriter流,并在每行文本的最后加上回车换行符:

    voidSaveFile()

    {

    StreamWritersw=newStreamWriter(chosenFile,false,

    Encoding.Unicode);

    foreach(stringlineintextBoxContents.Lines)

    sw.WriteLine(line);

    sw.Close();

    }

    chosenFile是主窗体的一个字符串字段,它包含已经读取的文件的名称(与前面的示例一样)。

注意在打开流时指定Unicode编码方式。

如果要以其他格式写入文件,则只需要改变该参数的值。

如果要把文本追加到文件中,这个构造函数的第二个参数就设置为true,但本例不是这样。

在构造时必须为StreamWriter设置编码方式,可以使用只读属性Encoding。

    下面介绍文件的读取方式。

读取过程比较复杂,因为我们不知道要读取的文件中包含多少行文本(换言之,文件中包含多少个(char)13–(char)10序列,因为char(13)–char(10)是行末的回车换行符)。

解决这个问题的方式是,先把文件读入一个StringCollection类的实例,该类在System.Collections.Specialized命名空间中,主要用于保存可动态扩展的一组字符串。

它的两个方法是我们感兴趣的:

把字符串添加到集合中的Add()和把字符串集合复制到一个数组(一个System.Array实例)中的CopyTo()。

StringCollection对象的每个元素包含文件中的一行文本。

    DisplayFile()方法调用另一个方法ReadFileIntoStringCollection(),来读取文件。

之后,就知道文件中有多少行文本了。

把StringCollection复制到大小固定的数组中,并把数组中的内容填充到文本框中。

在进行复制时,只复制了字符串的引用,没有复制字符串本身,所以该过程的执行效率很高:

    voidDisplayFile()

    {

    StringCollectionlinesCollection=ReadFileIntoStringCollection();

    string[]linesArray=newstring[linesCollection.Count];

    linesCollection.CopyTo(linesArray,0);

    this.textBoxContents.Lines=linesArray;

    }

    StringCollection.CopyTo()的第二个参数表示目标数组中的下标,我们从该下标指定的位置开始复制集合。

    下面看看ReadFileIntoStringCollection()方法。

使用StreamReader读取每一行文本。

编译时需要计算读取的字符数,以确保不超出文本框的

    范围:

    StringCollectionReadFileIntoStringCollection()

    {

    constintMaxBytes=65536;

    StreamReadersr=newStreamReader(chosenFile);

    StringCollectionresult=newStringCollection();

    intnBytesRead=0;

    stringnextLine;

    while((nextLine=sr.ReadLine())!

=null)

    {

    nBytesRead+=nextLine.Length;

    if(nBytesRead>MaxBytes)

    break;

    result.Add(nextLine);

    }

    sr.Close();

    returnresult;

    }

    这就是该示例的完整代码。

    如果运行ReadWriteText,读取NewFile.aspx文件,然后保存它,该文件的格式就是Unicode。

任何常用的Windows应用程序(Notepand,Wordpad)都没有提供这种格式,甚至ReadWriteText示例也只能在WindowsNT/2000/XP/2003下正确读取和显示文件。

因为Windows9x不支持Unicode,像Notepad这样的应用程序不能识别其他平台上的Unicode文件(如果从WroxPress网站上下载了这个示例,就可以试试)。

但是,如果使用前面的ReadBinaryFile示例显示文件,就会立即看出它们的区别,如图30-10所示。

最前面的两个字节表示文件的格式是Unicode,之后,每个字符都用两个字节来表示。

这是非常明显的,因为在这个文件中,每个字符的高位字节都是0,所以每隔一个字节就显示x00。

1、使用FileStream读写文件

 

文件头:

 

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Text;

usingSystem.IO;

 

读文件核心代码:

 

byte[]byData=newbyte[100];

char[]charData=newchar[1000];

try

{

FileStreamsFile=newFileStream("文件路径",FileMode.Open);

sFile.Seek(55,SeekOrigin.Begin);

sFile.Read(byData,0,100);//第一个参数是被传进来的字节数组,用以接受FileStream对象中的数据,第2个参数是字节数组中开始写入数据的位置,它通常是0,表示从数组的开端文件中向数组写数据,最后一个参数规定从文件读多少字符.

}

catch(IOExceptione)

{

Console.WriteLine("AnIOexceptionhasbeenthrown!

");

Console.WriteLine(e.ToString());

Console.ReadLine();

return;

}

Decoderd=Encoding.UTF8.GetDecoder();

d.GetChars(byData,0,byD

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 其它模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1