导读:file1 = "c:Myfile10001.txt" Const ForReading = 1,ForWriting = 2,ForAppending = 3 Dim fs1,f1 Set fs1 = CreateObject("Scripting.FileSystemObject") Set f1 = fs1.OpenTextFile(file1,ForReading,TristateFalse) MsgBox f1.Readline MsgBox f1.Readlin
file1 = "c:Myfile10001.txt"
Const ForReading = 1,ForWriting = 2,ForAppending = 3
Dim fs1,f1
Set fs1 = CreateObject("Scripting.FileSystemObject")
Set f1 = fs1.OpenTextFile(file1,ForReading,TristateFalse)
MsgBox f1.Readline
MsgBox f1.Readline
MsgBox f1.Readline
MsgBox f1.Readline
f1.Close
'函数:一次性读文件至变量,非常快 Function GetFile(FileName As String) As String Dim i As Integer,s As String,BB() As Byte If Dir(FileName) = "" Then Exit Function i = FreeFile ReDim BB(FileLen(FileName) - 1) Open FileName For Binary As #i Get #i,BB Close #i s = StrConv(BB,vbUnicode) GetFile = s End Function '调用举例: dim s as string s=GetFile("c:1.txt")
文件系统对象FSO的英文全称是File System Object ,这种对象模型提出了有别于传统的文件操作语句处理文件和文件夹的方法。通过采用object.method这种在面向对象编程中广泛使用的语法,将一系列操作文件和文件夹的动作通过调用对象本身的属性直接实现。
FSO(File System Object)对象模型 从 Visual Basic 的第一版至今,VB中有关文件的处理都是通过使用 Open 、Write以及其它一些相关的语句和函数来实现的。随着软件技术的不断发展,加上面向对象编程概念的日臻成熟,这些文件操作语句已经不能适应软件不断增加的复杂程度的需要了。因此,从VB6.0开始,微软提出了一个全新的文件系统对象FSO。
(三)Folder对象 在FSO 对象模型中,提供了丰富的有关文件夹操作的方法,这些方法分别是: FileSystemObject对象有关文件夹的方法: CreateFolder :创建一个文件夹 。 DeleteFolder:删除一个文件夹 。 MoveFolder :移动一个文件夹 。 CopyFolder:复制一个文件夹 。 FolderExists: 查找一个文件夹是否在驱动器上 。 GetFolder :获得已有Folder对象的一个实例 。 GetParentFolderName: 找出一个文件夹的父文件夹的名称。 GetSpecialFolder: 找出系统文件夹的路径。 Folder对象的方法: Delete :删除一个文件夹 。 Move :移动一个文件夹 。 Copy:复制一个文件夹。 Name:检索文件夹的名称。 在此需要强调一点,前面我们曾经提到过FSO对象模型包含的方法是冗余的,所以Folder对象的Delete、Move、Copy方法和FileSystemObject对象的DeleteFolder、MoveFolder、CopyFolder方法实际上是相同的,因此在实际使用中可以任选其中的一种。和Drive对象一样,下面通过实例演示Folder对象的应用。在VB下新建一个工程,然后在上面添加三个命令按钮,然后在Form1的通用部分加入以下代码: Option Explicit Dim fsoTest As New FileSystemObject Dim folder1 As Folder 并且分别在三个命令按钮的click事件输入以下代码: Private Sub CmdCreate_Click() ' 获取 Folder 对象。 Set folder1 = fsoTest.GetFolder(“C:") '创建文件夹 fsoTest.CreateFolder (“C:Test") MsgBox “folder C:Test has created" End Sub Private Sub CmdDelete_Click() ' 获取 Drive 对象。 Set folder1 = fsoTest.GetFolder(“C:") '删除文件夹 fsoTest.DeleteFolder (“C:Test") MsgBox“folder C:Test has deleted" End Sub Private Sub CmdGetPro_Click() '获取文件夹的有关信息 Dim sReturn As String Set folder1 = fsoTest.GetFolder(“C:Windows") 'sReturn = “The folder's Attributes is " & folder1.Attributes & vbCrLf '获取最近一次访问的时间 sReturn = sReturn & “The folder's last access time is " & folder1.DateLastAccessed & vbCrLf '获取最后一次修改的时间 sReturn = sReturn & “The folder's last modify time is " & folder1.DateLastModified & vbCrLf '获取文件夹的大小 sReturn = sReturn & “The folder's size is " & FormatNumber(folder1.Size / 1024,0) sReturn = sReturn & “Kb" & vbCrLf '判断文件或文件夹类型 sReturn = sReturn & “The type is " & folder1.Type & vbCrLf MsgBox sReturn End Sub 上述代码中提到的CreateFolder方法的语法形式为object.CreateFolder(foldername)。foldername指定了要创建的文件夹的名称,而DeleteFolder方法的语法形式为object.DeleteFolder folderspec[,force],其中,folderspec用来指定要删除的文件夹的名称,force是一个可选的布尔型参数,如果希望删除只读属性的文件夹则将该值设为TRUE,默认为FALSE。至于代码中用到的 Folder 对象的属性限于篇幅,就不详细介绍了,读者可参考VB文档中的相关内容。
(四)File对象和TextStream对象 由于有关File对象的复制,删除,移动等操作和Folder对象类似,所以这部分内容就不再重复。这里主要讲述利用File对象和TextStream对象操作文本文件。 通常对文本文件的操作包括在文本文件中创建数据,在文本文件中添加数据,删除文本文件的数据等操作。这些操作都可以通过File对象和FileSystemObject对象的相关方法完成。不过在使用之前,首先要创建一个文本文件,这可以通过三种方法完成。一种方法是使用FileSystemObject对象的 CreateTextFile 方法。要创建一个空文本文件,可以用以下语句: Dim fsoTest As New FileSystemObject,fil1 As File Set fil 1= fsoTest.CreateTextFile(“c:testfile.txt",True) 第二种方法是使用 FileSystemObject 对象带 ForWriting 标志设置的 OpenTextFile 方法, Dim fsoTest As New FileSystemObject,ts1 As New TextStream Set ts1 = fsoTest.OpenTextFile(“c:testfile.txt",ForWriting) 第三种方法是使用File对象的带 ForWriting 标志设置的 OpenAsTextStream 方法: Dim fsoTest As New FileSystemObject,fil 1As File,ts 1As TextStream Set fsoTest = CreateObject(“Scripting.FileSystemObject") fsoTest.CreateTextFile (“c:testfile.txt") Set fil1 = fsoTest.GetFile(“c:testfile.txt") Set ts1 = fil1.OpenAsTextStream(ForWriting) 其中CreateTextFile方法的第一个参数用来指定,第二个参数用来指定如果磁盘上已经存在要创建的文件是否覆盖,TRUE表示覆盖,FALSE表示不覆盖,省略表示不覆盖;OpenTextFile方法的第一个参数确定要打开的文本文件,第二个参数表示对该文件进行写操作;OpenAsTextStream方法的参数和OpenTextFile方法的第二个参数含义相同。 在创建了写入数据的文本之后就可以利用TextStream 对象的 Write 或 WriteLine 方法了,它们之间的区别在于 WriteLine 在指定的字符串末尾添加换行符,而Write方法没有。如果想要向文本文件中添加一个空行,可以使用 WriteBlankLines 方法。 在完成写的动作之后,用Close方法关闭打开的文本文件。如果要读取一个存在的文本文件的内容,就要用到 TextStream 对象的 Read、 ReadLine 或 ReadAll 方法;这些方法的区别是 Read:从一个文件中读取指定数量的字符 ;ReadLine:读取一整行(紧跟,但不包括,换行符); ReadAll :读取一个文本文件的所有内容。下面在一个VB的工程中演示上述的效果。 在VB中新建一个工程,然后在Form1上添加两个命令按钮,然后输入以下代码: Private Sub CmdRead_Click() Dim fsoTest As New FileSystemObject,file1 As File,ts As TextStream,s As String Set file1 = fsoTest.GetFile(“C:testfile.txt") Set ts = file1.OpenAsTextStream(ForReading) '读取一行 s = ts.ReadLine MsgBox s ts.Close End Sub Private Sub CmdWrite_Click() Dim txtfile As File,ts As TextStream Set txtfile = fsoTest.GetFile(“c:testfile.txt") Set ts = txtfile.OpenAsTextStream(ForWriting) '使用Write方法写入一行。 ts.Write (“This is only a Test") ' 写入一行带有换行符的文本。 ts.WriteLine (“Testing 1,2,3.") ' 向文件中写入三个换行符。 ts.WriteBlankLines (3) ts.Close End Sub 在这里我们假设已经在磁盘上建立了一个名为testfile.txt的文件。在按下F5运行时,先单击Write写入数据,然后按下Read读取数据。
三、结束语 通过上面的介绍,我们可以看到FSO对象模型的确在传统的文件操作语句之外,提供了一种更方便,功能更强大的访问文件的操作方法。不过,我们还需要注意到FSO对象模型目前还不完善,当前使用的FSO对象模型还不支持创建随机文件或二进制文件。要创建随机文件和二进制文件,仍然要使用带 Random 或 Binary 标志的 Open 命令。但从目前FSO对象模型的实际应用来看,我们仍然可以将FSO对象模型作为一种比较简便的文件操作解决方案。 (注:上述代码均在VB6.0 SR3)
File System Object 在VBscript 里的应用. 在代码内操作文本文件、文件夹及驱动器。它是脚本运行期库提供的对象之一,对于服务器ASP页面内的VBScript和JScript都有效。如果页面的扩展名为.hta(表示它们是HTA的一部分),它也可用在客户端的IE 5中。本节仅讨论在服务器上的ASP脚本如何使用FileSystemObject对象。 超级文本应用程序(HTA)由指定的"受信任的"页面组成,在页面的<HEAD>段里包含<HTA: APPLICATION>元素。例如: <HTA:APPLICATION ID="objMyApp" APPLICATIONNAME="myApp"> 这些页面可以使用客户端脚本引擎中的一些不常用特性,这些特性中有FileSystemObject对象和TextStream对象。关于超级文本应用程序的更多信息,请访问Microsoft Workshop网站。 可以使用下面的程序创建一个FileSystemObject对象实例: ' In VBScript: Dim objMyFSO Set objMyFSO = Server.CreateObject("Scripting.FileSystemObject") // In JScript: var objMyFSO = Server.CreateObject('Scripting.FileSystemObject'); <!-- Server-side with an OBJECT element --> <OBJECT RUNAT="SERVER" SCOPE="PAGE" ID="objFSO" PROGID="Scripting.FileSystemObject"> </OBJECT> 在ASP页面里,增加一个对于FileSystemObject类型库的引用是非常有用的。这允许使用它直接定义的内置常数,不用像过去那样用数字等效表达式代替。整个脚本运行期库的类型库可以增加到任何ASP页面中,代码如下: <!-- METADATA TYPE="typelib" FILE="%systemroot%System32scrrun.dll" -->如果你是在另一个目录下安装Windows,必须编辑FILE的属性值。
1.怎么通过代码创建一个文本文件,并读取,更新内容 以上为随即方式打开的文本文件 dim gfilenum as integer gfilenum = FreeFile Open "文件路径及文件名" For Random As gfilenum len=3 '以随即方式打开一文件如果文件不存在就新建 用get #gfilenum,记录在文件中位置,要放取得的数据的变量'读取操作 用put #gfilenum,要放着要写入数据的变量'写操作 close #filenum'关闭文件 以下为顺序方式打开的文件 dim gfilenum as integer gfilenum = FreeFile Open "文件路径及文件名" For output As gfilenum '以写入方式打开文本 print #gfilenum,要写入的文本 write #filenumber,要写入的文本
dim gfilenum as integer gfilenum = FreeFile Open "文件路径及文件名" For input As gfilenum '以读出方式打开文本 input #gfilenum,用来放读取的内容的内存变量名 还可用line input#,input()等读取更详细的查msdn
2.VB读取文本文件时,调用TextStream 对象中使用OpenTextFile报错了。 如果是 Set f = fs.OpenTextFile("E:tabletrace.txt",forreading,True,TristateUseDefault) 出现错误: Run-time error '5': Invalid procedure call or argument
如果是 Set f = fs.OpenTextFile("E:tabletrace.txt)" 则不会报错。
把文本文件内容读取TextBox: Dim TempFile As Long Dim LoadBytes() As Byte
TempFile=FreeFile Open 文件名 For Binary As #TempFile Redim LoadBytes(1 To Lof(TempFile)) As Byte Get #TempFile,LoadBytes Close TempFile
Text1.Text=StrConv(LoadBytes,vbUniCode)
把TextBox内容写入文本文件: Dim TempFile As Long Dim SaveBytes() As Byte
SaveBytes=StrConv(Text1.Text,vbFromUniCode)
TempFile=FreeFile Open 文件名 For Binary As #TempFile Put #TempFile,SaveBytes Close TempFile
4. 打开文本文件 open app.path &"/你的文本文件名.txt" for output as #1 Message.Name=text1.text Message.Phone=text2.text ....................... message.PostCode=text5.text Put #1,i,Message '(此处i=1,如要多次写入,可用循环设置i的值) close #1 '写入的同时即已保存 查询的话就取出文本里的内容,用instr()函数就可实现了
5. 查找vbCrLf、vbLf换行标记
6.怎样读取一个文本文件的全部内容 dim lenfile as integer dim filenum as integer filenum=freefile() open "file.dat" for input as filenum lenfile=lof(#filenum) strfile=input(lenfile,#filenum)'将所有数据放入变量strfile中 close filenum
Private Sub Form_Load() Const ForReading = 1,ForWriting = 2 Dim fso,f Dim SkipLineInFile As String Set fso = CreateObject("Scripting.FileSystemObject") Set f = fso.OpenTextFile("c:testfile.txt",ForWriting,True) f.Write "Hello world!" & vbCrLf & "VB Script is fun!" Set f = fso.OpenTextFile("c:testfile.txt",ForReading) SkipLineInFile = f.readall Debug.Print SkipLineInFile
End Sub
7.把文本文件内容读取TextBox: Dim TempFile As Long Dim LoadBytes() As Byte
TempFile=FreeFile Open 文件名 For Binary As #TempFile Redim LoadBytes(1 To Lof(TempFile)) As Byte Get #TempFile,vbUniCode)
8. 把TextBox内容写入文本文件: Dim TempFile As Long Dim SaveBytes() As Byte
SaveBytes=StrConv(Text1.Text,SaveBytes Close TempFile
9.已知文本文件,要从中搜索一段特定的字符串信息。如搜索[MAGIC_DATABASES],该怎么做? dim str as string open commondialog1.filename for input #1 input #1,str dim where as integer where = instr(str,"magic_databases")
10. Line Input # 语句示例 本示例使用 Line Input # 语句从顺序文件中读入一行数据,并将该行数据赋予一个变量。本示例假设 TESTFILE 文件内含数行文本数据。
Dim TextLine Open "TESTFILE" For Input As #1 ' 打开文件。 Do While Not EOF(1) ' 循环至文件尾。 Line Input #1,TextLine ' 读入一行数据并将其赋予某变量。 Debug.Print TextLine ' 在立即窗口中显示数据。 Loop Close #1 ' 关闭文件。
Dim of As Object Dim fs as Object dim TextLine as string
Set fs=createobject("scripting.Filesystemobject") set of=fs.OpenTextFile(app,path+"myfile.aaa") //myfile.aaa 是一个文本文件 textling=of.readline //如果你要读取第14行,可以用一个循环,跳过前面的13行,如下 dim lop as integer for lop=0 to 12 of.skip next //然后再读取
我发现都有问题举例 1.代码 Public Function nnnn(ByVal s As String) As String '解密 On Error Resume Next Dim ss As String,i As Byte,lens As Byte lens = Len(s) For i = 1 To lens ss = ss & Chr(Asc(Mid(s,1)) - lens - i) Next nnnn = ss End Function
Public Function mmmm(ByVal s As String) As String '加密 On Error Resume Next Dim ss As String,1)) + lens + 1) Next mmmm = ss End Function 当文件中有“!~”时出错
XOR加密 Dim I as long
For I=1 To UBound(LoadBytes) LoadBytes(I)=LoadBytes(I) Xor &HFF Next I
if dir(myfile)="" then exit sub FileNumber = FreeFile ' 取得未使用的文件号。 On Error GoTo ErrorHandler ' 打开错误处理程序。 Open MyFile For Output As #FileNumber ' 打开输出文件。 Kill "TESTFILE" ' 试图删除已打开的文件。 Exit Sub ' 退出程序,以避免进入错误处理程序。
ErrorHandler: ' 错误处理程序。 Select Case Err.Number ' 检查错误代号。 Case 55 ' 发生“文件已打开”的错误。 Close #FileNumber ' 关闭已打开的文件。 Case Else ' 处理其他错误状态 . . . End Select Resume ' 将执行返回到发生错误的语句。
14.打开一个文本文件怎样最快? Dim fn As Long,ts As String fn = FreeFile Open "c:test.txt" For Binary As #fn ts = StrConv(InputB(LOF(fn),#fn),vbUnicode) Text1 = ts Close #fn
Dim fn As Long,ts As String fn = FreeFile Open "c:test.txt" For Binary As #fn ts = Input(LOF(fn),#fn) Text1 = ts Close #fn
19.在文件结尾写上新的行: Dim tFileNumber As Integer Dim tWriteStr As String '要写的字符串。 tFileNumber=FreeFile tWriteStr=你需要的内容 Open pFileName For Append As #tFileNumber 'Append为在文件结尾顺序写文件夹。或者以Output模式打开,使用Seek(tFileNumberm,LOF(tFileNumber))也可以定义指针到文件结尾。 Print #tFileNumber,tWriteStr '写到文件里。 Close #tFileNumber
Open "1.txt" For Input As #1 Open "1.txt" For Output As #2 Print #2,"小仙妹" '写1.txt Seek #1,1 Line Input #1,Ld '读1.txt Seek #1,1 '如果去掉这句,你看看读第而次的时候会怎样?(肯定出错了!) Line Input #1,Ld Close #2 Close #1
典型的读文件:
Dim tFileNumber As Integer '文件号 Dim tLoadStr As String '读文件行的变量 tFileNumber=FreeFile 'FreeFile是取当前闲置的文件号的函数。实现自动分配一个文件号码。这样使这段程序几乎可以兼容在程序所有的部分。 Open pFileName For Input As #tFileNumber 'Input方式为顺序读文件。 Line Input #tFileNumber,tLoadStr 'Line Input语句为整行读取,否则如果只用Input则遇到逗号也算一个段落。如果你想读第12行,在不知道12行的位置的前提下,那要读12次的。 Close #tFileNumber
方法一(传统方法): Dim tFileNumber As Integer Dim tLoadStr As String Dim tEnd As Long '你要读的行数。 Dim tAdd As Long '记数 tFileNumber=FreeFile tEnd=12 '假设你要读12行 Open pFileName For Input As #tFileNumber Do Until EOF(tFileNumber) Or tAdd=tEnd 'EOF函数是判断是否已经到了结尾或到了你想找的行。 Line Input #tFileNumber,tLoadStr tAdd=tAdd+1 '记数累加,读一行加一。 Loop Close #tFileNumber
方法二(比较实用的): Dim tFileNumber As Integer Dim tLoadStr As String Dim tEnd As Long '你要读的行数。 Dim tAdd As Long '记数 tFileNumber=FreeFile tEnd=12 '假设你要读12行 Open pFileName For Input As #tFileNumber For tAdd=1 To tEnd Line Input #tFileNumber,tLoadStr If EOF(tFileNumber) Then Exit For '到结尾则退出循环。 Next Close #tFileNumber
以上都是我在编程当中总结出来的非常惨痛的教训,希望你不要步我后尘。
20.用FSO来读文本文件时怎样返回该文本文件的总行数? Set openfile = openfso.OpenTextFile(CommonDialog1.FileName) Static i As Integer i = 0 Do While Not openfile.AtEndOfLine openfile.ReadLine i = i + 1 Loop MsgBox "共" & i & "行",vbOKOnly,"hello"
21.treeview 能够生成两层以上的节点吗? Private Sub Form_Load() Dim NodX As Node Set NodX = TreeView1.Nodes.Add(,"R","ROOT") Set NodX = TreeView1.Nodes.Add("R",tvwChild,"key1","CHILD") Set NodX = TreeView1.Nodes.Add("key1","key2","CHILD_CHILD") NodX.EnsureVisible End Sub
22.怎样获得一个文件夹里的文件数,并且分别得到里面的文件名? dim sTemp as string dim sFileName(100) as string '记录文件名 dim intTotal as integer '文件总数 intTotal=0 sTemp=Dir$(Path & "*.*") do while sTemp<>"" sFileName(intTotal)=sTemp intTotal=intTotal+1 sTemp=Dir$ loop
Private Type typFlieDate Name As String CreatedDate As Date AccessedDate As Date ModifiedDate As Date End Type
Private myFiles() As typFlieDate '包含文件的数组
Private Sub Command1_Click() Dim n As Integer n = GetFolderFiles("d:",1) End Sub
Private Function GetFolderFiles(Path As String,OrderBy As Integer) As Integer 'path 文件夹路径 'orderby 排序依据 1:按创建时间 2:按访问时间 3:按修改时间 4:按名称 '返回文件夹中文件的个数 '如果要计算子文件夹可以通过 fldr.SubFolders 访问,方法类似
Dim tmpFile As typFlieDate Dim n As Integer,i As Integer,j As Integer Dim fso As New FileSystemObject Dim fldr As Folder Dim fls As Files Dim fl As File '读去文件 Set fso = CreateObject("Scripting.FileSystemObject") Set fldr = fso.GetFolder(Path) Set fls = fldr.Files n = fls.Count If n > 0 Then ReDim myFiles(n - 1) i = 0 For Each fl In fls myFiles(i).Name = fl.Name myFiles(i).AccessedDate = fl.DateLastAccessed myFiles(i).CreatedDate = fl.DateCreated myFiles(i).ModifiedDate = fl.DateLastModified i = i + 1 Next '排序 --- 升序 For i = 0 To n - 1 For j = i + 1 To n - 1 Select Case OrderBy Case 1 '创建时间 If myFiles(i).CreatedDate > myFiles(j).CreatedDate Then tmpFile = myFiles(i) myFiles(i) = myFiles(j) myFiles(j) = tmpFile ' tmpFile.Name = myFiles(i).Name ' tmpFile.AccessedDate = myFiles(i).AccessedDate ' tmpFile.CreatedDate = myFiles(i).CreatedDate ' tmpFile.ModifiedDate = myFiles(i).ModifiedDate ' ' myFiles(i).AccessedDate = myFiles(j).AccessedDate ' myFiles(i).CreatedDate = myFiles(j).CreatedDate ' myFiles(i).ModifiedDate = myFiles(j).ModifiedDate ' myFiles(i).Name = myFiles(j).Name ' ' myFiles(j).AccessedDate = tmpFile.AccessedDate ' myFiles(j).CreatedDate = tmpFile.CreatedDate ' myFiles(j).ModifiedDate = tmpFile.ModifiedDate ' myFiles(j).Name = tmpFile.Name End If Case 2 '访问时间 If myFiles(i).AccessedDate > myFiles(j).AccessedDate Then tmpFile = myFiles(i) myFiles(i) = myFiles(j) myFiles(j) = tmpFile End If Case 3 '修改时间 If myFiles(i).ModifiedDate > myFiles(j).ModifiedDate Then tmpFile = myFiles(i) myFiles(i) = myFiles(j) myFiles(j) = tmpFile End If Case 4 '名称 If UCase(myFiles(i).Name) > UCase(myFiles(j).Name) Then tmpFile = myFiles(i) myFiles(i) = myFiles(j) myFiles(j) = tmpFile End If End Select Next j Next i End If GetFolderFiles = n End Function