100165772.htm
来自「C#高级编程(第三版),顶死你们。。 。up」· HTM 代码 · 共 620 行 · 第 1/3 页
HTM
620 行
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
chooseOpenFileDialog.ShowDialog();</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
void OnOpenFileDialogOK(object Sender, CancelEventArgs e)</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
chosenFile =
chooseOpenFileDialog.FileName;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
this.Text = Path.GetFileName(chosenFile);</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
DisplayFile();</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>
}</span></p>
<p class=MsoNormal><span style='font-family:宋体'>可以看出,用户单击</span><span
lang=EN-US>OK</span><span style='font-family:宋体'>,在文件对话框中选择一个文件后,就会调用方法</span><span
lang=EN-US>DisplayFile()</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> void DisplayFile()</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
int nCols = 16;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
FileStream inStream = new FileStream(chosenFile, FileMode.Open, </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
FileAccess.Read);</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
long nBytesToRead = inStream.Length;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
if (nBytesToRead > 65536/4) </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
nBytesToRead = 65536/4;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US> </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
int nLines = (int)(nBytesToRead/nCols) + 1;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
string [] lines = new string[nLines];</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
int nBytesRead = 0;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US> </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
for (int i=0 ; i<nLines ; i++)</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
StringBuilder nextLine = new StringBuilder();</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
nextLine.Capacity = 4*nCols;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US> </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
for (int j = 0 ; j<nCols ; j++)</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
{</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
int nextByte = inStream.ReadByte();</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
nBytesRead++;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
if (nextByte < 0 || nBytesRead > 65536)</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
break;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
char nextChar = (char)nextByte;</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
if (nextChar < 16)</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
nextLine.Append(" x0" + string.Format("{0,1:X}", </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
(int)nextChar));</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
else if </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
(char.IsLetterOrDigit(nextChar) || </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
char.IsPunctuation(nextChar))</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
nextLine.Append(" " + nextChar + " ");</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
else</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
nextLine.Append(" x" + string.Format("{0,2:X}", </span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
(int)nextChar));</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
lines[i] = nextLine.ToString();</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
}</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
inStream.Close();</span></p>
<p class=2 style='margin-left:21.45pt;FTEL:18.45pt'><span lang=EN-US>
this.textBoxContents.Lines = lines;</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>
}</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>65 536</span><span style='font-family:宋体'>个字符,但以我们选择的格式,文件中的每个字节可以显示</span><span
lang=EN-US>4</span><span style='font-family:宋体'>个字符,因此如果文件的字节数大于</span><span
lang=EN-US>65 536/4 = 16 384</span><span style='font-family:宋体'>,就需要覆盖一些已显示的字节。</span></p>
<p class=a3 style='margin-top:8.15pt;FTEL:21.45pt'><span
style='font-family:黑体'>注意:</span></p>
<p class=a1 style='FTEL:8.15pt;FTEL:21.45pt'><span
style='font-family:楷体_GB2312'>如果要在这种环境下显示较长的文件,就需要使用</span><span lang=EN-US>System.Windows.Forms</span><span
style='font-family:楷体_GB2312'>命名空间中的</span><span lang=EN-US> RichTextBox</span><span
style='font-family:楷体_GB2312'>类。</span><span lang=EN-US>RichTextBox</span><span
style='font-family:楷体_GB2312'>类似于文本框,但它有更高级的格式化功能,在显示的文本大小方面没有限制,此处使用</span><span
lang=EN-US>TextBox</span><span style='font-family:楷体_GB2312'>,是为了让示例比较简单,用户可以只考虑读取文件的过程。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>在该方法中,有相当多的部分是两个嵌套的循环,它们构造出每个要显示的文本行。我们使用</span><span
lang=EN-US>StringBuilder</span><span style='font-family:宋体'>类来构造每一文本行,其性能方面的原因是:可以把每个字节的合适文本追加到表示每行文本的字符串上。如果一行上有一个新字符串,并复制构造该行时的一半字符,则不仅要花很多时间分配字符串,还会浪费堆上的许多内存。注意,可显示的字符是指字母、字或标点符号,这与相关的静态方法</span><span
lang=EN-US>System.Char</span><span style='font-family:宋体'>指定的一样。值小于</span><span
lang=EN-US>16</span><span style='font-family:宋体'>的字符都不是可显示的字符,因此回车符</span><span
lang=EN-US>(13)</span><span style='font-family:宋体'>和换行符</span><span lang=EN-US>(10)</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></p>
<p class=MsoNormal><span style='font-family:宋体'>另外要注意的两点是:使用属性窗口,把文本框的字体改为固定宽度的字体——我们选择</span><span
lang=EN-US>Courier New 9pt</span><span style='font-family:宋体'>常规字体,并把文本框设置为有水平和垂直滚动条。</span></p>
<p class=MsoNormal><span style='font-family:宋体'>最后,选择流,把文本框的内容设置为已建立的字符串数组。</span></p>
</div>
<!-- page -->
<div class="page" style="text-align: center">
<a href="100165771.htm">上一页</a> <a href="index.html">首页</a> <a href="100165773.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='100165772.htm'><font color='red'>30.3.2 读写二进制文件</font></a></h1>
<div id="divRealteNod2" style="padding-left: 2px">
<div style='float:left;width:49%'>·<a href='100165769.htm'>30.2 移动、复制和删除文件</a></div><div style='float:right;width:49%'>·<a href='100165770.htm'>30.3 读写文件</a></div><div style='float:left;width:49%'>·<a href='100165771.htm'>30.3.1 流</a></div><div style='float:right;width:49%'>·<a href='100165773.htm'>30.3.3 读写文本文件</a></div><div style='float:left;width:49%'>·<a href='100165774.htm'>30.4 读写注册表</a></div><div style='float:right;width:49%'>·<a href='100165775.htm'>30.4.1 注册表</a></div></div>
</div>
</div>
</div>
</div>
</body>
</html>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?