第八章 文件与流处理_第1页
第八章 文件与流处理_第2页
第八章 文件与流处理_第3页
第八章 文件与流处理_第4页
第八章 文件与流处理_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1第六章第六章 文件与流处理文件与流处理 文件系统操作文件系统操作 I/O I/O流处理流处理 邮件发送邮件发送26.1 6.1 文件与流处理文件与流处理文件系统操作文件系统操作3文件系统操作 在许多ASP.NET Web应用程序中,需要处理本地文件系统,读取目录结构,读写文件,或者执行某些与文件相关的操作。在.NET框架中,提供了System.IO命名空间用于处理与文件I/O相关的功能。在该命名空间中包含了许多类,使得文件系统中的目录与文件处理变得非常容易。 在使用System.IO命名空间中的类的时候,由于ASP.NET应用程序是在服务器上执行,因此它所访问的文件系统就是Web应用程序运行

2、的服务器上的文件系统。4文件系统操作 .NET框架提供了几个基本的类用于检索文件系统的信息。这些类都包含在System.IO命名空间中。这些类包括:Directory和File类:这两个类提供了一些静态方法可以检索服务器上的文件和目录。DriveInfo、DirectoryInfo和FileInfo:这些类使用类似的实例方法和属性检索相同的信息。 它们的主要区别在于使用DirectoryInfo或者FileInfo之前,必须先创建其对象实例,而Directory和File类的静态方法则是可以直接使用的。 5DriveInfo类 DriveInfo类是.NET 2.0中新增的类。该类增强了以前.

3、NET框架中Directory类中GetLogicalDrives()方法的功能。它可以检索所有注册在服务器上的本地文件系统。通过该类,可以获取每个驱动器的名称、类型、容量和状态等信息。6DriveInfo类的主要成员 成员名描述TotalSize获取驱动器上存储空间的总容量TotalFreeSpace获取驱动器上的可用空闲空间总量AvailableFreeSpace指示驱动器上的可用空闲空间量DriveFormat返回文件系统的名称DriveType返回驱动器类型IsReady返回值表明驱动器是否已准备好Name返回驱动器的名称VolumeLabel获取或设置驱动器的卷标7【例 6 1】 p

4、rotected void Page_Load (object sender, EventArgs e) DriveInfo drive = new System.IO.DriveInfo (C:); lblDriveName.Text = drive.Name; lblDriveType.Text = drive.DriveType.ToString (); lblAvailableFreeSpace.Text = drive.AvailableFreeSpace.ToString (); lblDriveFormat.Text = drive.DriveFormat; lblTotalFr

