Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb6:需要有关循环的帮助吗_Vb6_Loops - Fatal编程技术网

Vb6:需要有关循环的帮助吗

Vb6:需要有关循环的帮助吗,vb6,loops,Vb6,Loops,我有一个循环,它应该做三件事,逐行遍历文本文件,文本文件包含路径名和文件名(C:\Folder\file1.txt) 如果该行包含某个字符串,则它会将文件复制到该位置,将其重命名为文本文件中的名称,然后替换复制文件中的字符串(仍然与我在一起?)。如果没有,则转到下一行。我认为这将是相当直接的,但我似乎没有工作,我目前甚至无法编译,因为我得到错误,说循环的语法是错误的。任何帮助都将不胜感激,以下是整个函数的代码: Private Sub Command2_Click() Dim LineData

我有一个循环,它应该做三件事,逐行遍历文本文件,文本文件包含路径名和文件名(C:\Folder\file1.txt) 如果该行包含某个字符串,则它会将文件复制到该位置,将其重命名为文本文件中的名称,然后替换复制文件中的字符串(仍然与我在一起?)。如果没有,则转到下一行。我认为这将是相当直接的,但我似乎没有工作,我目前甚至无法编译,因为我得到错误,说循环的语法是错误的。任何帮助都将不胜感激,以下是整个函数的代码:

Private Sub Command2_Click()

Dim LineData As String 
Dim FileHandle As Integer


FileHandle = FreeFile
Open "C:\textfile.txt" For Input As #FileHandle

Do While Not EOF(FileHandle)
Line Input #FileHandle, LineData
If InStr(LineData, ".log") Then
FileCopy "C:\thefile.log",LineData
Open LineData For Input As #3
 #3 = Replace$(#3, "abc", "xyz")
Else
End If  
Loop
Close #FileHandle
Close #3






 MsgBox "Copy, Replace, Complete!"

End Sub

提前谢谢

我看到的一个问题是,您正在打开filehandle,然后是#3,但您以相同的顺序关闭它们,您应该先关闭#3,然后是filehandle

我看到的情况是,文件句柄被打开,然后它搜索一行包含“.log”,然后它做了一些事情——到目前为止,一切都很好。但是,它随后打开#3,执行其他操作,然后循环。完成后需要关闭#3

将“Close#3”向上移动4行(移动到“#3=Replace…”后面的下一个语句中)应该可以完成您期望的操作,并且应该可以编译。

我不相信

#3 = Replace$(#3, "abc", "xyz")
这是有效的。 您需要逐行读取该文件的内容(最好是一次读取一些合理的块),进行替换,然后将其写回新文件。由于您仍要复制该文件,我建议您从源位置读取该文件,并将新版本写入该文件仍将复制到的位置

例如

Private Sub Command2_Click()
 Dim LineData As String
 Dim FileHandle As Integer
 Dim sourceHandle as Integer
 Dim destHandle as Integer
 dim temp as string
 FileHandle = FreeFile
 Open "C:\textfile.txt" For Input As #FileHandle
 Do While Not EOF(FileHandle)
  Line Input #FileHandle, LineData
  If InStr(LineData, ".log") Then
   sourceHandle=FreeFile
   Open "C:\thefile.log" For Input as #sourceHandle
   destHandle=FreeFile
   Open LineData For Output as #destHandle
   Do while Not EOF(sourceHandle)
    Line Input #sourceHandle,temp
    temp=replace$(temp,"abc","xyz")
    Print #destHandle,temp
   Loop
   Close #destHandle
   Close #sourceHandle
  End If
 Loop
Close #FileHandle
MsgBox "Copy, Replace, Complete!"
End Sub
很抱歉,如果出现任何错误,这没有经过测试,因为我没有在这台计算机上安装VB IDE。

\3=Replace$…是您的问题所在…修复该问题和其他问题会导致以下问题:

Private Sub Command2_Click()
  Dim LineData As String
  Dim FileHandle As Integer
  Dim Buffer As String
  FileHandle = FreeFile
  Open "C:\thefile.log" For Binary Access Read As #FileHandle
  Buffer = Space(LOF(FileHandle))
  Get #FileHandle, , Buffer
  Buffer = Replace(Buffer, "abc", "xyz")
  Close #FileHandle
  FileHandle = FreeFile
  Open "C:\textfile.txt" For Input As #FileHandle
  Do Until EOF(FileHandle)
    Line Input #FileHandle, LineData
    If InStr(LineData, ".log") Then
      Open LineData For Output As #3
      Print #3, Buffer;
      Close #3
    End If
  Loop
  Close #FileHandle
  MsgBox "Copy, Replace, Complete!"
End Sub
如果您喜欢极简主义和简短的代码,您可以选择以下选项:

Private Sub Command2_Click()
  ''// This code requires a reference to Microsoft Scripting runtime (Project -> References)
  Dim FSO As New Scripting.FileSystemObject
  Dim Files() As String
  Dim File As String
  Dim Data As String
  Data = Replace(FSO.OpenTextFile("C:\thefile.log").ReadAll(), "abc", "xyz")
  Files = Split(FSO.OpenTextFile("C:\textfile.txt").ReadAll(), vbCrLf)
  For Each File In Files
    If InStr(File, ".log") > 0 Then FSO.CreateTextFile(File, True).Write Data
  Next
  MsgBox "Copy, Replace, Complete!"
End Sub

我想向你们建议一种不同的方法。我做过类似的事情,只是我事先知道我在制作一个副本,我的方法是打开源代码和一个新的目标(副本)。然后,我逐行读取源文件。在将该行读入的变量写回副本之前,对该变量进行必要的更改。我的文件从来没有超过两个k,这足够快,并消除了一个循环。您必须在循环中有一个变量,以告诉您如何重命名该文件一次完成,或者如果没有找到要查找的行并且不需要副本,则删除该文件。

这句话是什么意思-#3=Replace$(#3,“abc”,“xyz”)?我建议使用脚本运行时库(scrrun.dll)它有更简单的语法来处理文件和目录读/写操作。您应该咨询vb6的帮助-单击“库”选项卡。实际上,除了Do而不是EOF(#sourceHandle)之外,所有看起来都很完美LineInput#sourceHandle,temp显示为语法错误,但没有安装MSDN:/我认为您只需要去掉上面的所有“#”。我很确定,如果您使用的是文字数字(#例如3),那么就不会出现这种情况。如果您使用的是上述变量,那么它应该是“Close destHandle”而不是“Close destHandle”例如,LineInput应该是Line Input-我肯定这只是pipTheGeek的一个打字错误。为什么我会觉得JAckie Brown刚刚从某个地方复制了这段代码?MSDN似乎说“#”是可选的-就像我记得的那样。是的,分离是这样的,但是#是必要的,所以不确定你在找什么g、 这实际上是我从几个旧项目中拼凑出来的东西,当时我正准备退出,所以我只是发布了错误的代码