Изменить корневой каталог pinvoke SHFileOperation - PullRequest
1 голос
/ 14 августа 2011

Это, вероятно, вопрос, о котором никто даже не знает, о чем я говорю ... Но вот так.

Итак, я хочу удалять, копировать, перемещать и переименовывать файлы, используя фактическое подтверждение Windowsдиалоги.Я использую SHFileOperation .Моя проблема заключается в том, что, когда я хочу переместить папку с этим путем:
"C: \ MyFolderToMove"
И я назначаю место назначения:
"C: \ Users \ Test"
И (ЭТА ЧАСТЬ ВАЖНА) ПРИЛОЖЕНИЕ начните с
"D: ​​\ MyApp.exe"
SHFileOperation попытается переместить его в:
"D: \ C \ Users \ Test "

Таким образом, он в основном объединяет папку" start-in "приложения с указанным вами местом назначения.

Есть ли у кого-нибудь представление о том, какрешить это?
Вот код, на тот случай, если кто-то захочет его увидеть.(Это в VB.NET, но я также понимаю C # .NET.)

Imports System.Runtime.InteropServices

Namespace SHFileOperation

    Public Module SHFileOperation

        Private Declare Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperation" (ByRef lpFileOp As SHFILEOPSTRUCT) As Integer

        <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)> _
        Private Structure SHFILEOPSTRUCT
            Public hwnd As IntPtr
            Public wFunc As Operation
            <MarshalAs(UnmanagedType.LPWStr)> _
            Public pFrom As String
            <MarshalAs(UnmanagedType.LPWStr)> _
            Public pTo As String
            Public fFlags As FileOperationFlags
            Public fAnyOperationsAborted As Boolean
            Public hNameMappings As IntPtr
            <MarshalAs(UnmanagedType.LPWStr)> _
            Public lpszProgressTitle As String '  only used if FOF_SIMPLEPROGRESS
        End Structure

        <Flags()> Public Enum FileOperationFlags
            FOF_MULTIDESTFILES = &H1
            FOF_CONFIRMMOUSE = &H2
            FOF_SILENT = &H4
            FOF_RENAMEONCOLLISION = &H8
            FOF_NOCONFIRMATION = &H10
            FOF_WANTMAPPINGHANDLE = &H20
            FOF_ALLOWUNDO = &H40
            FOF_FILESONLY = &H80
            FOF_SIMPLEPROGRESS = &H100
            FOF_NOCONFIRMMKDIR = &H200
            FOF_NOERRORUI = &H400
            FOF_NOCOPYSECURITYATTRIBS = &H800
            FOF_NORECURSION = &H1000
            FOF_NO_CONNECTED_ELEMENTS = &H2000
            FOF_WANTNUKEWARNING = &H4000
            FOF_NORECURSEREPARSE = &H8000
        End Enum

        Public Enum Operation As UInteger
            Move = &H1
            Copy = &H2
            Delete = &H3
            Rename = &H4
        End Enum

        Public Sub MoveFiles(ByVal File As String(), ByVal DestinationDirectory As String)
            Dim Struct As New SHFILEOPSTRUCT With {.hwnd = Nothing,
                                                   .wFunc = Operation.Move,
                                                   .pTo = DestinationDirectory & "\test",
                                                   .fFlags = FileOperationFlags.FOF_ALLOWUNDO Or FileOperationFlags.FOF_WANTNUKEWARNING}

            Dim Files As New Text.StringBuilder()
            For Each F As String In File
                Files.AppendFormat("{0}" & vbNullChar, F)
            Next
            Struct.pFrom = Files.ToString

            SHFileOperation(Struct)
        End Sub
        Public Sub MoveFiles(ByVal File As String, ByVal DestinationDirectory As String)
            MoveFiles(New String() {File}, DestinationDirectory)
        End Sub

    End Module

End Namespace

1 Ответ

2 голосов
/ 23 сентября 2011

Ваш каталог назначения не завершен двойным нулем (см. Документацию для SHFILEOPSTRUCT ). Измените код на:

.pTo = DestinationDirectory & "\test" & vbNullChar,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...