电脑书编程章操作_第1页
电脑书编程章操作_第2页
电脑书编程章操作_第3页
电脑书编程章操作_第4页
电脑书编程章操作_第5页
已阅读5页,还剩49页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

第7章文件操作7.1用于文件操作的类文件是存储在外存上数据的集合。操作系统是以文件形式对数据进行管理的。C#中对文件操作的类如下图7.1所示。System.ObjectSystem.IO.DriectorySystem.MarshallByRefObjectSystem.IO.FileSystem.IO.pathSystem.IO.ComponentSystem.IO.FileSystemInfoSystem.IO.TextWriterSystem.IO.TextReaderSystem.IO.StreamSystem.IO.StreamWriterSystem.IO.StreamReaderSystem.IO.FileStreamSystem.IO.DirectoryInfoSystem.IO.FileSystemWatcherSystem.IO.FileInfo7.1用于文件操作的类其中:File用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream对象。Driectory用于创建、复制、删除、移动和打开目录的静态方法。Path对包含文件或目录路径信息的String执行操作。FileInfo提供创建、复制、删除、移动和打开文件的实例方法并帮助创建FileSystem对象。DirectoryInfo提供创建、移动和枚举目录和子目录的实例方法。FileSystem指向文件的流,支持对文件的读写,支持随即访问文件。StreamReader从流中读取字符数据。StreamWriter向流中写字符数据。FileSystemWatcher用于监控文件和目录的变化。7.2文件类为了方便目录和文件操作,系统专门提供了文件类和目类录。.Net中使用File类封装文件的操作。并且所有方法都是静态方法。可以通过类名来调用他们,不必要通过创建对象实例。文件类的常用方法见表7.1所示。7.2文件类表7.1File类的常用方法7.3目录类7.3.1Directory类目录使用Directory类,可以通过目录类创建、移动目录。并可以列举目录和子目录的内容。Directory类全部是静态的方法。目录类主要方法见表7.2。表7.2Directory类的常用方法7.3.2DirectoryInfo类在使用DirectoryInfo类的属性和方法前必须要创建它的对象实例,在创建时需要指定该实例所对应的目录。如DirectoryInfodi=newDirectoryInfo(“c:\\mydir”);DirectoryInfo类的常用方法见表7.3。表7.3DirectoryInfo类的常用方法7.4路径类(path)path类用来处理路径字符串。它的方法也全部是静态的。常用方法见表7.4。表7.4path类的常用方法7.5创建文件可以通过File、Fileinfo和FileSystem创建文件。File提供操作文件的相关静态方法,其中包含了创建、移动、复制、删除以及打开指定的文件,这个类允许你直接使用File类调用相关的方法操作文件。Fileinfo提供实例方法成员,用以操作文件,其功能与File相同,其中的差异在于必须产生实例对象调用指定的方法成员。FileStream被设计用以读写文件系统上的数据。7.5创建文件1.用File创建文件用File创建文件,代码如下:usingSystem.IostringstrTempPath=path.GetTempPath();stringstrFileName=Path.Combine(strTempPath,”test.txt”);FileStreamaFile=File.Create(strfIlename);if(File.Exists(trfIlename)) Console.WriteLine(“File‘{0}’havecreated(usefile)”,strFileName);elseConsole.WriteLine(“File‘{0}’createdFAILED(usefile)”,strFileName);aFile.Close();File.Delete(strFileName);7.5创建文件2.使用Fileinfo创建文件使用FileInfo类创建文件,首先应获得对文件的一个FileInfo类引用实例。FileInfobFile=neWFileInfo(StrFileName);然后用Create方法创建文件,返回一个FileStream对象。例如:FileStreamCFile=bFile.Create();if(bFile.Exists)ConSole.WriteLine(File’(0)’haveCreated(UseFileInfo)",strFileName);elseConSole.WriteLine("File‘(0)’Createfailed(UseFileInfo)",strFileName);必须关闭流对象后才能删除文件。例如:cFile.Close();bFile.Delete();7.5创建文件3.使用FileStream创建文件文件流类FileStream允许直接从文件创建对象,读写文件数据,例如创建二进制格式文件或是其它类型的文件,支持异步文件读写操作。使用FileStream类创建文件,可以使用CreateNew方法,但是如果这时被创建的文件存在则会引发异常:FilestrieamdFile=newFileStream(strFileName,FnleMode.create,FileAccess.ReadWrite,FileShare.Read);dFile.Close();//删除文件File.Delete(strFileNmae);7.6读写文件可以使用FileStream对象对文件进行读写,也可以使用File或者Fileinfo类的OpenRead和OpenWrite方法返回的FileStream对象进行读写。【例7.1】用FileStream对象读写文件byte[]byteArray=newbyte[100];char[]charArray=newchar[100];stringstrTemp="Itisatest.\n";//设置目录stringTempPath="c:\\";//合并目录和测试文件到一个路径stringstrFileName=Path.Combine(TempPath,"test.txt");Console.Write(strFileName);//使用FileStream类创建文件,使用OpenOrCreate方法,如果创建的文件存在则打开//FileAccess选用ReadWrite表示进程对文件有读写权限,FileShare选用None//表示不允许在文件关闭前由其他进程读写【例7.1】FileStreamaFile=newFileStream(strFileName,FileMode.OpenOrCreate,FileAccess.ReadWrite,FileShare.None);//将字符串strTemp复制到Unicode字符数组CharArraycharArray=strTemp.ToCharArray();//将Unicode字符数组转化为对应的字节数组Encoderevar=Encoding.UTF8.GetEncoder();evar.GetBytes(charArray,0,charArray.Length,byteArray,0,true);//写文件aFile.Seek(0,SeekOrigin.Begin);aFile.Write(byteArray,0,byteArray.Length);aFile.Close();Console.Write("已成功写入文件");【例7.1】程序运行结果如图7.2所示。图7.2记事本【例7.2】【例7.2】创建与资源管理器相似的界面,实现文件的浏览、创建、删除、文件和目录,同时可以显示文本文件的内容。使用的所有位图文件位于VisualStudio.NET安装目录的Common7\Graphics\bitmaps\Outline子目录和Comnon7\Graphics\bitmaps\Tlbr_W95子目录中。按照下面的步骤创建示例程序:(1)使用Windows应用程序模板创建新的项目,其名称为ch07。(2)把主窗体的名称改为MainForm,并按照下面的代码修改Main函数。staticvoidMain(){Application.Run(newMainForm());}(3)向主窗体中添加主菜单,其名称为maiMenu。它包含3个顶级菜单:文件菜单、目录菜单和视图菜单。表7.5、表7.6和表7.7给出了这3个顶级菜单的结构【例7.2】表7.5文件菜单的结构表7.6目录菜单的结构表7.7视图菜单的结构【例7.2】(4)向主窗体中添加图像列表控件imgLisTbr(用于工具栏)和imgListview(用于树视图和列表视图),向其中添加必要的位图。另外还需要设置这两个图像的TransparentColor属性。(5)向主窗体中添加控件tb(工具栏控件)把它的ImageList属性设置为imgListtbr并把Appearance设为Flat。最后把Buttons属性打开“ToolBarBunon集合编辑器”对话框向工具栏tb添加按钮。如图7.3所示。所有的按钮都没有标题;图7.3ToolBarBunon集合编辑器1【例7.2】(6)向主窗体中添加状态栏控件sb。(7)向窗体中添加面板控件Panel1。并把他的Dock属性设为Top,然后向其添加一个标签控件和一个文本框控件。标签控件的标题为"路径",Dock属性为Left;文本控件的名称为txtPath,Anchor属性为LeftRight。(8)向主窗体中添加面板控件Panel2,把他的Dock属性设置为Left。然后向其添加一个树视图控件tvDir,它的imageList属性为imgListView。StartPostion属性设置为CenterParen,MaximizeBox和MinimumBox属性设置为False。向窗体添加一个标签Label1l,把它的Text属性设置为"请输人文件名。把Modifiers属性设置为Public;向窗体添加一个文本框控件txtFileName,并把它的Modifiers属性设置为Public,向窗体中添加两木按钮btnOK和btnCancel。把它们的Text属性分别设为“确定(&O)”和“取消(&C)”。DialogResult属性升别设置为OK和Cancel。最后把窗体的AcceptButton和CancelButton分别设btnOK和btnCancel。

