エクスプローラーからファイルを移動・コピーするには?

解決


あわわ  2003-04-18 05:07:46  No: 106738

今、エクスプローラーからファイルリストボックスにマウスで
ドラッグ&ドロップして移動・コピーを行いたいと考えているんですが
なかなかできません。
本やHPを見ても、「ファイル名の取得」としか書かれていません。
ファイルリストボックスからエクスプローラーにドラッグ&ドロップして
移動・コピーは、なんとかできたのですが。
どなたか、分かる方、いらしゃいませんか。お願いします。


oku  URL  2003-04-18 08:51:43  No: 106739

ファイルリストボックスにドロップされたパスが分からないと言う事ですか?

そうだったら
OLEDropMode プロパティを手動にして、
Private Sub File1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim objFile As Variant
    
    For Each objFile In Data.Files
        MsgBox objFile
    Next
End Sub
こうやればパスが分かります。
あとはコピーでも移動でもお好きなように処理してください。


あわわ  2003-04-18 21:06:29  No: 106740

HPみました。へー、福岡なんですか?私も、2年前まで3年間ほど
平尾に住んでいました。今まで住んだ土地の中で、一番好きなところです。
ヨイショじゃなくて。(大濠公園のベンチでゆっくりするのが好きでした)
VBの掲示板でこんなこと書くのは叱られてしまうので本題に戻りますね。

この前の質問では、説明不足でしたので、補足させて下さい。
まず、DirListBoxとFileListBoxを貼り付け、FileListBoxから
ファイルを選択し、(例えば)デスクトップにドラッグすると、そこに
ファイルのコピー・移動ができるところまではできています。
ただ、その逆ができていないのです。つまり、(例えば)デスクトップから
FileListBoxにドラッグすると、ファイルのコピー・移動させたいのです。
OKUさんのパスの取得を試したのですが、パスが分かってもVB初心者には
その先の処理が分かりません。とほほ…。:^^:
どうか、ご指導下さりますよう、お願いします。

'エクスプローラーにドラッグ&ドロップ-----------------------------
Private Const vbDropEffectLink = 4

Private Sub File1_MouseMove(Button As Integer, Shift As Integer _
                                    , X As Single, Y AsSingle)      
    If Button = vbLeftButton Then
        File1.OLEDrag
        File1.Refresh           
    End If
End Sub

Private Sub File1_OLEStartDrag(Data As DataObject _
                                        , AllowedEffects As Long)
    Dim i As Integer
    Dim objFile As String
  
    Data.Files.Clear
        
    For i = 0 To File1.ListCount - 1
        If File1.Selected(i) = True Then
            If Right(Dir1, 1) = "\" Then
                objFile = Dir1 & File1.List(i)
            Else
                objFile = Dir1 & "\" & File1.List(i)
            End If
            If Dir(objFile) <> vbNullString Then
                'クリップボードに Files型のデータを作成
                Data.SetData , vbCFFiles
                Data.Files.Add objFile
            End If
        End If
    Next
    
AllowedEffects = vbDropEffectCopy Or vbDropEffectMove _
                                  Or vbDropEffectLink
End Sub


oku  URL  2003-04-19 06:33:33  No: 106741

ファイルのコピー&移動も分からなかったんですね。
>ファイルリストボックスからエクスプローラーにドラッグ&ドロップして
>移動・コピーは、なんとかできたのですが。
と書いてあったので、ファイルのコピー&移動は分かってると思いました。

さて、ファイルのコピー&移動するにはいろいろやり方があります。
1  VBの機能を使う
2  ファイルシステムオブジェクトを使う
3  APIを使う
自分が知っているのは、こんなものです。
コーティングを以下に書きます。

1  VBの機能を使う
Private Sub File1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    Dim objFile As Variant
    
    For Each objFile In Data.Files
        'コピーなら
        FileCopy objFile, File1.Path & "\" & ファイル名
        '移動なら
        Name objFile As File1.Path & "\" & ファイル名
    Next
End Sub

2  ファイルシステムオブジェクトを使う
    Dim colFilesystem As Object
    Dim strSrcName  As String
    Dim strDestName As String
    
    Set colFilesystem = CreateObject("Scripting.FileSystemObject")
    'コピーなら
    colFilesystem.CopyFile objFile, File1.Path & "\" & ファイル名
    '移動なら
    colFilesystem.MoveFile objFile, File1.Path & "\" & ファイル名
    ' オブジェクトを解放
    Set colFilesystem = Nothing

APIでのやり方は、ここのAPI  技術関連を参考にしてください
DirListBoxやFileListBoxは、使ったこと無いので
使い方間違ってたらすいません。
ヤマカサがあるけん博多タイ!


あわわ  2003-04-19 09:40:12  No: 106742

