100165773.htm

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

HTM
643
字号
<p class=MsoNormal><span style='font-family:宋体'>这里不打算介绍给打开文件对话框添加事件处理程序的详细内容,因为它们基本上与前面的</span><span
lang=EN-US>BinaryFileReader</span><span style='font-family:宋体'>示例相同。与这个示例相同,打开一个新文件,将调用</span><span
lang=EN-US>DisplayFile()</span><span style='font-family:宋体'>方法。其惟一的区别是</span><span
lang=EN-US>DisplayFile</span><span style='font-family:宋体'>的执行方式,本例有一个保存文件的选项。这由另一个菜单项</span><span
lang=EN-US>save</span><span style='font-family:宋体'>来表示,这个选项的处理程序调用我们添加到代码中的另一个方法</span><span
lang=EN-US>SaveFile()(</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>)</span><span
style='font-family:宋体'>。</span></p>

<p align=center><span lang=EN-US><img width=209 height=217
src="30/image010.jpg"></span></p>

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

<p class=MsoNormal><span style='font-family:宋体'>首先看看</span><span lang=EN-US>SaveFile()</span><span
style='font-family:宋体'>,因为它是最简单的一个函数。首先利用</span><span lang=EN-US>StreamReader.WriteLine()</span><span
style='font-family:宋体'>方法把文本框中的每行文本依次写入</span><span lang=EN-US>StreamWriter</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'><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void SaveFile()</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;&nbsp;&nbsp;&nbsp;
StreamWriter sw = new StreamWriter(chosenFile, false, </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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
Encoding.Unicode);</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;
foreach (string line in textBoxContents.Lines)</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;
sw.WriteLine(line);</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;
sw.Close();</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;
}</span></p>

<p class=MsoNormal style='line-height:17.6pt'><span lang=EN-US>chosenFile</span><span
style='font-family:宋体'>是主窗体的一个字符串字段,它包含已经读取的文件的名称</span><span lang=EN-US>(</span><span
style='font-family:宋体'>与前面的示例一样</span><span lang=EN-US>)</span><span
style='font-family:宋体'>。注意在打开流时指定</span><span lang=EN-US>Unicode</span><span
style='font-family:宋体'>编码方式。如果要以其他格式写入文件,则只需要改变该参数的值。如果要把文本追加到文件中,这个构造函数的第二个参数就设置为</span><span
lang=EN-US>true</span><span style='font-family:宋体'>,但本例不是这样。在构造时必须为</span><span
lang=EN-US>StreamWriter</span><span style='font-family:宋体'>设置编码方式,可以使用只读属性</span><span
lang=EN-US>Encoding</span><span style='font-family:宋体'>。</span></p>

<p class=MsoNormal style='line-height:17.6pt'><span style='font-family:宋体'>下面介绍文件的读取方式。读取过程比较复杂,因为我们不知道要读取的文件中包含多少行文本</span><span
lang=EN-US>(</span><span style='font-family:宋体'>换言之,文件中包含多少个</span><span
lang=EN-US>(char)13 – (char)10</span><span style='font-family:宋体'>序列,因为</span><span
lang=EN-US>char(13) –char(10)</span><span style='font-family:宋体'>是行末的回车换行符</span><span
lang=EN-US>)</span><span style='font-family:宋体'>。解决这个问题的方式是,先把文件读入一个</span><span
lang=EN-US>StringCollection</span><span style='font-family:宋体'>类的实例,该类在</span><span
lang=EN-US>System.Collections.Specialized</span><span style='font-family:宋体'>命名空间中,主要用于保存可动态扩展的一组字符串。它的两个方法是我们感兴趣的:把字符串添加到集合中的</span><span
lang=EN-US>Add()</span><span style='font-family:宋体'>和把字符串集合复制到一个数组</span><span
lang=EN-US>(</span><span style='font-family:宋体'>一个</span><span lang=EN-US>System.Array</span><span
style='font-family:宋体'>实例</span><span lang=EN-US>)</span><span
style='font-family:宋体'>中的</span><span lang=EN-US>CopyTo()</span><span
style='font-family:宋体'>。</span><span lang=EN-US>StringCollection</span><span
style='font-family:宋体'>对象的每个元素包含文件中的一行文本。</span></p>

<p class=MsoNormal style='line-height:17.6pt'><a FTEL=StringCollection><span
lang=EN-US>DisplayFile()</span></a><span style='font-family:宋体'>方法调用另一个方法</span><span
lang=EN-US>ReadFileIntoStringCollection()</span><span style='font-family:宋体'>,来读取文件。之后,就知道文件中有多少行文本了。把</span><span
lang=EN-US>StringCollection</span><span style='font-family:宋体'>复制到大小固定的数组中,并把数组中的内容填充到文本框中。在进行复制时,只复制了字符串的引用,没有复制字符串本身,所以该过程的执行效率很高:</span></p>

<p class=MsoNormal style='line-height:17.6pt'><span lang=EN-US>&nbsp;</span></p>

<p class=2 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; void DisplayFile()</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;&nbsp;&nbsp;&nbsp;
StringCollection linesCollection = ReadFileIntoStringCollection();</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;
string [] linesArray = new string[linesCollection.Count];</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;
linesCollection.CopyTo(linesArray, 0);</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;
this.textBoxContents.Lines = linesArray;</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;
}</span></p>

<p class=MsoNormal style='line-height:17.6pt'><span
lang=EN-US>StringCollection.CopyTo()</span><span style='font-family:宋体'>的第二个参数表示目标数组中的下标,我们从该下标指定的位置开始复制集合。</span></p>