(9)向主窗体中添加一个分隔条控件Spliter1,把它的Dock属性设置为Left。【例7.2】(10)向主窗体中添加面板控件Panel3,把它的Dock属性设置为Fill。然后向其中添加一个列表视图控件LvFiles,把它的Ahcnor属性设置为Top,Bottom,Left,Right,同时把它的LargeImageList和SmallImageList都设置为imgListView。然后使用列表视图的Columns属性打开“ColumnHeader集合编辑器”对话框添加4列(名称、大小、类型和修改时间),如图7.4所示。图7.4ToolBarBunon集合编辑器2【例7.2】(11)使用“添加Windows窗体”向导创建一个新窗体ContentForm,这个窗体将用来显示文件的内容。向这个窗体中添加一个文本框控件txtContent,把它的MultiLine属性设置为True、ScrollBars属性设置为Both、Dock属性设置为Fill以及把Modifiers属性设置为Public。

(12)使用“添加Windows窗体”向导创建一个新窗体InputFileName,这个窗体将用来输入新文件或新目录的名称,把它的FormBorderStyle属性设置为FixedDialog、StartPosition属性设置为CenterParent、MaximizeBox和MinimumBox属性设置为False。向窗体中添加一个标签控件Label1,把它的Text属性设置为“请输入文件名(不用输入扩展名):”,并把Modifiers属性设置为Public;向窗体中添加一个文本框控件txtFileName,把它的Modifiers属性设置为Public;向窗体中添加两个按钮btnOK和btnCancel,把它们的Text属性分别设置为“确定(&O)”和“取消(&C)”,DialogResult属性分别设置为OK和Cancel。最后把窗体的AcceptButton和CancelButton属性分别设置为btnOK和btnCancel。【例7.2】(13)因为在本例要使用动态链接库kernel32.dll中的非托管代码。所以在类中添加以下的代码。