OKUさん、またまた返事ありがとうございます。
ご指導の元、APIを使ってファイルの移動・コピーが
実現しました。ふー、なんとまー疲れました。ははっ。
でも、少し欲が出てしまい、なん点か教えていただきたいのですが
本当に何度もすみません。m+ +;m

1.FileListBox上で「Ctrl」を押してドロップしたときにコピーさせたい。
2.また「Ctrl」を押してる時に矢印と右下に「+」プラスが付いたい
    マウスポインターにしたい。
3.ドロップされた時に、フォルダとファイルを識別した。
    いっぱいですみません。でも、ほんと分からなくて…。
'------------------------------------------------
API宣言「SHFileOperation」

Dim SHEF As SHFILEOPSTRUCT
    
    If Right(Dir1, 1) = "\" Then
       フォルダ = Dir1
    Else
       フォルダ = Dir1 & "\"
    End If
    
    For Each objFile In Data.Files
    ファイル名 = Dir(objFile)

    With SHEF
        .hWnd = Me.hWnd
        .wFunc = FO_MOVE   '---------------A
        .pFrom = objFile
        .pTo = フォルダ & ファイル名
        .fFlags = FOF_ALLOWUNDO
    End With
    
    Ret = SHFileOperation(SHEF)
      
    Next
    
    File1.Refresh

  「今年のどんたくは、連休のいつったい」ですか?
    ちょっと表現ちがうかな  ^_^;


oku  URL  2003-04-19 12:01:21  No: 106743

うーーん少しはヘルプで調べてほしいですが、
福岡繋がりという事で、

まず
>1.FileListBox上で「Ctrl」を押してドロップしたときにコピーさせたい。
OLEDragDrop時にShift変数にCtrlが押されているか情報が
入っているのでそこを見てあげれば良いです。
Private Sub File1_OLEDragDrop(Data As DataObject, Effect As Long, Button As Integer, Shift As Integer, X As Single, Y As Single)
    If Shift = vbCtrlMask Then
        MsgBox "Ctrlキーを押したままドロップされました"
    End If
End Sub

>2.また「Ctrl」を押してる時に矢印と右下に「+」プラスが付いたい
>  マウスポインターにしたい。
マウスポインタを矢印&+のポインタにしたいと言うことですか?
マウスポインタを変えることは出来ますが、
VBで用意されているポインタに希望のものが無いので、
どっかから入手してください。
入手したマウスポインタをFile1のMouseIcon プロパティに設定して
Ctrlキーが押されている時だけそのマウスポインタにしてやれば良いわけです。
Ctrlキーが話された時に標準のポインタに戻すのも忘れずに。
Private Sub File1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = vbKeyControl Then
        File1.MousePointer = vbCustom  '99 ユーザー定義
    End If
End Sub

Private Sub File1_KeyUp(KeyCode As Integer, Shift As Integer)
    File1.MousePointer = vbDefault  '  0 規定値
End Sub

>3.ドロップされた時に、フォルダとファイルを識別した。
識別したいって事ですか?断言してるので違うのかな?
ちなみにこれもやり方いくつかあるんですが、
VB関数を使うなら Dir関数のヘルプを見てください。
自分はAPI使ってやってますけど。
Private Declare Function PathIsDirectory Lib "SHLWAPI.DLL" Alias "PathIsDirectoryA" _
                                (ByVal pszPath As String) As Long
'
' ディレクトリであるかどうか
'
Private Function IsDirectory(ByVal strFileName As String) As Boolean
    ' strFilename : チェックしたいディレクトリ名
    ' 戻り値      : ディレクトリであればTrueを返す。

    Dim lngResult As Long
    lngResult = PathIsDirectory(strFileName)
    IsDirectory = Not (lngResult = 0)
End Function

Private Sub Command1_Click()
    Dim strFileName As String
    strFileName = "C:\WINNT\Profiles\Administrator\My Documents\HEROPA\TestCls\SHLWAPI"
    Msgbox IsDirectory(strFileName)
End Sub
このAPIはInternet Explore 4.0以上がインストールされていないと
使えません。Win98以上ならデフォルトで入っているから問題ないでしょうが。
うーん  これからは関数名やAPI名だけを教えるようにしようかな?
全部教えちゃうとその人の為にならないから。


あわわ  2003-04-19 20:59:02  No: 106744

んー、OKUさんはやさしいですね。

自分の思っているすべてのことが実現できました。

細かいところまで質問してしまったので、実は返事が返ってくるか

心配でした。確かに、全部教えてもらうと自分のためにならないことは

よく分かっています。ただ、HPのOKUさんの顔を見たら、優しく教えてくれ

るかもしれないと思い、甘えが生じました。すみません。

これからは、POINTだけ質問するようにしますね。

ここ何日かお世話になりました。やっぱり、福岡は、いい人が多いったい。

福岡、バンザーイ!!


あわわ  2003-04-19 21:01:49  No: 106745

解決にチェックするのを忘れてました。どうも、すいません。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加