C应用程序设计教程文件和流

上传人:桔**** 文档编号:570658086 上传时间:2024-08-05 格式:PPT 页数:85 大小:133KB
返回 下载 相关 举报
C应用程序设计教程文件和流_第1页
第1页 / 共85页
C应用程序设计教程文件和流_第2页
第2页 / 共85页
C应用程序设计教程文件和流_第3页
第3页 / 共85页
C应用程序设计教程文件和流_第4页
第4页 / 共85页
C应用程序设计教程文件和流_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《C应用程序设计教程文件和流》由会员分享,可在线阅读,更多相关《C应用程序设计教程文件和流(85页珍藏版)》请在金锄头文库上搜索。

1、文件和流 本章介绍在C#语言中,如何处理目录(文件夹),如何处理文件,如何使用流的概念读写文件。文件是用路径来定位的,描述路径有3种方式:绝对路径、当前工作盘的相对路径、相对路径。以C:dir1dir2为例(假定当前工作目录为C:dir1),C:dir1dir2为绝对路径,dir1dir2为当前工作盘的相对路径,dir2为相对路径,都表示C:dir1dir2。本章中所说的路径,可以是路径的3种描述方式中的任意一种。9.1 用流读写文件 .Net把读写的文件看成是顺序字节流,用抽象类Stream代表一个流。Stream类有许多派生类,例如FileStream类,以字节为单位读写文件;Binary

2、Read类和BinaryWrite类,以根本数据类型为单位读写文件,可以从文件直接读写bool、String、int16、int等根本数据类型数据;StreamReader和StreamWriter类以字符或字符串为单位读写文件。本节首先介绍这些类的用法,然后介绍数据的序列化。使用流读写文件必须引入命名空间:System.IO。9.1.1 FileStream类读写字节 使用FileStream类可以建立文件流对象,用来翻开和关闭文件,以字节为单位读写文件。构造函数:public New(string path,FileMode mode,FileAccess access) path:是文件

3、的相对路径或绝对路径 。mode:为FileMode.Append,翻开文件并将读写位置移到文件尾,文件不存在那么创立新文件,只能同FileAccess.Write一起使用。FileMode.Create,创立新文件,如果文件已存在,文件内容将被删除;FileMode.CreateNew,创立新文件,如果文件已存在,那么引发异常;FileMode.Open,翻开现有文件,如果文件不存在,那么引发异常;FileMode.OpenOrCreate,如果文件存在,翻开文件,否那么,创立新文件;FileMode.Truncate,翻开现有文件,并将文件所有内容删除。 access:FileAccess

4、.Read(只读方式翻开文件)、FileAccess.Write(只写方式翻开文件)、FileAccess.ReadWrite(读写方式翻开文件)。也可以没有第三个参数,默认为FileAccess.ReadWrite。共有8个构造函数,其他构造函数请用VS2005帮助系统查看。方法void Write(byte array,int offset,int count):将参数1指定数组中多个字节写入流,要写入流的第1个字节是arrayoffset,参数3为要写入的字节数。【例9.1】写字节数组数据到文件的程序如下,该程序将建立文件d:/g1.bin。注意,在文件头部必须增加如下语句引入命名空间

5、Imports System.IOusing System;using System.IO;/使用文件必须引入的命名空间class WriteFile static void Main() byte data=new byte10;/建立字节数组 for(int i=0;i10;i+)/为数组赋值 datai=(byte)i; FileStream fs=new FileStream (“d:/g1.bin,FileMode.Create);/建立流对象 /写data字节数组中的所有数据到文件 fs.Write(data,0,10); fs.Close() /不再使用的流对象,必须关闭。 /垃

6、圾收集器不能自动去除流对象 方法int Read(byte array,int offset,int count):从流中读数据写入字节数组array,读入的第1个字节写入arrayoffset,参数3为要读入的字节数。返回值为所读字节数,由于可能已读到文件尾部,其值可能小于count,甚至为0。 【例9.2】读一个文件所有字节到数组并在屏幕显示的程序如下,请先用上例建一个文件,然后用此例读出。using System;using System.IO;/使用文件必须引入的命名空间class ReadFile static void Main() FileStream fs=new FileSt