[DllImport("kernel32")] staticexternuintGetDriveType(stringname); //该函数用来获取磁盘的大小和可用空间

[DllImport("kernel32")]staticexternboolGetDiskFreeSpaceEx( stringlpDirectoryName, reflonglpFreeBytesAvailable, reflonglpTotalNumberOfBytes, reflonglpTotalNumberOffFreeBytes);【例7.2】(14)打开“类视图”窗口,选择MainForm类,然后选择“项目”中的“添加方法”命令或者从快捷菜单中选择“添加”

“添加方法”,命令打开“C#方法向导”对话框,用它来添加ListDrives,如图7.5所示。图7.5C#方法向导1【例7.2】

在对话框中单击“完成”按钮并关闭“C#方法向导”,然后按照下面的代码修改向导生成的代码。//<summary>//获取所有逻辑盘并列出硬盘所有目录//<summary>publicvoidListDrives() { TreeNodetn; //获取系统中的所有逻辑盘

string[]drives=Directory.GetLogicalDrives(); //向树视图中添加节点

tvDir.BeginUpdate(); for(inti=0;i<drives.Length;i++)【例7.2】{ //根据驱动器的不同类型来确定所进行的操作

switch(GetDriveType(drives[i])) { case2: //软驱

//仅向树视图中添加节点而不列举它的目录

//它的图像索引以及处于选择状态下的图像索引分别为0和0 tn=newTreeNode(drives[i],0,0); break; case3://硬盘

//除了向树视图中添加节点外还要列举出它的目录

tn=newTreeNode(drives[i],1,1); ListDirs(tn,drives[i]);//列举硬盘中的目录

break; case5://光驱【例7.2】//仅向树视图中添加节点

tn=newTreeNode(drives[i],2,2); break; default://在默认情况下,按软驱的情况进行处理

tn=newTreeNode(drives[i],0,0); break; } tvDir.Nodes.Add(tn); //把创建的节点添加到树视图中

} tvDir.EndUpdate(); //把C盘设为当前选择节点

tvDir.SelectedNode=tvDir.Nodes[1];}【例7.2】(15)在“类视图”中选中MainForm类,然后从快捷菜单中选择“添加”

“添加字段”或者选择“项目”

“添加字段”命令,打开“C#字段向导”对话框,在其中添加字段nDirLevel,如图7.6所示。以上信息输入完毕以后单击“完成”按钮就可以把nDirLevel添加到MainForm类中。图7.6C#方法向导2【例7.2】(16)按照如下所示的代码修改MainForm的构造函数:publicMainForm() { //Windows窗体设计器支持所必需的

InitializeComponent();

nDirLevel=0; //把列举深度初始化为0 ListDrives(); //获取逻辑驱动器并列出硬盘中的目录

}【例7.2】(17)使用与14相同的方式,向主窗体类中添加代码。privatevoidListDirs(TreeNodetn,stringstrDir){ if(nDirLevel>4) { nDirLevel=0; return; } nDirLevel++; string[]arrDirs; TreeNodetmpNode; try【例7.2】{ //获取指定目录下的所有目录

arrDirs=Directory.GetDirectories(strDir); if(arrDirs.Length==0) return; //把每一个子目录添加到参数传递进来的树视图节点中

for(inti=0;i<arrDirs.Length;i++) { tmpNode=newTreeNode(Path.GetFileName(arrDirs[i]),3,4); //对于每一个子目录,都进行递归列举

ListDirs(tmpNode,arrDirs[i]); tn.Nodes.Add(tmpNode); } } catch { return; }}【例7.2】 //<summary> //列出指定目录下的所有的子目录和文件

