ASP.NET创建文件并写入内容

ASP.NET创建文件并写入内容,第1张

在ASP NET中 文件处理的整个过程都是围绕着System IO 这个名称空间展开的 这个名称空间中具有执行文件读 写所需要的类 本文从最基本的 *** 作开始 解释在ASP NET中文件处理的概念 包括如从一个文件中读取内容 如何向一个文件中写入内容和如何删除一个文件 前面已经提到 要想在ASP NET 页面中进行文件处理 必须要有 System IO 名称空间 所以 第一步就是引入这个名称空间 <%@ Import Namespace= System IO %>下一步 就是创建一个文本文件 并将这个文本文件分配给一个流书写对象 这样就可以向文本文件中写入内容了 用以下一段代码来完成这个任务 writefile aspx<%@ Import Namespace= System IO %><%Response write( Writing the content into Text File in ASP NET<BR>) 声明流书写对象Dim strwriterobj As StreamWriter 创建文本文件 分配textfile对象strwriterobj= File CreateText( c:aspnet txt ) 写入内容strwriterobj WriteLine( Wele to wonderfull world of ASP NET Programming ) 完成樱悔 *** 作 关闭流对象strwriterobj CloseResponse write( Done with the creation of text file and writing content into it )%>这样就完成了!现在让我们继续进行下一个任务 从刚才创建的文本文件中读取内容 从文件中读取内容从文件中读取内容与向文件中写入内容大致相同 只是要注意一下下面的两件事 文件读取使用StreamReader类 当使用了Readline方法时 将要被读取的文本文件的结尾处会用一个空字符串( )来标记 现在开始编写代码从前面创建的aspnet txt 文件中读取内容 readfile aspx<%@ Import Namespace= System IO %><%Response write( Reading the content from the text file ASPNET TXT<br>) 创建流读取对象Dim streamreaderobj As StreamReader 声明变量 以存放从文件中读取的内容Dim filecont As String 打开文本文件 分配给流读乱判取对象streamreaderobj = File OpenText( c:aspnet txt ) 逐行读取文件内容Dofilecont = streamreaderobj ReadLine()Response Write( filecont &<br>)Loop Until filecont = 完成读取 *** 作后 关闭流读取对象streamreaderobj CloseResponse write( <br>Done with reading the content from the file aspnet txt )%>删除文件在ASP NET中删除文件也非常简单和直观 System IO名称空间中的 File (文件)类有一个Delete方法用来删除文件 它把文件名作为一个自变量来传递 以下代码就演示了在ASP NET中进行文件哗颂改删除的步骤 Filedelete aspx<%@ Import Namespace= System IO %><%File Delete( c:aspnet txt )Response write( The File aspnet is deleted successfully !!! )%>lishixinzhi/Article/program/ASP/201311/21860

DotNetNuke作为开源项目 很多地方为我们提供了优良的示范 得以一窥前人的智慧 前几日 因为研究一个DNN的BUG 对文件编码和文件编码相关方面的处理有一些认识

我们经常需要把一个Text文件(如XML SQL Script)上传到服务器 然后进行处理(如显示或者执行) 这里就涉及到文本文件编码的问题了

什么是文件编码?

首先我们来复习一下编码的基本概念 由于历史原因 Text文件存在ASCII Unicode UTF UTF 等等编码方式 对于中文 还有GB 对于Unicode还有Unicode Unicode 对于Unicode 又分为Unicode Little Endian Unicode Big Endian 要把所有的编码方式列举出来是相当的复杂 想仔细的研究一下各种编码的规则和由来可以参考一下这篇文章 编码 charset 乱码 unicode utf 与net简单释义 我们读取一个文散埋则本文件时 总是使用某一种编码方式去解码这个文本文件 如果我们使用的解码方式和文本文件本身的编码方式不一致 最后的结果就是得到一个乱码的文件

我可以不用关心这个麻烦的文件编码吗?

大致了解了什么是文件编码 我们来看看在DNN里为什么要和文件编码打交道 这么麻烦 我们不能绕开它吗?

