Vb6: нужна помощь с циклом - PullRequest
0 голосов
/ 16 ноября 2008

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

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

Ответы [ 4 ]

1 голос
/ 16 ноября 2008

Я не верю

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

1 голос
/ 16 ноября 2008

# 3 = Заменить $ ... это ваша проблема ... исправление этого и прочего приводит к следующему:

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
0 голосов
/ 05 октября 2009

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

0 голосов
/ 16 ноября 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...