5、eeSpace.Text = drive.TotalFreeSpace.ToString (); lblTotalSize.Text = drive.TotalSize.ToString (); lblVolumeLabel.Text = drive.VolumeLabel; 8【例 6 2】 void Page_Load (object sender, EventArgs e) foreach (System.IO.DriveInfo drive in System.IO.DriveInfo.GetDrives () TreeNode node = new TreeNode (); node

6、.Value = drive.Name; /在访问驱动器之前先检查IsReady属性 if (drive.IsReady) node.Text = drive.Name + - (剩余空间: + drive.AvailableFreeSpace + ); else node.Text = drive.Name + - (未就绪); this.TreeView1.Nodes.Add (node); 9Directory和DirectoryInfo类 Directory和DirectoryInfo类提供了一系列有用的方法可以处理与目录有关的任务。Directory类包含许多静态方法用于创建、移动和

7、删除目录。而DirectoryInfo声明一个特殊的对象,可以让用户在该对象上执行与Directory类相同的动作。另外,它还可以列出子目录和文件。10Directory类的主要方法 方法描述CreateDirectory()创建新的目录Delete()删除指定的目录Exists()确定给定目录是否存在GetCreationTime()获取目录的创建日期和时间GetLastAccessTime()返回上次访问指定目录的日期和时间GetLastWriteTime()返回上次写入指定目录的日期和时间GetParent()检索指定路径的父目录GetCurrentDirectory()获取应用程序的当

8、前工作目录SetCurrentDirectory()设置当前工作目录Move()将目录及其内容移到新位置GetAccessControl()返回某个目录的ACL11DirectoryInfo类的主要方法方法描述Delete()从路径中删除DirectoryInfo及其内容Refresh()刷新对象的状态Create()创建指定目录MoveTo()将DirectoryInfo实例及其内容移动到新路径CreateSubdirectory()在指定路径中创建一个或多个子目录GetDirectories()返回当前目录的子目录GetFiles()返回当前目录的文件列表12【例 6 3】 创建时间:最后

9、访问时间:最后修改时间:13【例 6 3】 protected void Page_Load (object sender, EventArgs e) Directory.CreateDirectory (C:asp_dot_net); if (Directory.Exists (C:asp_dot_net) this.Label1.Text = Directory.GetCreationTime (C:asp_dot_net).ToString (); this.Label2.Text = Directory.GetLastAccessTime (C:asp_dot_net).ToStrin

10、g (); this.Label3.Text = Directory.GetLastWriteTime (C:asp_dot_net).ToString (); Directory.Delete (C:asp_dot_net); 14【例 6 4】 void LoadDirectories (TreeNode parent, string path) DirectoryInfo dir = new DirectoryInfo (path); try foreach (DirectoryInfo d in dir.GetDirectories () TreeNode node = new Tre

11、eNode (d.Name, d.FullName); parent.ChildNodes.Add (node); / 对当前目录递归调用本函数 LoadDirectories (node, d.FullName); catch (UnauthorizedAccessException e) parent.Text += (拒绝访问); catch (IOException e) parent.Text += (位置错误: + e.Message + ); 15【例 6 4】void Page_Load (object sender, EventArgs e) DriveInfo drive

12、= new DriveInfo (D:); TreeNode node = new TreeNode (); node.Value = drive.Name; /在访问驱动器之前先检查IsReady属性 if (drive.IsReady) node.Text = drive.Name + - (剩余空间: + drive.AvailableFreeSpace + ); LoadDirectories (node, drive.Name); else node.Text = drive.Name + - (未就绪); this.TreeView1.Nodes.Add (node);16File

13、和FileInfo类 通过Directory和DirectoryInfo类可以很方便地显示和浏览目录树,如果要进一步显示目录中的文件列表,可以使用File或者FileInfo类。 File类提供了用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream对象。 而FileInfo类提供的是实例方法,其功能与File类类似,也可以创建FileStream对象。FileInfo类是不继承的。17【例 6 5】 void TreeView1_SelectedNodeChanged (object sender, EventArgs e) System.IO.DirectoryIn

14、fo directory = new System.IO.DirectoryInfo (TreeView1.SelectedNode.Value); GridView1.DataSource = directory.GetFiles (); GridView1.DataBind ();18【例 6 6】 void Page_Load (object sender, EventArgs e) DirectoryInfo dir = new DirectoryInfo (C:); foreach (FileInfo file in dir.GetFiles (*.*) Response.Write

15、 (file.Name); Response.Write (file.LastWriteTime.ToString () +  ); Response.Write (file.Attributes.ToString () + ); 19Path类 虽然,文件和目录类可以很好地完成文件系统的大部分操作,甚至能够兼容以前的ASP程序。但是,这些类对于路径的处理还是显得不够完美。在很多情况下,程序员必须处理与路径相关的操作。 对于这些与路径相关的任务,.NET框架提供了Path类专门用于处理它们。路径信息是以普通字符串形式存储的,Path类对包含文件或目录路径信息的字符串实例执行操作。20P

16、ath类的主要方法 ChangeExtension更改路径字符串的扩展名。 Combine合并两个路径字符串。 GetDirectoryName返回指定路径字符串的目录信息。 GetExtension返回指定的路径字符串的扩展名。 GetFileName返回指定路径字符串的文件名和扩展名。 GetFileNameWithoutExtension返回不具有扩展名的指定路径字符串的文件名。 GetFullPath给定一个非根路径,返回基于当前目录从根目录开始的绝对路径。21Path类的主要方法 GetInvalidFileNameChars获取包含不允许在文件名中使用的字符的数组。 GetInva

17、lidPathChars获取包含不允许在路径名中使用的字符的数组。 GetPathRoot获取指定路径的根目录信息。 GetTempFileName创建磁盘上唯一命名的零字节的临时文件并返回该文件的完整路径。 GetTempPath返回当前系统的临时文件夹的路径。 HasExtension确定路径是否包括文件扩展名。 IsPathRooted是否包含绝对路径信息22【例 6 7】void Page_Load (object sender, EventArgs e) lblRootPath.Text = Path.GetPathRoot (this.txtPathName.Text); lblD

18、irectoryName.Text = Path.GetDirectoryName (this.txtPathName.Text); lblFileName.Text = Path.GetFileName (this.txtPathName.Text); lblFileNameWithoutExtension.Text = Path.GetFileNameWithoutExtension (this.txtPathName.Text); lblExtension.Text = Path.GetExtension (this.txtPathName.Text);23【例 6 7】 lblTemp

19、oraryPath.Text = Path.GetTempPath (); lblDirectorySeparatorChar.Text = Path.DirectorySeparatorChar.ToString (); lblAltDirectorySeparatorChar.Text = Path.AltDirectorySeparatorChar.ToString (); lblVolumeSeparatorChar.Text = Path.VolumeSeparatorChar.ToString (); lblPathSeparator.Text = Path.PathSeparat

20、or.ToString (); lblInvalidChars.Text = HttpUtility.HtmlEncode (new String (Path.GetInvalidPathChars (); lblInvalidFileNameChars.Text = HttpUtility.HtmlEncode (new String (Path.GetInvalidFileNameChars (); 24文件浏览器 利用本章上述的概念,结合数据绑定控件,编写一个简单的文件浏览器。这在网站维护和管理中是非常重要的功能。 本例不再使用递归的方式显示文件和目录列表,而是用GridView控件来显

21、示。25【例 6 8】 26【例 6 8】void ShowDirectoryContents (string path) / 定义当前目录 DirectoryInfo dir = new DirectoryInfo (path); / 获取DirectoryInfo和FileInfo对象 FileInfo files = dir.GetFiles (); DirectoryInfo dirs = dir.GetDirectories (); / 显示目录列表 lblCurrentDir.Text = 当前新时目录: + path; gridFileList.DataSource = file

22、s; gridDirList.DataSource = dirs; Page.DataBind (); / 清楚已选择项 gridFileList.SelectedIndex = -1; / 记录当前路径 this.ViewStateCurrentPath = path;27【例 6 8】void Page_Load (object sender, EventArgs e) if (!Page.IsPostBack) ShowDirectoryContents (Server.MapPath (.);void gridFileList_SelectedIndexChanged (object

23、sender, EventArgs e) / 获取被选文件 string file = (string) gridFileList.DataKeysgridFileList.SelectedIndex.Value; / 把被选文件的FileInfo对象添加到动态数组files中 ArrayList files = new ArrayList (); files.Add (new FileInfo (file); / 将files绑定到formFileDetails控件 formFileDetails.DataSource = files; formFileDetails.DataBind ()

24、;28【例 6 8】void cmdUp_Click (object sender, EventArgs e) string path = (string) ViewStateCurrentPath; path = Path.Combine (path, .); path = Path.GetFullPath (path); ShowDirectoryContents (path);void gridDirList_SelectedIndexChanged (object sender, EventArgs e) / 获取被选目录 string dir = (string) gridDirLi

25、st.DataKeysgridDirList.SelectedIndex.Value; / 刷新目录列表和文件列表 ShowDirectoryContents (dir);29I/O流 使用流模型可以执行I/O操作。.NET框架在很多处理上使用流模型。本质上,流是对数据的抽象,使得程序员能够使用类似的有序字节流的方式处理不同数据。 .NET框架使用流模型读写数据,而无须对不同数据源编写不同代码。这些模型基于两个基本的概念:流(Stream)和读取器/编写器(Reader/Writer)。所有.NET流都是从System.IO.Stream类派生的。流可以表示内存缓冲区的数据、网络连接检索的数据

26、以及读写文件的数据。30.NET I/O流结构 31Stream类的派生类 类描述FileStream支持通过其Seek方法随机访问文件。默认情况下,FileStream以同步方式打开文件,但它也支持异步操作。MemoryStreamMemoryStream是一个非缓冲的流,可以在内存中直接访问它的封装数据。BufferedStream是向另一个Stream添加缓冲的Stream。NetworkStream表示网络连接上的Stream。DeflateStream提供使用Deflate算法压缩和解压缩流的方法和属性。32文件读写 读写本地文件,可以使用FileStream类。FileStream

27、 fs = new FileStream (Server.MapPath(Text.txt), FileMode.Open);byte data = new bytefs.Length;fs.Read(data, 0, (int)fs.Length);fs.Close(); 在上述代码中,首先创建了一个字节数组data,其长度由FileStream对象的Length属性设定。然后,使用Read方法将流数据填充到数组中。33文件的访问模式 枚举值描述Append打开现有文件并查找到文件尾,或创建新文件。Create指定操作系统应创建新文件。如果文件已存在,则改写它。CreateNew指定操作系统

28、应创建新文件。Open指定操作系统应打开现有文件。OpenOrCreate指定操作系统应打开文件(如果文件存在);否则,应创建新文件。Truncate指定操作系统应打开现有文件。文件一旦打开,就将被截断为零字节大小。34【例 6 9】 using System.IO;void Page_Load (object sender, EventArgs e) / 新建FileStream对象,以Append方式打开进行写入 FileStream fs = new FileStream (Server.MapPath (Text.Txt), FileMode.Append, FileAccess.Wr

29、ite); byte data = System.Text.Encoding.ASCII.GetBytes (This is added by FileStream.Write().); fs.Write (data, 0, (int) data.Length); fs.Flush ();/ 清除fs的缓冲区 fs.Close ();35常用的读取器和编写器 类描述TextReader表示可读取连续字符系列的读取器。StreamReader从字节流中读取字符,从TextReader派生。StringReader从TextReader类派生,从Strings中读取字符。BinaryReader从

30、Streams读取编码的字符串和基元数据类型。TextWriter是StreamWriter和StringWriter的抽象基类。StreamWriter通过使用Encoding将字符转换为字节,向Streams写入字符。36【例 6 10】 using System.IO;void Page_Load (object sender, EventArgs e) / 新建StreamWriter对象,打开Text.TXT文件 StreamWriter streamwriter = new StreamWriter (File.Open(Server.MapPath (Text.txt), Fil

31、eMode.Open); streamwriter.Write (This line is added by StreamWriter.write().); streamwriter.Close (); / 新建StreamReader对象,打开Text.TXT文件,将内容读入到tmp字符串 StreamReader reader = new StreamReader (File.Open(Server.MapPath (Text.txt), FileMode.Open); string tmp = reader.ReadToEnd (); reader.Close (); Response.

32、Write (tmp);37文件压缩 .NET 2.0框架引入了一个新的命名空间System.IO.Compression,该命名空间包含用于数据压缩和解压的类GZipStream和DeflateStream。 在压缩时,需要把真实的流转换成一个压缩流。比如,首先创建一个FileStream对象:FileStream fs = new FileStream (c:myfile.txt, FileMode.Create); 接下来,再创建一个GZipStream或者DeflateStream对象:GZipStream cs = new GZipStream(fs, CompressionMode

33、.Compress);38文件压缩 在写数据时,应该使用压缩流的Write()方法,而不是FileStream的Write()方法。:StreamWriter writer = new StreamWriter(cs); 完成之后,清除压缩流以结束文件中的数据:w.Flush(); fileStream.Close();39文件压缩 读取数据的操作直接把CompressionMode改为CompressionMode.Decompress:FileStream fs = new FileStream (c:myfile.bin, FileMode.Open);GZipStream ds = n

34、ew GZipStream(fs, CompressionMode.Decompress);StreamReader r = new StreamReader(ds);40【例 6 11】 using System.IO;using System.IO.Compression;void Page_Load(object sender, EventArgs e) / 读取需要压缩的文件string f = Server.MapPath(TextFile.txt);FileStream ins = File.OpenRead(f);byte buffer = new byteins.Length;

35、ins.Read(buffer, 0, buffer.Length);ins.Close();/ 创建输出文件FileStream outs = File.Create(Path.ChangeExtension(f, zip);/ 压缩输入流,并把它写入到输出流中GZipStream gzip = new GZipStream(outs, CompressionMode.Compress);gzip.Write(buffer, 0, buffer.Length);gzip.Close(); outs.Close ();41序列化 .NET框架还提供了更高级的数据存储方式,即序列化(Serial

36、ization)。序列化模型是建立在流的基础上的。序列化的过程就是将整个活动的对象转换成有序的字节,然后把这些字节写到FileStream之类的流对象中。然后,在下次使用时,可以把它读出来,创建原始的对象。42序列化过程示意图 43序列化 对象被序列化为流。流传递的不仅是数据,还包括有关对象类型的信息,如对象的版本、区域性和程序集名称。通过该流,可以将对象存储在数据库、文件或内存中。进行序列化的对象必须符合如下的标准:对象的类必须在声明时前面加上Serializable()属性类的所有公有和私有变量都必须是可序列化的。如果类是派生的,所有基类都必须是可序列化的。44【例 6 12】 Seria

37、lizable ()public class LogEntry /网页日志记录项 private string message; / 回发的消息 private DateTime date; / 消息的回发时间 public string Message get return message; set message = value; public DateTime Date get return date; set date = value; public LogEntry (string message) this.message = message; this.date = DateTi

38、me.Now; 45【例 6 12】 private void Log (string message) FileMode mode; if (ViewStateLogFile = null) ViewStateLogFile = c:user.log; mode = FileMode.Create; else mode = FileMode.Append; string fileName = (string) ViewStateLogFile; using (FileStream fs = new FileStream (fileName, mode) LogEntry entry = ne

39、w LogEntry (message); BinaryFormatter formatter = new BinaryFormatter (); formatter.Serialize (fs, entry); 46【例 6 12】void cmdRead_Click (object sender, EventArgs e) if (ViewStateLogFile != null) string fileName = (string) ViewStateLogFile; using (FileStream fs = new FileStream (fileName, FileMode.Op

40、en) BinaryFormatter formatter = new BinaryFormatter (); while (fs.Position fs.Length) LogEntry entry = (LogEntry) formatter.Deserialize (fs); lblInfo.Text += entry.Date.ToString () + ; lblInfo.Text += entry.Message + ;47【例 6 12】void Page_Load (object sender, EventArgs e) if (!Page.IsPostBack) Log (首次载入页面。); else Log (页面回发。);void cmdDelete_Click (object sender, Ev

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论