在DNN里 人们可以制作液纯和上传皮肤 模块 语言包的 就拿模块包说吧 模块包里包含各种文本文件 比如定义模块的 dnn文件 数据库的SQL 脚本文件等等 因为DNN是一个开源软件 世界上任何一个地方的人群都可能使用它 所以这些文本文件可能以各种编码格式存储 你无法强制别人只用某一种格式来储存 我们只能侦测每一个遇到文本文件的编码方式 并做对应的解码

这里要强调的一点是 对于DNN 对文本文件的编码方式做了一些限制 那就是一定要使用带有BOM的Unicode格式 其它格式都一律按不支持处理 所以DNN的代码并不是一个彻底的解决方案 但事情总是取一个平衡 为 %的应用在多做 %的工作 有时候是没必要的

如何解决文件编码转换的问题?

回到我们的问题 对于一个上传到服务器的Text文件 我们要解决的问题就是 如何得知这个文件的编码方式 并用正确的方式解码 得到 文本文件中的内容

如何得知这个文件的编码方式?

首先我们来看看如何得知文本文件的编码方式 为了简化问题 我们只讨论Unicode编码这种形式(实际上DNN里也只针对Unicode做了处理) 对于其它各种编码的判别方式我们不做讨论

BOM

这里涉及到一个BOM(Byte Order Mark) 的概念 简单的讲 在Unicode标准中 为了标示文本文件的编码类型 可以在文本文件的开始插入几个特殊的byte 通过这几个特殊的byte 应用程序就可以鉴别文本文件使用的是那种编码了 那几个特殊的byte也被称之为BOM(参考 )

对于Unicode 几种编码的BOM如下

UTF big endian 文件的前 个byte是 FE FF

UTF little endian文件的前 个byte是 FF FE

UTF big endian文件的前 个byte是 FE FF

UTF little endian文件的前 个byte是 FF FE

UTF 文件的前 个byte是 EF BB BF

UTF 的规律特殊一点 不是前几个byte 而是所有的byte转换为十进制都小于

判定文件编码方式

知道了这一点 你也应该能想到如何判定一个文本文件的编码方式了吧 读取文件的前面几个字节 跟上面的表对比 就可以知道这个文冲棚件使用的哪一种编码了

看看DNN的代码 这个函数在DotNetNuke Modules Admin ResourceInstaller命名空间下的PaFile类里

GetTextEncodingType         Private Function GetTextEncodingType()Function GetTextEncodingType(ByVal Buffer As Byte()) As PaTextEncoding         UTF = No byte higher than          UTF = first three bytes EF BB BF         UTF BigEndian = first o bytes FE FF         UTF LittleEndian = first o bytes FF FE         Lets do the easy ones first         If Buffer( ) = And Buffer( ) = Then         Return PaTextEncoding UTF LittleEndian         End If         If Buffer( ) = And Buffer( ) = Then         Return PaTextEncoding UTF BigEndian         End If         If Buffer( ) = And Buffer( ) = And Buffer( ) = Then         Return PaTextEncoding UTF          End If         This does a simple test to verify that there are no bytes with a value larger than          which would be invalid in UTF encoding         Dim i As Integer         For i = To          If Buffer(i) >Then         Return PaTextEncoding Unknown         End If         Next         Return PaTextEncoding UTF

End Function

代码很好懂 PaTextEncoding是一个枚举类型 枚举各种编码格式 唯一要注意的就是对于UTF 编码 采用了一种比较简单的判定方式——只检查了前 个byte是否小于

System Text

知道了编码方式 接下来的工作就是解码了 这里我们要用到 Net的System Text命名空间下的一些类          Encoding        UnicodeEncoding        ASCIIEncoding        UTF Encoding        UTF Encoding        UTF Encoding

等等

Encoding是基类 UnicodeEncoding ASCIIEncoding UTF Encoding UTF Encoding UTF Encoding等类继承自Encoding类 专门用来处理各种编码

使用Encoding Convert (Encoding Encoding Byte[])方法 可以把字节数组从一种编码的转换为另一种编码

使用GetString(Byte[])方法 比如UTF Encoding GetString(Byte[])就可以把UTF 编码得到字节数组还原成一个String

