Проблема с переименованием файла? - PullRequest
0 голосов
/ 15 ноября 2009

Я использую VB6, и у меня есть папка, в которой у меня есть n количество файлов.

Я хочу изменить расширение файла на .txt. Я использовал код ниже, чтобы изменить расширение всех .fin файлов на .txt.

Dim filename1 As String
filename1 = Dir$(txtsourcedatabasefile & "\*.fin", vbDirectory)
Do While filename1 <> ""
    Dim strInput As String
    Dim strOutput As String
    Dim strChar As String
    Dim intChar As Integer
    Dim intLoop As Integer
    strInput = filename1
    strOutput = ""
    For intLoop = 1 To Len(strInput)
        strChar = Mid$(strInput, intLoop, 1)
        intChar = Asc(strChar)
        If ((intChar >= 48) And (intChar <= 57)) Or _
            ((intChar >= 65) And (intChar <= 90)) Or _
            ((intChar >= 97) And (intChar <= 122)) Or _
            (intChar = 95) Then

            strOutput = strOutput & strChar
        End If
    Next
    Name txtsourcedatabasefile & "\" & filename1 As txtsourcedatabasefile & "\" & strOutput & ".txt"
    filename1 = Dir$
Loop

Приведенный выше код работает для изменения .fin на .txt, но имена файлов без каких-либо расширений, такие как Clockings2.mis04062009 022511 PM, Silver_421_export и т. Д., Не преобразуются в расширение .txt. Например, Clockings2mis04062009022511PM.txt, Silver_421_export.txt.

Как мне изменить этот код?

Ответы [ 3 ]

3 голосов
/ 15 ноября 2009

Если я правильно интерпретирую ваш вопрос, вы хотите перебрать файлы в каталоге и изменить все файлы с расширением ".fin", или без расширения на ".txt" , Вы можете добавить ссылку на Microsoft Scripting Runtime и использовать FileSystemObject, чтобы сделать это довольно легко. В этом примере мы предположим, что txtsourcedatabase содержит каталог, который вы хотите обработать:

Dim fso As New FileSystemObject
Dim fil As Variant

For Each fil In fso.GetFolder(txtsourcedatabase).Files
  If (LCase$(fso.GetExtensionName(fil.Name)) = "fin") Or _
      (fso.GetExtensionName(fil.Name) = vbNullString) Then
    fso.MoveFile fil.Path, fso.BuildPath(fso.GetParentFolderName(fil.Path), _
      fso.GetBaseName(fil.Path) & ".txt")
  End If
Next
0 голосов
/ 18 ноября 2009

Во-первых, я думаю, что вы хотите изменить свой атрибут Dir $ с vbDirectory на vbNormal. Во-вторых, я думаю, вам следует упростить код переименования. Вы можете использовать встроенную функцию VB Заменить , чтобы сделать то, что вы хотите.

Dim filename1 As String

filename1 = Dir$(txtsourcedatabasefile & "\*.fin", vbNormal)

Do While Len(filename1) > 0
   Name txtsourcedatabasefile & "\" & filename1 As txtsourcedatabasefile & "\" & _
       Replace(filename1, ".fin", ".txt", Len(txtsourcedatabasefile & "\" & filename1) - 4, 1, vbTextCompare)
   filename1 = Dir$
Loop
0 голосов
/ 16 ноября 2009

Хорошо, несколько вещей. Это на самом деле не решит вашу проблему, но, как вы знаете, некоторые из ваших действий могут быть выполнены из командной строки (ren * .fin * .txt). Очевидно, что это не решает проблему файлов без расширений.
Во-вторых, вы даже не должны получать файлы без расширений, основанные на вызове команды Dir с * .fin.
В-третьих, предполагая, что ваши критерии - переименовать все файлы, заканчивающиеся на .fin или не имеющие расширения .txt ... Это должно работать:

Private Const txtsourcedatabasefile As String = "C:\test\"
Public Sub Example()
    Dim filename1 As String
    Dim strOutput As String
    filename1 = Dir$(txtsourcedatabasefile & "*")
    Do While LenB(filename1)
        strOutput = filename1
        If InStrB(1, strOutput, ".", vbBinaryCompare) = 0& Then
            strOutput = strOutput & ".txt"
            Name txtsourcedatabasefile & filename1 As txtsourcedatabasefile & strOutput
        ElseIf LCase$(Right$(filename1, 4)) = ".fin" Then
            Mid$(strOutput, Len(filename1) - 2) = "txt"
            Name txtsourcedatabasefile & filename1 As txtsourcedatabasefile & strOutput
        Else
            Debug.Print "Skipped:", strOutput
        End If
        filename1 = Dir$
    Loop
End Sub
...