7、ream (d:/g1.bin,FileMode.Open); byte data=new bytefs.Length; long n=fs.Read(data,0,(int)fs.Length); fs.Close(); /上句n为所读字节数 Console.WriteLine(文件的内容如下:); foreach(byte m in data) Console.Write(0,m); 属性CanRead、CanSeek、CanWrite:检查流对象是否可以读、定位、写。只读属性。属性Length:以字节为单位表示流对象长度,即文件的长度。只读属性。属性Position:获取或设置流对象当前

8、读写位置。方法long Seek(long offset,SeekOrigin origin) :该方法移动文件读写位置到参数2指定位置加上参数1指定偏移量处,参数2可以是SeekOrigin.Begin、SeekOrigin.End、SeekOrigin.Current,分别为开始位置、结束位置、当前读写位置。【例【例9.3】使用方法Seek例子如下。using System;using System.IO;/使用文件必须引入的命名空间class FileStreamProperty static void Main() FileStream fs=new FileStream (“d:/g

9、1.bin,FileMode.Open); /无第3个参数 /文件读写位置移到从文件尾部向前4个字节 fs.Seek(-4,SeekOrigin.End); Console.WriteLine(读写位置:0,能定位:1, fs.Position,fs.CanSeek); Console.WriteLine(能读:0,能写:1, fs.CanRead,fs.CanWrite); fs.Close(); 注意建立流对象fs的构造函数无第3个参数,因此按读写方式翻开。程序运行结果如下: 读写位置:6,能定位:true能读:true, 能写:true9.1.2 BinaryReader、BinaryW

10、riter类读写根本数据类型 使用BinaryReader和BinaryWriter类可以从文件直接读写bool、String、int16、int等根本数据类型数据。常用BinaryWriter类方法如下:构造函数BinaryWriter(Stream input):参数为FileStream类对象。方法viod Write(数据类型 Value):写入参数指定的数据类型的一个数据,数据类型可以是根本数据类型,例如,int、bool、float等 。【例9.4】写int类型数据程序如下:using System;using System.IO; /使用文件必须引入的命名空间class Writ

11、eFile static void Main() FileStream fs=new FileStream (d:/g1.dat,FileMode.Create); BinaryWriter w=new BinaryWriter(fs); for(int i=0;i10;i+) w.Write(i);/写入int类型数据 w.Close(); 常用BinaryReader类方法如下:构造函数BinaryReader(Stream input):参数为FileStream类对象。方法ReadBoolean、ReadByte、ReadChar:返回一个指定类型数据。方法没有参数。方法byte Re

12、adBytes(int count):返回字节数组保存从流读出参数指定的字节。【例9.5】读int类型数据程序如下,先用上例建一个文件,然后用此例读出。using System;using System.IO;/使用文件必须引入的命名空间class ReadFile static void Main() int data=new int10; FileStream fs=new FileStream (d:/g1.dat,FileMode.Open); BinaryReader r=new BinaryReader(fs); for(int i=0;i10;i+) datai=r.ReadIn

13、t32(); r.Close(); Console.WriteLine(文件的内容如下:); foreach(int m in data) Console.Write(0,m); 9.1.3 StreamReader和StreamWriter类读写字符串读写字符串可以用StreamReader和StreamWriter类。常用StreamWriter类方法如下:构造函数StreamWriter(string path,bool append):path是要写文件的路径,如果该文件存在,并且append为false,那么该文件被改写。如果该文件存在,并且append为 true,那么数据被追加到

14、该文件中。该文件不存在,将创立新文件 。方法void Writer(string value):将字符串写入流。方法void Writer(char value):将字符写入流。using System;using System.IO;class WriteFile static void Main() StreamWriter w=new StreamWriter (d:/g.text,false); w.Write(100);/100首先转换为字符串,再写入。 /字符串之间用换行符 (n或rn)分隔 w.Write(100个); w.Write(“End of file);/一个字符串为文

15、件中的一行 w.Close(); 常用StreamReader类方法如下:构造函数StreamReader(string path):参数是要读文件的路径。方法int Read():从流中读取一个字符,并使读字符位置移动到下一个字符。返回代表读出字符ASCII字符值的int类型整数,如果没有字符可以读出,返回-1。如果sr是StreamReader对象,读取一个字符的用法如下:char c=(char)sr.Read()。方法string ReadLine():从流中读取一行字符并将数据作为字符串返回。行的定义是:两个换行符 (n或rn)之间的字符序列。返回的字符串不包含回车或换行符。【例【例