复习了Sytem Text下关于编码转换的一些类 回到我们的问题 你也许已经在想 判断完文件编码的类型后 只需要调用相应的GetString()函数就可以解码了 如下

          PaTextEncoding EncodingType = GetTextEncodingType(Buffer)         string DecodedString =          switch (EncodingType)         {         case PaTextEncoding UTF LittleEndian:         DecodedString = System Text Encoding Unicode GetString(buffer)         break         case PaTextEncoding UTF BigEndian:         DecodedString = System Text Encoding BigEndianUnicode GetString(buffer)         break         case PaTextEncoding UTF :         DecodedString = System Text Encoding UTF GetString(buffer)         break         case PaTextEncoding UTF :         DecodedString = System Text Encoding UTF GetString(buffer)         break         case PaTextEncoding Unknown:         throw new Exception( Unkonw Encoding )         break         }

想法是没错的 但有一个小小的问题 之前我们提到过BOM 不同的编码文件前面几个字节会有不同的BOM标示 这几个字节唯一的作用就是指明编码类型 在解码时应该去掉这几个字节 但问题是 GetString()函数不会自动去掉这几个字节 如果直接把所有的字节数组传给GetString()函数 因为BOM的影响 解码得到的字符串前面几个字是乱码

DNN里用了一个比较巧妙的办法 首先侦测字节数组的编码方式 之后把所有的字节数组都转换为ASCII编码方式的字节数组 最后通过ASCIIEncoding的GetString()函数得到字符串 因为BOM的影响 转换得到的ASCII字符串前面会有一些 ? 字符 查找这些字符并去掉即可 代码如下

这一部分代码在DNN的DotNetNuke Modules Admin ResourceInstaller命名空间下的PaDnnInstallerBase类里

GetAsciiString()函数实现转换为ASCII编码 并解码为String           Protected Function GetAsciiString()Function GetAsciiString(ByVal Buffer As Byte() ByVal SourceEncoding As Encoding) As String         Create o different encodings          Dim TargetEncoding As Encoding = Encoding ASCII         Perform the conversion from one encoding to the other          Dim asciiBytes As Byte() = Encoding Convert(SourceEncoding TargetEncoding Buffer)         Convert the new byte[] into an ascii string          Dim asciiString As String = System Text Encoding ASCII GetString(asciiBytes)         Return asciiString         End Function

根据不同的编码方式 传入不同的参数           Dim strScript As String =          Select Case sqlFile Encoding         Case PaTextEncoding UTF LittleEndian         strScript = GetAsciiString(sqlFile Buffer System Text Encoding Unicode) System Text Encoding Unicode GetString(sqlFile Buffer)         Case PaTextEncoding UTF BigEndian         strScript = GetAsciiString(sqlFile Buffer System Text Encoding BigEndianUnicode) System Text Encoding BigEndianUnicode GetString(sqlFile Buffer)         Case PaTextEncoding UTF          strScript = GetAsciiString(sqlFile Buffer System Text Encoding UTF ) System Text Encoding UTF GetString(sqlFile Buffer)         Case PaTextEncoding UTF          strScript = GetAsciiString(sqlFile Buffer System Text Encoding UTF ) System Text Encoding UTF GetString(sqlFile Buffer)         Case PaTextEncoding Unknown         Throw New Exception(String Format(SQL_UnknownFile sqlFile Name))         End Select         This check needs to be included because the unicode Byte Order mark results in an extra character at the start of the file         The extra character ? causes an error with the database          If strScript StartsWith( ? ) Then         strScript = strScript Substring( )         End If

最后的一点问题

DNN里这种避免BOM影响解码的方法有一个问题 那就是它把所有的文件都转为ASCII编码 而ASCII编码是不支持双字节的 也就是说如果文件中包含中文 中文在解码后就成为乱码了 具体现象可以参考这个文章 SQL SERVER EXPRESS与出现中文变成问号的奇怪问题 很可能不是通常的utf 编码问题

lishixinzhi/Article/program/ASP/201311/21682

就罩御是一个动态网页的后台处理程序。ASP.net有核闷含3种开发模式,即html+ashx(一般处理程序),webform(.aspx),asp.net MVC。后两个都自改笑带后台(webform有cs文件,MVC有控制器),但是html是静态网页,如果要写后台如访问数据库的话就需要一般处理程序,这样就可以变成一个动态网页。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/8220047.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存