Как использовать строку cmd в vb6 для переименования файла? - PullRequest
1 голос
/ 01 февраля 2011

Как использовать строку cmd в vb6 для переименования файла?

В чем проблема с моим кодом?

Shell "cmd ren D:\before.txt after.txt"

Ответы [ 2 ]

8 голосов
/ 01 февраля 2011

Вам нужен / C или / K для того, чтобы он действительно работал правильно.Смотрите Cmd /?для получения дополнительной информации.

Функция Shell также не то же самое, что приглашение командной строки.Это остаток старых версий VB и Windows, а также оболочка для WinExec () API.

Чтобы переименовать файл в VB6, используйте оператор Name:

Name "D:\before.txt" As "after.txt"
0 голосов
/ 01 февраля 2011

Зачем использовать командную строку вместо кода для переименования файла?Если у вас нет веских причин для использования cmd, я бы порекомендовал использовать Windows API, гораздо более надежный.Вот пример, который использует SHFileOperation для переименования файла.Перетащите это в любой модуль или класс.

Option Explicit

Private Type SHFILEOPSTRUCT
        hwnd As Long
        wFunc As Long
        pFrom As String
        pTo As String
        fFlags As Integer
        fAnyOperationsAborted As Long
        hNameMappings As Long
        lpszProgressTitle As Long ' only used with FOF_SIMPLEPROGRESS; sets dialog title
End Type

' For info, see: http://msdn.microsoft.com/en-us/library/bb759795%28v=vs.85%29.aspx
Private Const FO_COPY                   As Long = &H2
Private Const FO_DELETE                 As Long = &H3
Private Const FO_MOVE                   As Long = &H1
Private Const FO_RENAME                 As Long = &H4
Private Const FOF_ALLOWUNDO             As Long = &H40
Private Const FOF_CONFIRMMOUSE          As Long = &H2
Private Const FOF_FILESONLY             As Long = &H80
Private Const FOF_MULTIDESTFILES        As Long = &H1
Private Const FOF_NO_CONNECTED_ELEMENTS As Long = &H2000
Private Const FOF_NOCONFIRMATION        As Long = &H10
Private Const FOF_NOCONFIRMMKDIR        As Long = &H200
Private Const FOF_NOCOPYSECURITYATTRIBS As Long = &H800
Private Const FOF_NOERRORUI             As Long = &H400
Private Const FOF_NORECURSION           As Long = &H1000
Private Const FOF_RENAMEONCOLLISION     As Long = &H8
Private Const FOF_SILENT                As Long = &H4
Private Const FOF_SIMPLEPROGRESS        As Long = &H100
Private Const FOF_WANTMAPPINGHANDLE     As Long = &H20
Private Const FOF_WANTNUKEWARNING       As Long = &H4000

Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long

Public Function FileRename(OldFileNameAndPath As String, NewFileNameAndPath As String) As Boolean
    Dim oP As SHFILEOPSTRUCT, lRet As Long
    On Error GoTo Err

    ' Prepare FILEOP struct
    With oP
        .wFunc = FO_RENAME                          ' Set function
        .pTo = NewFileNameAndPath                   ' Set new path
        .pFrom = OldFileNameAndPath                 ' Set current path
        .fFlags = FOF_SILENT + FOF_SIMPLEPROGRESS   ' Set your flags; FOF_SILENT + FOF_SIMPLEPROGRESS will silently rename a file
    End With

    ' Perform operation
    lRet = SHFileOperation(oP)

    If lRet = 0 Then
        FileRename = True
    Else
        FileRename = False
    End If

    Exit Function
Err:
    ' TODO: Log Error
End Function
...