Windowsフォームテクノロジを使用して、ハードドライブ(C:\)にローカルに保存されているファイルを、USB経由で接続されたスマートフォンデバイスに保存されているフォルダにコピーしようとしています。ファイルをスマートフォンフォルダにコピーするために使用する必要があるWin32関数はどれですか?
"path"というフォルダは、エクスプローラーのナビゲーションバーでMyPCName\MyName\Card\Android
というフレンドリ名を使用し、Windowsでは内部で::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_04e8&pid_6860&ms_comp_mtp&samsung_android#6&612ff8b&1&0000#{6ac27878-a6fa-4155-ba85-f98f491d4f33}\SID-{20002,SECZ9519043CHOHB01,31426543616}\{01A00139-011B-0124-3301-29011C013501}
というフレンドリ名で表されます。
Iは、次いで、返されたオブジェクトのFolderItem.PathプロパティをチェックCOM Shell.BrowseForFolder方法を用いて、「内部通路」という得ます。
は、その後のパスを取得した後、私は、ファイルをコピーするために、両方の CopyFileと CopyFileEx Win32関数を試してみましたが、彼らは動作しませんでした。彼らはディレクトリパスを認識できないようでした。CopyFile()
機能が
Falseをを返すコードで
Dim dirPath As String = "::{20D04FE0-3AEA-1069-A2D8-08002B30309D}\\\?\usb#vid_04e8&pid_6860&ms_comp_mtp&samsung_android#6&612ff8b&1&0000#{6ac27878-a6fa-4155-ba85-f98f491d4f33}\SID-{20002,SECZ9519043CHOHB01,31426543616}\{01A00139-011B-0124-3301-29011C013501}"
NativeMethods.CopyFile("C:\MyFile.ext", dirPath & "\MyFile.ext", failIfExists:=True)
とMarshal.GetLastWin32Error()
機能が0x3の Win32エラーコードを返します。
私が使用する構文は次のようでした。
- http://www.pinvoke.net/default.aspx/kernel32/CopyFile.html
- http://www.pinvoke.net/default.aspx/kernel32.copyfileex
の場合:私は使用
のCopyFile/CopyFileExの定義は(C#のバージョン)Pinvoke.netのウェブサイトで公開したものと同じでしたユーザーはエクスプローラのインスタンスからスマートフォンのディレクトリにファイルをドラッグするだけでファイルをコピーすることができますが、これはプログラマティカルオールWindowsがそのようなコピー操作をUI側から実行するのと同じWin32関数を見つけて使用するだけです。それから何が間違っているの? CopyFile/CopyFileExでファイルをコピーできないのはなぜですか?そして私はそれをどのようにコピーできますか?
私は、C#または他のVB.NETで書かれたソリューションを探しています。これは管理されたコードを使用するか、管理されていないコードPを使用するか、シェルのようなCOMライブラリの使用を除いてWin32関数を呼び出すCOMオブジェクト(CopyHere()
メソッドを提供します)。私はこの種のファイルコピー操作をどのようにWin32 APIメンバーを使って行うことができるかを学び、理解したいと思います。
あなたはエクスプローラでSDカードのフォルダを開くと、[シフト右クリック](http://superuser.com/ q/582980/52365)を開き、パスとしてコピーをクリックします。クリップボードにはどのようなパスがありますか? – GSerg
@GSerg CopyAsPathシェル拡張機能は、この種のデバイスでは動作しないようです。少なくとも、この特定のデバイスでは、コンテキストメニューの[パスとしてコピー]オプションは通常のドライブ)フォルダを開きます。コメントありがとうございました – ElektroStudios
さて、[Procmon](https://technet.microsoft.com/en-us/sysinternals/processmonitor)を試すこともできます。フィルタをエクスプローラプロセスに設定し、それが何を呼び出すか、どのパラメータを参照するかを確認します。 – GSerg