100165772.htm

来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 620 行 · 第 1/3 页

HTM
620
字号
FileStream fs3 = new FileStream(@&quot;C:\C# Projects\Project3.doc&quot;, </span></p>

<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
FileMode.Create, FileAccess.Write, FileShare.None);</span></p>

<p class=MsoNormal><span style='font-family:宋体'>从这段代码中可以看出,构造函数的这些重载方法会把</span><span
lang=EN-US>FileAccess.ReadWrite </span><span style='font-family:宋体'>和</span> <span lang=EN-US>FileShare.Read</span><span style='font-family:宋体'>的默认值作为第</span><span
lang=EN-US>3</span><span style='font-family:宋体'>、</span><span lang=EN-US>4</span><span
style='font-family:宋体'>个参数,也可以以多种方式从</span><span lang=EN-US>FileInfo</span><span
style='font-family:宋体'>实例中创建一个文件流:</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><a
FTEL=FileInfo3><span lang=EN-US>&nbsp;&nbsp; FileInfo myFile4 = new
FileInfo(@&quot;C:\C# Projects\Project4.doc&quot;);</span></a></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
FileStream fs4 = myFile4.OpenRead();</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
FileInfo myFile5= new FileInfo(@&quot;C:\C# Projects\Project5doc&quot;);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
FileStream fs5 = myFile5.OpenWrite();</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
FileInfo myFile6= new FileInfo(@&quot;C:\C# Projects\Project6doc&quot;);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
FileStream fs6 = myFile6.Open(FileMode.Append, FileAccess.Write, </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
FileShare.None);</span><span class=MsoCommentReference><span lang=EN-US
style='font-size:8.0pt;font-family:"Baskerville BE Regular";display:none;
letter-spacing:.2pt'> </span></span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
FileInfo myFile7 = new FileInfo(@&quot;C:\C# Projects\Project7.doc&quot;);</span></p>

<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
FileStream fs7 = myFile7.Create();</span></p>

<p class=MsoNormal><span lang=EN-US>FileInfo.OpenRead()</span><span
style='font-family:宋体'>提供的流只能读取现有的文件,而</span><span lang=EN-US>FileInfo
().OpenWrite()</span><span style='font-family:宋体'>可以进行读写访问。</span><span lang=EN-US>FileInfo.Open()</span><span style='font-family:宋体'>允许显式指定模式、访问方式和文件共享参数。</span></p>

<p class=MsoNormal><span style='font-family:宋体'>使用完一个流后,就应关闭它:</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
fs.Close();</span></p>

<p class=MsoNormal><span style='font-family:宋体'>关闭流会释放与它相关的资源,允许其他应用程序为同一个文件设置流。在打开和关闭流之间,可以读写其中的数据。</span><span
lang=EN-US>FileStream</span><span style='font-family:宋体'>有许多方法可以进行这样的读写。</span></p>

<p class=MsoNormal><a FTEL=FileStreammethods></a><a FTEL=ReadByte><span
lang=EN-US>ReadByte()</span></a><span style='font-family:宋体'>是读取数据的最简单的方式,它从流中读取一个字节,把结果转换为一个</span><span
lang=EN-US>0~255</span><span style='font-family:宋体'>之间的一个整数。如果到达该流的末尾,就返回–</span><span
lang=EN-US>1</span><span style='font-family:宋体'>:</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp; int
NextByte = fs.ReadByte();</span></p>

<p class=MsoNormal><span style='font-family:宋体'>如果喜欢一次读取多个字节,可以调用</span><span lang=EN-US>Read()</span><span style='font-family:宋体'>方法,它可以把特定数量的字节读入到一个数组中。</span><span
lang=EN-US>Read()</span><span style='font-family:宋体'>方法返回实际读取的字节数<span
style='letter-spacing:-1.0pt'>——</span></span><span style='letter-spacing:-1.0pt'>
</span><span style='font-family:宋体'>如果这个值是</span><span lang=EN-US>0</span><span
style='font-family:宋体'>,就表示到达了流的尾端。下面是读入</span><span lang=EN-US>Byte</span><span
style='font-family:宋体'>数组</span><span lang=EN-US>ByteArray</span><span
style='font-family:宋体'>的一个示例:</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><a FTEL=Read><span lang=EN-US>&nbsp;&nbsp;
int nBytesRead = fs.Read(ByteArray, 0, nBytes);</span></a></p>

<p class=MsoNormal><span lang=EN-US>Read()</span><span style='font-family:宋体'>的第二个参数是一个偏移值,使用它可以要求</span><span
lang=EN-US>Read</span><span style='font-family:宋体'>读取的数据从数组的某个元素开始填充,而不是从第一个元素开始。第三个参数是要读入数字的字节数。</span></p>

<p class=MsoNormal><span style='font-family:宋体'>如果要给文件写入数据,可以使用两个并行方法</span><span lang=EN-US>WriteByte() </span><span style='font-family:宋体'>和</span> <span lang=EN-US>Write()</span><span style='font-family:宋体'>。</span><span lang=EN-US>WriteByte()</span><span
style='font-family:宋体'>方法把一个字节写入流:</span></p>

<p class=2 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><a FTEL=Write></a><a
FTEL=WriteByte><span lang=EN-US>&nbsp;&nbsp; byte NextByte = 100;</span></a></p>

<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
fs.WriteByte(NextByte);</span></p>

<p class=MsoNormal style='FTEL:8.15pt'><span style='font-family:宋体'>另外,</span><span
lang=EN-US>Write()</span><span style='font-family:宋体'>则写入一个字节数组。例如,如果用一些值初始化前面的</span><span
lang=EN-US>ByteArray</span><span style='font-family:宋体'>,就可以使用下面的代码写入数组的前</span><span
lang=EN-US>nBytes </span><span style='font-family:宋体'>个字节:</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
fs.Write(ByteArray, 0, nBytes);</span></p>

<p class=MsoNormal><span style='font-family:宋体'>与</span><span lang=EN-US>Read()</span><span
style='font-family:宋体'>一样,第二个参数可以从数组的某个元素开始写入,而不是从第一个元素开始。</span><span
lang=EN-US>WriteByte() </span><span style='font-family:宋体'>和</span><span
lang=EN-US> Write()</span><span style='font-family:宋体'>都没有返回值。</span></p>

<p class=MsoNormal><span style='font-family:宋体'>除了这些方法以外,</span><span
lang=EN-US>FileStream</span><span style='font-family:宋体'>还有其他方法和属性可以处理簿记任务,例如确定流中有多少字节,锁定流或刷新缓冲区等。其他方法通常不是基本读写数据所必须的,如果您需要使用它们,可以参阅</span><span
lang=EN-US>SDK</span><span style='font-family:宋体'>文档说明书。</span></p>

<h4 style='FTEL:21.45pt'><span lang=EN-US>2. BinaryFileReader</span><span
style='font-family:黑体'>示例</span></h4>

<p class=MsoNormal><span style='font-family:宋体'>下面编写一个示例</span><span
lang=EN-US>BinaryFileReader</span><span style='font-family:宋体'>说明</span><span
lang=EN-US>FileStream</span><span style='font-family:宋体'>类的用法。这个示例可以读取和显示任何文件。在</span><span
lang=EN-US>Visual Studio .NET</span><span style='font-family:宋体'>中创建一个</span><span
lang=EN-US>Windows</span><span style='font-family:宋体'>应用程序,添加一个菜单项,它可以打开一个标准的</span><span
lang=EN-US>OpenFileDialog</span><span style='font-family:宋体'>,要求用户指定要读取的文件,然后把该文件显示为二进制码。在读取二进制文件时,需要显示非打印</span><span
lang=EN-US>(non-printable)</span><span style='font-family:宋体'>字符。此时可以在多行文本框中逐个显示文件中的每个字节,每行显示</span><span
lang=EN-US>16</span><span style='font-family:宋体'>个字节。如果字节表示一个可显示的</span><span
lang=EN-US>ASCII</span><span style='font-family:宋体'>字符,就显示该字符,否则就以</span><span
lang=EN-US>16</span><span style='font-family:宋体'>进制的格式显示该字节的值。在这两种情况下,显示的文本之间都用空格隔开,这样每个显示的字节都占用</span><span
lang=EN-US>4</span><span style='font-family:宋体'>列,显得它们的排列非常整齐。</span></p>

<p class=MsoNormal><span style='font-family:宋体'>图</span><span lang=EN-US>30-8</span><span
style='font-family:宋体'>是</span><span lang=EN-US>BinaryFileReader</span><span
style='font-family:宋体'>应用程序查看文本文件时所显示的情况</span><span lang=EN-US>(</span><span
style='font-family:宋体'>因为</span><span lang=EN-US>BinaryFileReader</span><span
style='font-family:宋体'>可以查看任何文件,所以可以在文本文件和二进制文件中使用它</span><span lang=EN-US>)</span><span
style='font-family:宋体'>。本示例读取一个基本的</span><span lang=EN-US>ASP.NET</span><span
style='font-family:宋体'>页面</span><span lang=EN-US>(.aspx)</span><span
style='font-family:宋体'>。</span></p>

<p align=center><span lang=EN-US><img width=369 height=242
src="30/image009.jpg"></span></p>

<p align=center style='FTEL:8.15pt'><span style='font-family:宋体'>图</span><span
lang=EN-US>&nbsp; 30-8</span></p>

<p class=MsoNormal><span style='font-family:宋体'>显然,这个格式更适合于查看单个字节的值,而不是显示文本。本章的后面会开发一个专门用于读取文本文件的示例<span
style='letter-spacing:-1.0pt'>——</span></span><span style='letter-spacing:-1.0pt'>
</span><span style='font-family:宋体'>然后就可以查看文件中的内容了。另一方面这个示例的优点是可以查看任何文件的内容。</span></p>

<p class=MsoNormal><span style='font-family:宋体'>这个示例没有说明如何写入文件。这是因为我们不希望把文本框中的内容转换为二进制流,增加程序的复杂性。在后面开发可读写文本文件的示例中,将介绍如何写入文件。</span></p>

<p class=MsoNormal><span style='font-family:宋体'>下面看看获得这些结果的代码。首先,需要一个额外的</span><span
lang=EN-US>using</span><span style='font-family:宋体'>语句,因为除了</span><span
lang=EN-US>System.IO</span><span style='font-family:宋体'>之外,这个示例还要使用</span><span
lang=EN-US>System.Text </span><span style='font-family:宋体'>命名空间中的</span><span
lang=EN-US>StringBuilder</span><span style='font-family:宋体'>类,以构造文本框中的字符串:</span></p>

<p class=a6 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>using System.IO;</span></p>

<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>using System.Text;</span></p>

<p class=MsoNormal><span style='font-family:宋体'>接着,给主窗体类添加两个字段,一个字段表示文件对话框,另一个是表示当前文件的路径的字符串:</span></p>

<p class=a6 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>&nbsp;&nbsp; public class Form1 : System.Windows.Forms.Form</span></p>

<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;
{</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private OpenFileDialog chooseOpenFileDialog = new OpenFileDialog();</span></p>

<p class=2 style='margin-top:0cm;margin-right:0cm;FTEL:8.15pt;
margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
private string chosenFile;</span></p>

<p class=MsoNormal><span style='font-family:宋体'>还需要添加一些标准的</span><span
lang=EN-US>Windows</span><span style='font-family:宋体'>窗体代码,来处理菜单和文件对话框的处理程序:</span></p>

<p class=a6 style='margin-top:8.15pt;margin-right:0cm;FTEL:0cm;
margin-left:21.45pt;FTEL:.0001pt;FTEL:18.45pt'><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public Form1()</span></p>

<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{</span></p>

<p class=a6 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
InitializeComponent();</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
menuFileOpen.Click += new EventHandler(OnFileOpen);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
chooseOpenFileDialog.FileOk += new </span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
CancelEventHandler(OnOpenFileDialogOK);</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
}</span></p>

<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
void OnFileOpen(object Sender, EventArgs e)</span></p>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?