//</summary> privatevoidListDirsAndFiles(stringstrDir) { ListViewItemlvi; intnImgIndex; string[]items=newstring[4]; string[]dirs; string[]files; try【例7.2】{ //获取指定目录下的所有子目录

dirs=Directory.GetDirectories(strDir); //获取指定目录下的所有文件

files=Directory.GetFiles(strDir); } catch { return; } //把子目录和文件添加到文件列表视图中

lvFiles.BeginUpdate(); lvFiles.Clear(); //清除列表视图中的所有内容

//添加4个列表头【例7.2】lvFiles.Columns.AddRange(newSystem.Windows.Forms.ColumnHeader[]{chName,chSize,chType,chTime}); //把子目录添加到列表视图中

for(inti=0;i<dirs.Length;i++) { items[0]=Path.GetFileName(dirs[i]); items[1]=""; items[2]="文件夹"; items[3]=Directory.GetLastWriteTime(dirs[i]).ToLongDateString +""+Directory.GetLastWriteTime(dirs[i]).ToLongTimeString(); lvi=newListViewItem(items,3); lvFiles.Items.Add(lvi); }【例7.2】//把文件添加到列表视图中

for(inti=0;i<files.Length;i++) { stringext=(Path.GetExtension(files[i])).ToLower(); //根据不同的扩展名,来设定列表项的图标

if(ext==".txt") { nImgIndex=5; } elseif(ext==".bmp") { nImgIndex=6; } elseif(ext==".hlp") { nImgIndex=7; }【例7.2】elseif(ext==".exe") { nImgIndex=8; } else { nImgIndex=9; } items[0]=Path.GetFileName(files[i]); FileInfofi=newFileInfo(files[i]); items[1]=fi.Length.ToString(); items[2]=ext+"文件"; items[3]=fi.LastWriteTime.ToLongDateString()+""+fi.LastWriteTime.ToLongTimeString(); lvi=newListViewItem(items,nImgIndex); lvFiles.Items.Add(lvi); } lvFiles.EndUpdate(); }【例7.2】 //<summary> //打开列表视图中当前选择的文件

//</summary> privatevoidOpenFile() { if(lvFiles.SelectedItems.Count<=0) { MessageBox.Show(this,"请先选择要打开的文件!","打开文件",MessageBoxButtons.OK,MessageBoxIcon.Exclamation); return; }ListViewItemlvi=lvFiles.SelectedItems[0]; if(Path.GetExtension(lvi.Text).ToLower()!=".txt")

【例7.2】{ MessageBox.Show(this,"只能打开的文本文件!","打开文件错误",MessageBoxButtons.OK,MessageBoxIcon.Exclamation); return; } ContentFormfileForm=newContentForm(); fileForm.Text="查看文件内容-"+lvi.Text; stringfilename=tvDir.SelectedNode.FullPath+"\\"+lvFiles.SelectedItems[0].Text; StreamReadersr=newStreamReader(filename); ArrayListlines=newArrayList(); //从文件中读取内容并把它们赋给显示文件内容对象框中txtContent的文本框

while(sr.Peek()!=-1) { lines.Add(sr.ReadLine()); //一次读取一行数据

}【例7.2】fileForm.txtContent.Lines=(string[])lines.ToArray(Type.GetType("System.String")); sr.Close(); fileForm.txtContent.Select(0,0); fileForm.ShowDialog(this);//显示对话框}//<summary>//在当前选择的目录中创建一个新的文本文件//</summary>privatevoidNewFile(){stringfilename=""; InputFileNameformFileName=newInputFileName(); if(formFileName.ShowDialog(this)==DialogResult.OK) filename=tvDir.SelectedNode.FullPath+“\\”+formFileName.txtFileName.Text+".txt"; StreamWritersw=newStreamWriter(filename); if(sw!=null)【例7.2】{ //创建新文件后,向其中写入测试内容

sw.Write("新创建的文本文件\n演示基本的文件输/输出操作"); sw.Close(); ListDirsAndFiles(tvDir.SelectedNode.FullPath); } } privatevoidlvFiles_DoubleClick(objectsender,System.EventArgse) { ListViewItemlvi=lvFiles.SelectedItems[0]; if(lvi.ImageIndex==3) { TreeNodetn=tvDir.SelectedNode; for(inti=0;i<tn.Nodes.Count;i++) { if(string.Compare(tn.Nodes[i].Text,lvi.Text)==0) tvDir.SelectedNode=tn.Nodes[i]; }【例7.2】return; } OpenFile();}

