Vb6: Нужна помощь с циклом

Итак, у меня есть цикл, который должен делать три вещи: проходить текстовый файл построчно, текстовый файл содержит пути и имена файлов (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

Заранее спасибо!


person Community    schedule 15.11.2008    source источник
comment
Что вы подразумеваете под этим утверждением - #3 = Replace$(#3, abc, xyz)?   -  person shahkalpeshp    schedule 16.11.2008
comment
Я предлагаю использовать библиотеку времени выполнения сценариев (scrrun.dll), которая имеет более простой синтаксис для операций чтения/записи файлов и каталогов.   -  person shahkalpeshp    schedule 16.11.2008
comment
Вам следует обратиться к msdn.microsoft.com/en-us/vbrun/default.aspx чтобы получить помощь по vb6, щелкните вкладку библиотеки.   -  person quamrana    schedule 16.11.2008


Ответы (4)


я не верю

#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.

person pipTheGeek    schedule 15.11.2008
comment
На самом деле все выглядит идеально, за исключением Do while Not EOF(#sourceHandle) LineInput #sourceHandle,temp Отображается как синтаксическая ошибка. Однако MSDN не установлен:/ - person ; 16.11.2008
comment
Я думаю, вам просто нужно избавиться от всего вышеперечисленного. Я почти уверен, что # используется только в том случае, если вы используете буквальное число (например, # 3), но не в том случае, если вы используете переменную, как указано выше. - person MusiGenesis; 16.11.2008
comment
Например, это должно быть Close destHandle, а не Close #destHandle. - person MusiGenesis; 16.11.2008
comment
LineInput должен быть Line Input — я уверен, что это просто опечатка от pipTheGeek. Почему у меня складывается впечатление, что Джеки-Браун просто откуда-то скопировал этот код? MSDN, кажется, говорит, что «#» не является обязательным - как я его помню. - person quamrana; 16.11.2008
comment
Да, это было в случае с разделением, но # необходим, поэтому не уверен, где вы ищете. Это на самом деле то, что я взломал из нескольких старых проектов и был на пути к выходу, поэтому просто опубликовал строки, которые возникли по ошибке. - person ; 16.11.2008
comment
вам не нравится последовательный синтаксис VB6. Линейный ввод и печать # требуется. Закрыть и открыть это необязательно, и EOF не должен использоваться! - person pipTheGeek; 16.11.2008

#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
person svinto    schedule 16.11.2008

Одна проблема, которую я вижу, заключается в том, что вы открываете дескриптор файла, затем № 3, но вы закрываете их в том же порядке, и вы должны закрывать № 3, а затем дескриптор файла.

Что я вижу, так это то, что дескриптор файла открывается, затем он ищет строку, содержащую «.log», затем что-то делает - пока все хорошо. Однако затем он открывает #3, делает что-то еще, а затем зацикливается. Он должен закрыть # 3, когда с ним будет покончено.

Перемещение «Закрыть № 3» вверх на 4 строки (к следующему оператору после «# 3 = Заменить ...» должно делать то, что вы ожидаете, и должно компилироваться нормально.

person SqlRyan    schedule 15.11.2008

Я хотел бы предложить вам другой подход. Я сделал что-то подобное, за исключением того, что заранее знал, что делаю копию, и мой метод заключался в том, чтобы открыть источник и новую цель (копию). Затем я читаю исходный файл построчно, вношу необходимые изменения в переменную, в которую я читаю строку, прежде чем записать ее обратно в копию. Мои файлы никогда не превышали пару k, и это было достаточно быстро и устраняло один из ваших циклов. Вам нужно будет иметь переменную внутри вашего цикла, чтобы сказать вам, как переименовать файл после выполнения, или удалить файл, если вы не нашли строку, которую искали, и вам не нужна копия.

person jac    schedule 05.10.2009