16、9.7】读字符串程序如下,请先用上例建一个文件,然后用此例读出。 using System;using System.IO;using ;class ReadFile static void Main() string sLine=; List arrText = new Liststring using(StreamReader objReader= new ) do sLine=objReader.ReadLine(); if(sLine!=null)arrText.Add(sLine); while(sLine!=null); Console.WriteLine(文件的内容如下:); f

17、oreach(string m in arrText) Console.Write(0,m); 程序运行结果如下:文件的内容如下:100100个End of file9.1.4 序列化 对于一个复杂的数据结构,例如数组,用以上方法存入文件,就显得过于复杂了。为了简化这类问题,.net提出了序列化的概念,序列化包括序列化和反序列化,所谓序列化就是把类的对象作为一个整体存入文件,反序列化那么是相反的过程。.net中的许多类都支持序列化,可以用如下方法判别一个类是否支持序列化: Dictionary h = new Dictionary();/建立泛型哈希表对象Type myType=h.GetTy

18、pe();/如为true,支持序列化,这里myBool=truebool myBool=myType.IsSerializable;【例【例9.8】下边的例子完成了一个哈希表对象的序列化。】下边的例子完成了一个哈希表对象的序列化。using ;using ;using ;class SerialFile static void Main() Dictionary h= new Dictionary();/建立哈希表对建立哈希表对象象 h.Add(键键1, 值值1);/哈希表每一个元素是一对键值哈希表每一个元素是一对键值 h.Add(“键键2, “值值2); /例如商品编号和商品例如商品编号和商

19、品名称名称 /通过键值,可以很容易找到键值对应的值通过键值,可以很容易找到键值对应的值 h.Add(键键3, 值值3); 序列化数据 FileStream fs = new FileStream (d:/d.dat, FileMode.Create); BinaryFormatter formatter = new BinaryFormatter(); formatter.Serialize(fs, h); fs.Close(); 反序列化数据 fs = new FileStream (“d:/d.dat, FileMode.Open) h.Clear(); h = (Dictionary)

20、formatter.Deserialize(fs); fs.Close(); foreach (KeyValuePair h1 in h) Console.WriteLine(0:1;, h1.Key, h1.Value); /注意哈希表用法 运行结果如下:键1:值1;键2:值2;键3:值3;【例9.9】自己定义的类也可以序列化,只要在类定义前增加Serializable即可,下边例子首先定义了一个可序列化的类Person,建立假设干Person类对象,存到List类对象中,并将List类对象序列化。程序如下:using System;using System.IO;using ;using

21、;using ;namespace e6_1_4B Serializable public class Person private string P_name=张三; /私有字段 private int P_age=12;/P_age是私有字段 public string Name/定义属性Namegetreturn P_name; setP_name=value; public int Age/定义属性Agegetreturn P_age; setP_age=value; class Class1 STAThread static void Main(string args) List h

22、=new List(); Person p=new Person(); h.Add(p); p=new Person(); p.Name=李四; p.Age=24; h.Add(p); FileStream fs=new FileStream (“d:/d.dat,FileMode.Create); BinaryFormatter formatter=new BinaryFormatter(); formatter.Serialize(fs,h); fs.Close(); fs=new FileStream(d:/d.dat,FileMode.Open); h.Clear(); h=(List

23、)formatter.Deserialize(fs); fs.Close(); foreach(Person de in h)Console.WriteLine (Name=0,Age=1;,de.Name,de.Age); 运行结果如下:Name=张三,Age=12;Name=李四,Age=24;9.1.5 Stream类的其他派生类Stream类的其他派生类包括:MemoryStream、BuffereStream、NetworkStream(在命名空间)。其中MemoryStream类把文件放到内存中,极大地提高了文件读写速度。BuffereStream类为文件读写建立一个缓冲区,写文件

24、先把文件存到缓冲区中,缓冲区满了以后,才写入物理设备。先从文件读入较多数据到缓冲区,读文件先从缓冲区读,缓冲区没有所需数据,才再一次从物理设备读数据到缓冲区,用这样的方法改善文件读写的性能。NetworkStream类把网络传输的数据也看作流。请用帮助系统查看这些类的用法。9.2 File类和FileInfo类 .Net通过File和FileInfo类来创立、复制、删除、移动和翻开文件。在File类中提供了一些静态方法,使用这些方法可以完成上述功能,但File类不能建立对象。FileInfo类使用方法和File类根本相同,但FileInfo类能建立对象。在使用这两个类时需要引用System.I