<p class=MsoNormal style='line-height:17.6pt'><span style='font-family:宋体'>下面看看</span><span
lang=EN-US>ReadFileIntoStringCollection()</span><span style='font-family:宋体'>方法。使用</span><span
lang=EN-US>StreamReader</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'><span
lang=EN-US>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StringCollection
ReadFileIntoStringCollection()</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;&nbsp;&nbsp;&nbsp;
const int MaxBytes = 65536;</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;
StreamReader sr = new StreamReader(chosenFile);</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;StringCollection result = new
StringCollection();</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;
int nBytesRead = 0;</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;
string nextLine;</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;
while ( (nextLine = sr.ReadLine()) != null)</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;
{</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;
nBytesRead += nextLine.Length;</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;
if (nBytesRead &gt; MaxBytes)</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;
break;</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;
result.Add(nextLine);</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;
}</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;
sr.Close();</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;
return result;</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;
}</span></p>

<p class=MsoNormal style='line-height:17.6pt'><span style='font-family:宋体'>这就是该示例的完整代码。</span></p>

<p class=MsoNormal style='line-height:17.6pt'><span style='font-family:宋体'>如果运行</span><span
lang=EN-US>ReadWriteText</span><span style='font-family:宋体'>,读取</span><span
lang=EN-US>NewFile.aspx</span><span style='font-family:宋体'>文件,然后保存它,该文件的格式就是</span><span
lang=EN-US>Unicode</span><span style='font-family:宋体'>。任何常用的</span><span
lang=EN-US>Windows</span><span style='font-family:宋体'>应用程序</span><span
lang=EN-US>(Notepand</span><span style='font-family:宋体'>,</span><span
lang=EN-US>Wordpad)</span><span style='font-family:宋体'>都没有提供这种格式,甚至</span><span
lang=EN-US>ReadWriteText</span><span style='font-family:宋体'>示例也只能在</span><span
lang=EN-US>Windows NT/2000/XP/2003</span><span style='font-family:宋体'>下正确读取和显示文件。因为</span><span
lang=EN-US>Windows 9x</span><span style='font-family:宋体'>不支持</span><span
lang=EN-US>Unicode</span><span style='font-family:宋体'>,像</span><span
lang=EN-US>Notepad</span><span style='font-family:宋体'>这样的应用程序不能识别其他平台上的</span><span
lang=EN-US>Unicode</span><span style='font-family:宋体'>文件</span><span
lang=EN-US>(</span><span style='font-family:宋体'>如果从</span><span lang=EN-US>Wrox
Press</span><span style='font-family:宋体'>网站上下载了这个示例,就可以试试</span><span
lang=EN-US>)</span><span style='font-family:宋体'>。但是,如果使用前面的</span><span
lang=EN-US>ReadBinaryFile</span><span style='font-family:宋体'>示例显示文件,就会立即看出它们的区别,如图</span><span
lang=EN-US>30-10</span><span style='font-family:宋体'>所示。最前面的两个字节表示文件的格式是</span><span
lang=EN-US>Unicode</span><span style='font-family:宋体'>,之后,每个字符都用两个字节来表示。这是非常明显的,因为在这个文件中,每个字符的高位字节都是</span><span
lang=EN-US>0</span><span style='font-family:宋体'>,所以每隔一个字节就显示</span><span
lang=EN-US>x00</span><span style='font-family:宋体'>。</span></p>

<p align=center><span lang=EN-US><img width=377 height=238
src="30/image011.jpg"></span></p>

<p align=center style='FTEL:0cm;FTEL:.0001pt'><span
style='font-family:宋体'>图</span><span lang=EN-US>&nbsp; 30-10</span></p>

</div>
                <!-- page -->
                <div class="page" style="text-align: center">
                    <a href="100165772.htm">上一页</a>&nbsp;&nbsp;&nbsp;<a href="index.html">首页</a>&nbsp;&nbsp;&nbsp;<a href="100165774.htm">下一页</a>
                </div>
                <div style="margin: 0px auto; width: 700px; border: solid 1px #0b5f98;">
                    <div style="float: left; width: 16px; background-color: #0b5f98; color: White; padding: 1px;">
                        图书导读
                    </div>
                    <div style="float: right; width: 670px; text-align: left; line-height: 16pt; padding-left: 2px">
                        <!--导读-->
                        <h1 id="divCurrentNode2" style="color: #b83507; width: 100%; text-align: left; font-size: 12px; padding-left: 2px">当前章节:<a href='100165773.htm'><font color='red'>30.3.3  读写文本文件</font></a></h1>
                        <div id="divRealteNod2" style="padding-left: 2px">
                        <div style='float:left;width:49%'>·<a href='100165770.htm'>30.3  读写文件</a></div><div style='float:right;width:49%'>·<a href='100165771.htm'>30.3.1  流</a></div><div style='float:left;width:49%'>·<a href='100165772.htm'>30.3.2  读写二进制文件</a></div><div style='float:right;width:49%'>·<a href='100165774.htm'>30.4  读写注册表</a></div><div style='float:left;width:49%'>·<a href='100165775.htm'>30.4.1  注册表</a></div><div style='float:right;width:49%'>·<a href='100165776.htm'>30.4.2  .NET注册表类</a></div></div>
                    </div>
                </div>
                </div>
        </div>
</body>
</html>

⌨️ 快捷键说明

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