//<summary>//删除当前选择的文件//</summary>privatevoidDeleteFile(){ if(lvFiles.SelectedItems.Count<=0) { MessageBox.Show(this,"请先选择要删除的文件!","删除文件" ,MessageBoxButtons.OK,MessageBoxIcon.Exclamation); return; }【例7.2】stringfilename=tvDir.SelectedNode.FullPath+"\\"+lvFiles.SelectedItems[0].Text;if(lvFiles.SelectedItems[0].ImageIndex==3){ MessageBox.Show(this,"当前所选的是目录,不是文件,不能进行删除!", “删除文件",MessageBoxButtons.OK,MessageBoxIcon.Exclamation); return; } else File.Delete(filename); ListDirsAndFiles(tvDir.SelectedNode.FullPath);}//<summary>//在当前选择的目录中创建一个新的子目录//</summary>privatevoidNewDirectory()【例7.2】 { InputFileNameformDir=newInputFileName(); formDir.Text="输入目录名称"; formDir.label.Text="请输入新目录名称"; if(formDir.ShowDialog(this)==DialogResult.OK) { tvDir.SelectedNode.Nodes.Add(newTreeNode(formDir.txtFileName.Text,3,4)); } } //<summary> //删除当前选择的目录及其所有的子目录

//</summary> privatevoidDeleteDirectory()【例7.2】{if(MessageBox.Show(this,“确定删除所有的目录"+tvDir.SelectedNode.FullPath+"吗?","删除目录",MessageBoxButtons.OKCancel,MessageBoxIcon.Exclamation)==DialogResult.OK){ Directory.Delete(tvDir.SelectedNode.FullPath,true); tvDir.SelectedNode.Remove(); }}//<summary>//改变列表视图的显示模式,同时更新菜单项和工具栏按钮的状态//</summary>privatevoidChangeListViewMode(Viewnewview)【例7.2】 { miLargeIcon.Checked=false; miSmallIcon.Checked=false; miList.Checked=false; miDetail.Checked=false; tbbLargeIcon.Pushed=false; tbbSmallIcon.Pushed=false; tbbList.Pushed=false; tbbDetail.Pushed=false; switch(newview)【例7.2】{ caseView.LargeIcon: lvFiles.View=View.LargeIcon; tbbLargeIcon.Pushed=true; miLargeIcon.Checked=true; break; caseView.SmallIcon: lvFiles.View=View.SmallIcon; tbbSmallIcon.Pushed=true; miSmallIcon.Checked=true; break;【例7.2】caseView.List: lvFiles.View=View.List; miList.Checked=true; tbbList.Pushed=true; miList.Checked=true; break; default: lvFiles.View=View.Details; tbbDetail.Pushed=true; miDetail.Checked=true; break; }}【例7.2】(18)使用“属性”窗口为菜单项的Click事件填加处理方法。

//新建文件

privatevoidmiNewFile_Click(objectsender,System.EventArgse){ NewFile(); }//打开文件

privatevoidmiOpenFile_Click(objectsender,System.EventArgse) { OpenFile(); }//删除文件

privatevoidmiDelFile_Click(objectsender,System.EventArgse) { DeleteFile(); }//退出程序

privatevoidmiExit_Click(objectsender,System.EventArgse) { this.Close(); }//新建目录

privatevoidmiNewDir_Click(objectsender,System.EventArgse) { NewDirectory(); }【例7.2】//删除目录

privatevoidmiDelDir_Click(objectsender,System.EventArgse) { DeleteDirectory(); }//大图标显示列表视图

privatevoidmiLargeIcon_Click(objectsender,System.EventArgse) { ChangeListViewMode(View.LargeIcon); }//小图标显示列表视图

privatevoidmiSmallIcon_Click(objectsender,System.EventArgse) { ChangeListViewMode(View.SmallIcon); }//列表显示列表视图

privatevoidmiList_Click(objectsender,System.EventArgse) { ChangeListViewMode(View.List); }//详细显示列表视图

privatevoidmiDetail_Click(objectsender,System.EventArgse) { ChangeListViewMode(View.Details); }【例7.2】为工具栏的ButtonClick事件添加处理方法,代码如下:privatevoidtb_ButtonClick(obje

温馨提示

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

评论

0/150

提交评论