25、O命名空间。这里重点介绍File类的使用方法。参见教科书的第193页。以下使用例子介绍各个方法的用法。9.2.2 判断文件是否存在 判断文件是否存在的方法声明如下:public static bool Exists(string path); 该方法判断参数指定的文件是否存在,参数path指定文件路径。如果文件存在,返回true,如果文件不存在,或者访问者不具有访问此文件的权限,或者path描述一个目录,返回false。下面的代码段判断是否存在c:Examplee1.txt文件:if(File.Exists(c:Examplee1.txt) /为处理代码 9.2.3 删除文件删除文件方法:pu

26、blic static void Delete(string path);该方法删除参数指定的文件,参数path指定要删除的文件的路径 。【例9.10】下面的程序删除用户指定文件。using System;using System.IO; class DeleteFile static void Main() Console.WriteLine(请键入要删除文件的路径:); string path=Console.ReadLine(); if(File.Exists(path) File.Delete(path); elseConsole.WriteLine(文件不存在!); 9.2.4 复制

27、文件复制文件方法:public static void Copy(string sFName,string dFName,bool overW); 该方法将参数sFName指定文件拷贝到参数destFileName指定的目录,修改文件名为参数dFName指定的文件名,如果OverW为true,而且文件名为dFName的文件已存在的话,将会被复制过去的文件所覆盖。【例9.11】文件复制例子如下:using System;using System.IO;class CopyFile static void Main() Console.WriteLine (请键入要拷贝的源文件的路径:); str

28、ing path=Console.ReadLine(); Console.WriteLine (请键入要拷贝的目文件的路径(包括文件名):); string path1=Console.ReadLine(); if(File.Exists(path) if(!File.Exists(path1)File.Copy(path,path1,true); elseConsole.WriteLine (目的文件存在或目的路径非法!); else Console.WriteLine(源文件不存在!); 9.2.5 移动文件 移动文件方法:public static void Move(string sF

29、Name,string dFName);该方法将参数sFName指定文件移动到参数dFName指定的目录,修改文件名为参数dFName指定的文件名,如果目标文件已经存在,或者路径格式不对,将引发异常。注意,只能在同一个逻辑盘下进行文件转移。如果试图将c盘下的文件转移到d盘,将发生错误。下面的代码可以将c:Example下的e1.txt文件移动到c盘根目录下。File.Move(c:ExampleBackUp.txt,c:BackUp.txt);【例9.12】FileInfo类方法MoveTo可以将一个逻辑盘的文件移到另一个逻辑盘,例子如下:using System;using System.I

30、O; class MoveFile static void Main() Console.WriteLine (请键入要移动的源文件的路径:); string path=Console.ReadLine(); Console.WriteLine (请键入要移动的目文件的路径(包括文件名):); string path1=Console.ReadLine(); if(File.Exists(path) if(!File.Exists(path1) FileInfo fi=new FileInfo(path); fi.MoveTo(path1); /如在同一磁盘可使用此句替换前2句 /File.M

31、ove(path,path1); else Console.WriteLine (目的文件存在或路径非法!); elseConsole.WriteLine(源文件不存在!); 9.2.6 设置文件属性设置文件属性方法:public static void SetAttributes(string path,FileAttributes fileAbs);参数path指定要修改属性的文件路径;参数fileAbs指定要修改的文件属性,可以是如下数值:Archive(存档)、Compressed(压缩文件)、Directory(目录文件)、Encrypted(加密)、Hidden(隐藏)、Norma

32、l(普通文件)、ReadOnly(只读文件)、System(系统文件)、Temporary(临时文件)。下面代码设置文件c:e1.txt的属性为只读、隐藏。File.SetAttributes(c:e1.txt,FileAttributes.ReadOnly|FileAttributes.Hidden);9.2.7 得到文件的属性方法声明如下:public static FileAttributes GetAttributes(string path);方法返回参数指定的文件的FileAttributes,如果未找到路径或文件,返回-1 。【例【例9.13】得到文件的属性例子如下:using

33、System;using System.IO; class GetFileAttributes static void Main() Console.WriteLine(键入得到属性的文件路径:); string path=Console.ReadLine(); if(File.Exists(path) FileAttributes attributes= File.GetAttributes(path); if(attributes&FileAttributes.Hidden)=FileAttributes.Hidden)Console.WriteLine(隐藏文件); elseConsol

34、e.WriteLine(不是隐藏文件); FileInfo fileInfo=new FileInfo(path); Console.WriteLine(fileInfo.FullName+ 文件长度=+fileInfo.Length+, 建立时间=+fileInfo.CreationTime); /也可用如下语句得到文件其他信息 Console.WriteLine(建立时间=+ File.GetCreationTime(path) +最后修改时间=+ File.GetLastWriteTime(path)+访问时间=“ +File.GetLastAccessTime(path); else

35、Console.WriteLine(文件不存在!); 9.3 Directory类和DirectoryInfo类C#语言中通过Directory类来创立、复制、删除、移动文件夹。在Directory类中提供了一些静态方法,使用这些方法可以完成上述功能。Directory类不能建立对象。DirectoryInfo类使用方法和Directory类根本相同,但DirectoryInfo类能建立对象。在使用这两个类时需要引用System.IO命名空间。这里重点介绍Directory类的使用方法。以下使用例子介绍各个方法的用法。9.3.1 Directory类常用的方法Directory类常用的方法如下

36、,这些方法都是静态方法。后面将通过程序实例来介绍其中主要方法的使用。 方法定义使用说明DirectoryInfo CreateDirectory(string s) 创建参数指定路径中所有目录和子目录。void Delete(string path) 删除参数指定目录。bool Exists(string path) 检查参数指定路径的文件夹是否存在,存在,返回true。string GetCurrentDirectory() 获取应用程序的当前工作目录。string GetDirectories(string s) 返回字符串数组,记录参数指定的文件夹中所有子文件夹名称。string Get

37、DirectoryRoot(string s) 返回参数指定路径的卷信息、根信息的字符串。string GetFiles(string s) 返回字符串数组,记录指定文件夹中所有文件名称。string GetFileSystemEntries(string s) 返回指定目录中所有文件和子目录名称。string GetLogicalDrives() 返回字符串数组记录计算机所有驱动器名称,如A:、C:。DirectoryInfo GetParent(string s) 返回参数指定路径的父文件夹。void Move(String s1, String s2) 将参数1指定文件或文件夹及包含的文

38、件、子文件夹移动到新位置。见9.3.5节。void SetCurrentDirectory(string s) 将参数指定目录设置为应用程序当前工作目录。GetCreationTime()、GetLastWriteTime()、GetLastAccessTime()、SetCreationTime()、SetLastAccessTime和SetLastWriteTime 见9.2.1节同名函数。9.3.2 判断目录是否存在方法声明如下:public static bool Exists(string path);该方法判断参数指定目录是否存在,参数path指定目录的路径。如果目录存在,返回tr

39、ue,如果目录不存在,或者访问者不具有访问此目录权限,返回false。下面代码判断是否存在c:Dir1Dir2目录。if(Directory.Exists(c:Dir1Dir2) /为处理代码9.3.3 创立目录创立目录方法:public static DirectoryInfo CreateDirectory(string path);方法按参数path指定的路径创立所有目录及其子目录。如果由参数path指定的目录已存在,或者参数path指定的目录格式不正确,将引发异常 。【例9.14】下面的程序创立按用户输入的目录名创立目录,具体程序如下:using System;using System

40、.IO; class CreateFileDirectory static void Main() Console.WriteLine(请键入要创立目录路径:); string path=Console.ReadLine(); if(!Directory.Exists(path) Directory.CreateDirectory(path); else Console.WriteLine(目录已存在或目录非法!); 9.3.4 删除目录删除目录方法:public static void Delete(string path,bool recursive);该方法删除参数path指定的目录。方

41、法的第二个参数为bool类型,为true可以删除非空目录;假设为false,那么仅当目录为空时才可删除。【例9.15】下面的程序删除用户指定目录。using System;using System.IO;class DeleteFile static void Main() Console.WriteLine(请键入要删除目录的路径:); string path=Console.ReadLine(); if(Directory.Exists(path) Directory.Delete(path); else Console.WriteLine(目录不存在或目录非法!); 9.3.5 移动目录

42、 移动目录方法:public static void Move(string sourceDirName,string destDirName);该方法将文件或目录及其子目录移到新位置,如果目标目录已经存在,或者路径格式不对,将引发异常。注意,只能在同一个逻辑盘下进行目录转移。如果试图将c盘下的目录转移到d盘,将发生错误。下面的代码可以将目录c:Dir1Dir2移动到c:Dir3Dir4。Directory.Move(c:Dir1Dir2,c:Dir3Dir4);【例9.16】Directory Info类方法MoveTo可以将一个逻辑盘的目录移到另一个逻辑盘,例子如下:using Syste

43、m;using System.IO;class DeleteFile static void Main() Console.WriteLine(请键入要移动源目录的路径:); string path=Console.ReadLine(); Console.WriteLine (请键入要移动的目的目录的路径:); string path1=Console.ReadLine(); if(Directory.Exists(path) if(!Directory.Exists(path1) DirectoryInfo dir=new DirectoryInfo(path); dir.MoveTo(pa

44、th1); /Directory.Move(path,path1); /如2个目录在 /同一磁盘,可用被注解语句替换前2句 elseConsole.WriteLine(目的目录已存在!); elseConsole.WriteLine(源目录不存在!); 9.3.6 获取当前目录下所有子目录该 方 法 声 明 如 下 : public static string GetDirectories(string path);【例【例9.17】下面的程序读出用户指定目录下的所有子目录,并将其在屏幕显示。using System;using System.IO;class DeleteFile stati

45、c void Main() Console.WriteLine(请键入目录的路径:);string path=Console.ReadLine(); if(Directory.Exists(path) string Directorys; Directorys= Directory.GetDirectories(path); foreach(string aDir in Directorys) Console.WriteLine(aDir); else Console.WriteLine(目录不存在!); 获得所有逻辑盘符方法定义如下:string AllDrivers=Directory.G

46、etLogicalDrives();9.3.7 获取当前目录下的所有文件该方法声明如下:public static string GetFiles(string path);【例9.18】下面的程序读出用户指定目录下的所有文件名,并将文件在屏幕上显示。using System;using System.IO; class DeleteFile static void Main() Console.WriteLine(请键入目录的路径:); string path=Console.ReadLine(); if(Directory.Exists(path) string files; files=

47、Directory.GetFiles(path); foreach(string aFile in files) Console.WriteLine(aFile); elseConsole.WriteLine(目录不存在!);9.3.8 设置目录属性与文件属性相同,目录属性也是使用FileAttributes来进行设置的。下面的代码设置c:Dir1Dir2目录为只读、隐藏。DirectoryInfo DirInfo=new DirectoryInfo(c:Dir1Dir2);DirInfo.Atttributes=FileAttributes.ReadOnly|FileAttributes.H

48、idden;9.4 例子:查找文件本节实现一个查找指定路径中指定文件的程序。 9.4.1 ListView和FolderBrowserDialogListView控件可用4种不同视图(详细资料、大图标、列表、小图标)中的一种显示一些项的集合,ListView控件的外观与Windows 资源管理器的文件列表外观相似。其常用属性、方法和事件如下:属性Columns:所有列标头的集合,可用“ColumnHeader集合编辑器对话框修改。属性MultiSelect:获取或设置一个值,该值指示是否可以选择多个项。属性SelectedIndices:获取控件中选定项的索引集合。用下式得到这个集合:List

49、View.SelectedIndexCollection I=ListView1.SelectedIndices;I.Length为选择了多少项,I(0)为选择的第1项的索引,I(1)为选择的第2项的索引等。ListView1.Items(I(0).SubItems(0).Text表示第1个选项的第一个子项的显示内容。属性SelectedItems:获取控件中选定项的集合。 用下式得到这个集合:ListView.SelectedListViewItemCollection L=ListView1.SelectedItems;其中L.Length表示选择了多少项,L(0)为选择的第1项,L(1)

50、为选择的第2项等等。L(0).SubItems(0).Text表示第1个选项的第一个子项的显示内容。属性View:获取或设置项在控件中的显示方式,可以是Detail(详细资料)、LargeIcon(大图标)、List(列表)、SmallIcon(小图标)。方法Clear:从控件中移除所有项的内容。方法DragDropEffects DoDragDrop(object data,DragDropEffects allowEffects):开始拖放操作,参数data是要传送的数据,可以是string、Bitmap、IDataObject、Metafile类的对象,或者是实现序列化的数据等。参数2确

51、定哪些拖动操作可以发生,可以是DragDropEffects.Copy、All、Link、Move、None、Scroll。事件ItemDrag:鼠标开始拖动产生的事件。事件DragEnter:鼠标进入拖动目的控件产生的事件。事件DragDrop:鼠标进入拖动目的控件,并抬起鼠标产生的事件。事件SelectedIndexChanged:当列表视图控件中选定的项的索引更改时发生。FolderBrowserDialog是选择文件夹对话框,属性SelectedPath是用户选定的文件夹路径,其余使用方法与翻开和保存文件对话框类似,这里就不多介绍了。9.4.2 在指定文件夹中查找文件【例9.19】Wi

52、ndows操作系统提供了一个查找文件的程序,可以查找指定文件夹中的指定文件,本例实现此功能。具体实现步骤如下:(1)新建工程。放置ListView控件到窗体,属性View= Details,单击属性Column右侧标题为“的按钮,在弹出的“ColumnHeader集合编辑器对话框(如以下图)中添加4个列头,属性Name分别为:FileName、FileDirectory、FileSize和LastWriteTime,属性Text分别为:文件名称、所在文件夹、大小和文件修改时间。(2)放置Label控件到窗体,属性Text为指定搜索文件的名称。在窗体中Label控件右侧增加一个TextBox控件

53、,属性Text为空,用来输入要搜索的文件名称。(3)放置FolderBrowserDialog控件到窗体,Name=folderBrowserDialog1。(4)在窗体中增加2个Button控件,属性Text分别为开始搜索和停止搜索。(5)为窗体增加一个方法:FindFiles(DirectoryInfo dir,string FileName) ,该方法是在第一个参数指定的文件夹中查找第二个参数指定的所有文件。在一个文夹中可能还有子文件夹,子文件夹中可能还有子文件夹,因此要在第一个参数指定的文件夹中和其子文件夹中查找第二个参数指定的所有文件。为了实现能够查找所有文件夹中的同名文件,采用递归

54、调用方法,如果在一个文件夹中存在子文件夹,再一次调用函数自己,查找子文件夹中的文件。由于用到文件,在Form1.cs文件头部增加语句:Imports System.IO 具体实现代码如下:void FindFiles(DirectoryInfo dir,string FileName) FileInfo files=dir.GetFiles(FileName); if(files.Length!=0) foreach(FileInfo aFile in files) ListViewItem lvi; string s=new StringaFile.Name, ,(),(); lvi=new

55、 ListViewItem(s); listView1.Items.Add(lvi); DirectoryInfo dirs=dir.GetDirectories(); if(dirs.Length!=0) foreach(DirectoryInfo aDir in dirs) FindFiles(aDir,FileName);/递归调用(6)为标题为“开始搜索按钮增加单击事件函数如下:private void button1_Click(object sender, EventArgs e) string s = textBox1.Text; if (s = ) MessageBox.Sho

56、w(文件名称名称不能为空); else int n = s.IndexOf(.);/有无扩展名 if (n = -1)/如无扩展名,增加.*为扩展名 s += .*; if (folderBrowserDialog1.ShowDialog() = DialogResult.OK) DirectoryInfo dir = new DirectoryInfo (folderBrowserDialog1.SelectedPath.ToString(); FindFiles(dir,s); (7)按以上设计,无法在标题为停止搜索按钮的单击事件处理函数中用代码停止搜索,可行方法是,查找文件在另一个线程中

57、进行,在单击停止搜索按钮后,停止搜索线程。(8)编译运行,查找D:gengUseDirectX目录所有*.bmp文件的运行效果如以下图。9.5 例子:鼠标拖放翻开文件【例9.20】本例将图像文件拖到PictureBox控件中,翻开并显示图像。进行拖放操作的组件的AllowDrop属性必须设定为True,因为此属性是决定组件是否可以进行拖放操作。要完成拖放操作,必须处理好三个事件:ItemDrag、DragEnter、DragDrop。其中第一个事件是在源组件中触发的,另外2个事件是在目标组件中触发的。当用户拖动组件触发ItemDrag事件;当拖动数据进入目标组件区域触发DragEnter事件;

58、当用户在目标组件区域放置拖动的数据触发DragDrop事件。继续上例,实现具体步骤如下:(9)设置ListView控件属性MultiSelect=false,不允许多项选择。放PictureBox控件到窗体。属性Name= pictureBox1,在Form1类的Load事件函数最后增加语句:pictureBox1.AllowDrop = true;该属性只能用此方法修改。为ListView的ItemDrag事件增加事件处理函数如下:private void listView1_ItemDrag(object sender, ItemDragEventArgs e) if(e.Button=M

59、ouseButtons.Right)return; int n=listView1.SelectedIndices.Count; if(n!=1)return; ListView.SelectedIndexCollection I=listView1.SelectedIndices;string s=listView1.ItemsI0.SubItems1.Text+;s+=listView1.ItemsI0.SubItems0.Text;if(s.Length=0)return;/下句将字符串s拷贝到目的地。也可用/DragDropEffects.Move,表示移动。listView1.DoD

60、ragDrop(s,DragDropEffects.Copy);(12)为pictureBox1的事件DragEnter增加事件处理函数如下:(13)private void pictureBox1_DragEnter(object sender, DragEventArgs e)(14) if(e.Data.GetDataPresent(DataFormats.Text)(15)e.Effect=DragDropEffects.Copy;(16)else(17)e.Effect=DragDropEffects.None;(18)(13)为pictureBox1的事件DragDrop增加事件处

61、理函数如下:private void pictureBox1_DragDrop(object sender, DragEventArgs e) if(e.Data.GetDataPresent(typeof(System.String) & e.Effect=DragDropEffects.Copy)string s= (string)e.Data.GetData(typeof(System.String);Bitmap bits=new Bitmap(s);pictureBox1.Image=bits; (14) 编译、运行,查找*.bmp文件,拖动任一.bmp文件到pictureBox1中

62、,看是否能翻开这个图形文件显示图像。9.6 例子:拆分和合并文件【例9.21】在将一个文件作为电子邮件的附件传送时,由于附件的大小有限制,不能传送太大的文件。可以将较大的文件分割为多个较小的文件,传送后再合并为一个文件,下边两个方法实现文件的拆分和合并。首先是拆分方法,参数1是要拆分文件的路径(路径包括文件名及扩展名),参数2是拆分后的文件名(无扩展名),文件名后边由拆分方法自动增加序号和扩展名,参数3是被拆分后的文件大小,单位为字节。拆分方法定义如下:void SplitFile(string f1,string f2,int f2Size) FileStream inFile=new Fi

63、leStream (f1,FileMode.Open,FileAccess.Read);/只读 bool mark=true; int n,i=0; byte buffer=new bytef2Size; FileStream OutFile=null; while(mark) if(n=inFile.Read(buffer,0,f2Size)0) OutFile=new FileStream(f2+i.ToString() +.fsm,FileMode.Create,FileAccess.Write); OutFile.Write(buffer,0,n); i+; OutFile.Close

64、(); else mark=false; inFile.Close();合并文件方法,参数1是要合并在一起的文件名(路径包括文件名及扩展名),参数2是拆分的文件名(无扩展名,无序号),文件名后边由合并方法自动增加序号和扩展名fsm,要将这些文件合并到参数1指定的文件,参数3是要合并的文件数。合并方法定义如下:void MergeFile(string f1,string f2,int f2Num) FileStream OutFile=new FileStream(f1,FileMode.Create,FileAccess.Write); long n,l; byte buffer; for(

65、int i=0;if2Num;i+) FileStream InFile=new FileStream(f2+i.ToString()+.fsm, FileMode.Open,FileAccess.Read); l=InFile.Length; buffer=new bytel; n=InFile.Read(buffer,0,(int)l); OutFile.Write(buffer,0,(int)n); InFile.Close(); OutFile.Close();下边介绍两个方法的使用。首先在D:/建立文件夹g,在文件夹g中建立一个小于20k的Word文档g.doc。先调用方法SplitFile(d:/g/g.doc,d:/g/g,11000)拆分,然后调用方法MergeFile(d:/g/k.doc,d:/g/g,2) 合并,看是否可以用Word程序翻开合并后的文档。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号