使用Dir函数遍历和目录.doc_第1页
使用Dir函数遍历和目录.doc_第2页
使用Dir函数遍历和目录.doc_第3页
使用Dir函数遍历和目录.doc_第4页
使用Dir函数遍历和目录.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

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

文档简介

使用Dir函数遍历文件和目录ivbscriptVb编程中,可以通过使用控件DriveListBox 、DirListBox和FileListBox的组合,来得到某个目录下的文件或文件夹,继而可以通过递归调用来得到磁盘上所有的文件或文件夹,但是,如果可以仅通过一个函数就能完成以上的工作,何乐而不为?第一部分:Dir函数语法:Dir(pathname, attributes)作用:返回一个 String,用以表示一个文件名、目录名或文件夹名称。参数说明:pathname:字符串,要查找的文件所在目录名称;attributes:常数,指定了文件的属性。数值和描述见下:常数 值 描述 vbNormal0 (缺省) 没有属性的文件VbReadOnly1 只读文件vbHidden 2 隐藏文件VbSystem 4 系统文件vbVolume 8 卷标文件vbDirectory 16 无属性文件及其路径和文件夹在使用中,我们可以使用通配符来制定要查找的文件,比如:dir(c:*.txt)返回C盘下后缀名为”txt”的文件;dir(c:?est.txt)返回C盘下后缀名为”txt”,文件名四个字符且包含”est”的文件。关键点:1、要得到其它匹配 pathname 的文件名,可再次调用 Dir,且不要使用参数;2、如果已没有合乎条件的文件,则 Dir 会返回一个零长度字符串 ();3、Dir返回的文件或文件名是无序的。第二部分:递归调用从第一部分我们可以看出,如果我们先使用一个带有Pathname参数的Dir函数,然后不断使用不带参数的Dir函数,那么我们就可以获得查找目录下的所有的文件或文件夹。比如FileName = Dir(“C:”, vbDirectory) If FileName Then Do While FileName 获得的文件名不是空字符串的话继续执行Dosomething这里是调用处理过程 FileName = Dir调用无参Dir函数 Loop End If第三部分:简单图形界面在程序中,不仅仅是后台程序,更重要的还有图形界面。这里使用StatusBar控件、ImageList控件、TreeView控件和ListView控件将写入文本中保存的目录和文件显示出来。由于以上几个控件不是默认的控件,要使用这几个控件,应该使用菜单“工程部件”,然后在“控件”选项卡中选择“Microsoft Windows Common Controls 6.0”,单击“确定”,这四个控件就被加入到了工具箱中。我们在FormMain中放置一个StatusBar控件、两个ImageList控件、一个TreeView控件和一个ListView控件,具体放置如下图所示:TreeView1ListView1StatusBar1ImageList1和ImageList2 ImageList1用于TreeView1中显示图片,图像的大小为1616,图像主要用到了以下几个:ImageList2用于ListView1中显示图片,图像大小为3232,图像用到了以下几个:设置TreeView1控件的图像列表为ImageList1;设置ListView1控件的普通图像列表为ImageList2,小图标列表为ImageList1。(一)StatusBar控件的简单使用在StatusBar1控件上点击鼠标右键,选择“属性”。在“通用”选项卡中选择“样式”为“0 - sbrNormal”(多窗格样式)。在“窗格”选项卡中,通过“插入窗格”共建立了四个窗格,其中索引1、3号窗格的文本分别为:“包含目录”、“包含文件”;2、4号窗格的文本为空,在编程的时候可以这样设定某个窗格的文本:StatusBar1.Panels(Index).Text = “这里是设定的文本”Index对应设定的索引号(二)TreeView控件的简单使用在TreeView1控件中添加一个节点的方法如下:TreeView1.Add(relative, relationship, key, text, image, selectedimage)用法可参看Msdn :Add 方法(Nodes 集合)一节。在程序中可以这样使用:Dim nodX As Node 声明 Node 变量。Set nodX = TreeView1.Nodes.Add(, , r, Root,1,2)第一个节点,文本为”Root”,”r”是这个节点的标识字符串,1是在关联的ImageList控件中的图像的索引,2是在 Node 被选中时显示的图像索引。Set nodX = TreeView1.Nodes.Add(r, tvwChild, child1, Child,3,4)这个节点是节点1 (Root) 的子节点,其中”r”是关联节点的标识字符串,tvwChild是此节点和节点1之间的关联方式(子节点),文本为”Child”,”child1”是这个节点的标识字符串另外,我们在程序中还要用到Treeview控件中Node对象的Tag属性,它可以帮助该节点记录额外的数据:NodX.Tag = “额外数据”(三)ListView控件的简单使用设置ListView1控件的外观:ListView1.View=ValueValue有四个值,默认是lvwIcon 0(图标),即显示为图标和文本标签模式。在ListView1控件中添加对象的方法如下:ListView.ListItems.Add.Add(index, key, text, icon, smallIcon)程序中可以这样使用:Dim ItmX As ListItemSet ItmX = ListView1.ListItems.Add(, , “显示文本”, 1, 2)第四部分:文件读写操作文件的写操作:Open Filename For Output As #1Print #1, “写入的数据”Close #1文件的读操作:Open Filename For Input As #2 Line Input #2, SaveLineClose #2另外需要重点提及Seek 函数和Seek 语句:Seek函数可以返回文件当前读写的位置:Seekpos = Seek(filenumber)Seek语句可以设置文件当前读写的位置:Seek #filenumber, SeekPos第五部分:主要程序分析程序包含一个模块(Model1)和一个窗体(FormMain)。在程序中采用如下方式存放文件:文件夹全路径文件夹名文件名主程序以及说明如下:Model1部分:Public Declare Function timeGetTime Lib winmm.dll () As Long返回从Windows开始启动经过的毫秒数Sub main()FormMain.Show显示主窗体End SubPublic Sub CreateList(DirPath As String)创建文件列表到文件Dim FileName As StringDim DirnamePath() As String记录目录的全路径Dim DirName() As String记录目录的名称Dim DirCount As Integer也就是DirnamePath()、DirName() 中的个数Dim i As IntegerDirCount = 0ReDim DirName(DirCount)ReDim DirnamePath(DirCount)If Right(DirPath, 1) = Then DirPath = Left(DirPath, Len(DirPath) - 1)开始本来有这个防止传入不带”的路径,后来改在函数调用的之前处理这个问题Print #1, & DirPath表示目录全路径;表示目录名称;表示文件名称其中,文件名称和目录名称不要求全路径DirPath = DirPath & 如果给出的路径不带,那么就加上,但在实际过程中不用判断,直接加上FileName = Dir(DirPath, vbDirectory)这里调用Dir函数获得第一个匹配的文件或目录名。需要注意的是:Dir每次返回的文件或目录名并不是按照某个次序返回参数vbDirectory:指定无属性文件及其路径和文件夹。想得到其它匹配的文件或目录名,再一次调用无参Dir() If FileName Then Do While FileName If Left(FileName, 1) . Then防止”.”或者”.” If (GetAttr(DirPath & FileName) And vbDirectory) 16 Then 如果不是文件夹的话 Print #1, & FileName Else If DirName(0) Then 如果DirName(0)已经使用 DirCount = DirCount + 1使数组下标加一 ReDim Preserve DirName(DirCount) ReDim Preserve DirnamePath(DirCount) End If DirName(DirCount) = & FileName DirnamePath(DirCount) = DirPath & FileName End If End If FileName = Dir调用无参Dir函数 Loop End If If DirName(0) Then 如果dirName(0)中有信息,那么就执行以下语句 For i = 0 To DirCount循环1 Print #1, DirName(i)这里是将得到的目录写入文件,与循环2分开 Next For i = 0 To DirCount循环2 Call CreateList(DirnamePath(i)递归调用 CreateList 函数 Next End If For i = 0 To DirCount这里是循环1和循环2的结合,造成的错误是 Print #1, DirName(i)写入一个目录,然后调用递归函数, Call CreateList(DirName(i)结果得到的文件内容与我们期待的不同 NextEnd SubFormMain部分:Private Sub MnuCreate_Click()创建文件Dim atime1 As Long返回从Windows开始启动经过的毫秒数Dim atime2 As Long返回从Windows开始启动经过的毫秒数atime = timeGetTime这里是我用来测试写入文件所用时间Open App.Path & dirlist.txt For Output As #1这里假设是存在程序目录下的dirlist.txtCall CreateList(c:) 注意,这里传递不带的参数,在CreateList中将会处理”。Close #1atime2 = timeGetTime MsgBox (atime2 - atime1)显示写入文件耗时,这里实际耗时769ms,以我的C盘为例,包含23330个文件;1721个文件夹其中未包含系统以及隐藏文件或文件夹生成文件大小266,429字节MsgBox create file ok提示创建文件成功End SubPrivate Sub MnuFileRead_Click()Dim ReadLine As String从文件中读入一行的数据存放在此Dim ReadHead As StringDim ReadMid As StringDim ReadEnd As StringDim ReadPos As IntegerDim NodX As NodeDim Seekpos As LongOpen D:vbsavenewfiledirlist.txt For Input As #2打开文件 Line Input #2, ReadLine读入文件第一行,这里是最初的目录路径Set NodX = TreeView1.Nodes.Add( ,tvwFirst, Mid(ReadLine, 4, Len(ReadLine) - 3) & , Mid(ReadLine, 4, Len(ReadLine) - 3), 4, 5)Seekpos = Seek(2) 定位目录全路径在文件中的字节位置这里将给我们在ListView1中显示文件和目录提供方便 NodX.Tag = Seekpos 把Seekpos记录到Tag ,方便以后调用 Do Until EOF(2)读入文件直到文件结尾 Line Input #2, ReadLine仍然是按每一行的方式读入 Seekpos = Seek(2)记录位置 ReadHead = Left(ReadLine, 3) Select Case ReadHead Case 如果是的话才做处理 ReadPos = InStrRev(ReadLine, ) ReadMid = Mid(ReadLine, 4, ReadPos - 3) ReadEnd = Right(ReadLine, Len(ReadLine) - ReadPos) Set NodX = TreeView1.Nodes.Add(ReadMid, tvwChild, ReadMid & ReadEnd & , ReadEnd, 4, 5) NodX.Tag = Seekpos把Seekpos记录到Tag ,方便以后调用 Case 不做处理 Case 不做处理 End Select LoopClose #2关闭文件End SubPrivate Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node)当TreeView1上的某个节点被鼠标点击时Dim SeekFile As Long文件读取位置Dim ReadLine1 As StringDim ReadHead1 As StringDim GetFD As String 获得文件或目录名Dim ItmX As ListItemDim DirCount As Long记录目录数目Dim FileCount As Long记录文件数目ListView1.ListItems.Clear清除ListView1中的原有项目SeekFile = Node.Tag这里就要用到Node.Tag中记录的位置了If Node.Expanded = True Then Node.Expanded = False Else Node.Expanded = TrueMe.Caption = Node.FullPath设置窗体的Caption为点击节点的全路径Open App.Path & dirlist.txt For Input As #3打开文件 Seek #3, SeekFile指定文件读取位置 Do Until EOF(3)读入文件直到文件结尾 Line Input #3, ReadLine1读入一行数据 ReadHead1 = Left(ReadLine1, 3)获得标记 GetFD = Right(ReadLine1, Len(ReadLin

温馨提示

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

评论

0/150

提交评论