2017-03-05 2 views
8

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方法を用いて、「内部通路」という得ます。

は、その後のパスを取得した後、私は、ファイルをコピーするために、両方の CopyFileCopyFileEx 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エラーコードを返します。

私が使用する構文は次のようでした。


の場合:私は使用

のCopyFile/CopyFileExの定義は(C#のバージョン)Pinvoke.netのウェブサイトで公開したものと同じでしたユーザーはエクスプローラのインスタンスからスマートフォンのディレクトリにファイルをドラッグするだけでファイルをコピーすることができますが、これはプログラマティカルオールWindowsがそのようなコピー操作をUI側から実行するのと同じWin32関数を見つけて使用するだけです。それから何が間違っているの? CopyFile/CopyFileExでファイルをコピーできないのはなぜですか?そして私はそれをどのようにコピーできますか?

私は、C#または他のVB.NETで書かれたソリューションを探しています。これは管理されたコードを使用するか、管理されていないコードPを使用するか、シェルのようなCOMライブラリの使用を除いてWin32関数を呼び出すCOMオブジェクト(CopyHere()メソッドを提供します)。私はこの種のファイルコピー操作をどのようにWin32 APIメンバーを使って行うことができるかを学び、理解したいと思います。

+0

あなたはエクスプローラでSDカードのフォルダを開くと、[シフト右クリック](http://superuser.com/ q/582980/52365)を開き、パスとしてコピーをクリックします。クリップボードにはどのようなパスがありますか? – GSerg

+0

@GSerg CopyAsPathシェル拡張機能は、この種のデバイスでは動作しないようです。少なくとも、この特定のデバイスでは、コンテキストメニューの[パスとしてコピー]オプションは通常のドライブ)フォルダを開きます。コメントありがとうございました – ElektroStudios

+1

さて、[Procmon](https://technet.microsoft.com/en-us/sysinternals/processmonitor)を試すこともできます。フィルタをエクスプローラプロセスに設定し、それが何を呼び出すか、どのパラメータを参照するかを確認します。 – GSerg

答えて

1

WindowsポータブルデバイスAPIを探しています。

https://msdn.microsoft.com/en-us/library/windows/desktop/dd388998(v=vs.85).aspx

編集:私は正常に読み取り/私のアンドロイドギャラクシーS3上のファイルを書き込むために、C#でCOM相互運用機能を使用して、このAPIを使用しています。

また、次のブログで、C#で、このAPIを使用する方法について良い情報を見つけることができます:https://cgeers.wordpress.com/category/programming/wpd/

+0

提案していただきありがとうございます。私は.NETプロジェクトで関連するWPD COMライブラリを参照しましたが、実際にデバイスをリストし、目的のものを選択し、最後にファイルをそのフォルダの1つにコピーする方法についてはわかりません。また、MSDNのサンプルはC++の場合のみです。https://msdn.microsoft.com/en-us/library/windows/desktop/dd798115(v=vs.85).aspx CodePlexやGirHubのようなサイトのC#の既存のサンプル非常に大きな一般的なプロジェクトの帽子は、ファイルを転送することよりもはるかに多くのことをカバーしています。言い換えれば、WPDの未経験者の分析が苦痛です。とにかく私はそれを理解しようとしています。 – ElektroStudios

+3

私はこのアドバイスは正しいとは思わない。 OSは、ファイルをコピーするときに、デバイスAPIを抽象化することができます(そして、そうでなければなりません)。 – GSerg

+0

このアドバイスがどのように「間違っている」か「貧弱」であるか説明してください。 WPD-APIの代替案を提供するか、そのような非構造的な批判をあなた自身にとどめてください。 私たちの研究では、文字通りこれを行う方法はありませんが、言及された(非常にclunkyな)APIを使用することが結論づけられました。このようなデバイスを操作する場合、OSまたはエクスプローラであっても、このAPIを正確に使用していることを強く示しています。 –

関連する問題