2017-03-05 4 views
8

Mit der WindowsForms-Technologie versuche ich eine Datei, die lokal auf der Festplatte (C: \) gespeichert ist, in einen Ordner zu kopieren, der auf einem angeschlossenen Smartphone-Gerät über USB gespeichert ist.Welche Win32-Funktion muss ich verwenden, um eine Datei in einen Smartphone-Ordner zu kopieren?

Der Ordner "path" wird in der Explorer-Navigationsleiste mit den Anzeigenamen MyPCName\MyName\Card\Android und intern in 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} dargestellt.

I erhalten, dass „internen Pfad“ durch die COM Shell.BrowseForFolder Verfahren dann mit der FolderItem.Path Eigenschaft des zurückgegebenen Objekts überprüfen.

Dann, nach dem Weg bekommen habe ich versucht, sowohl die CopyFile und CopyFileEx Funktionen Win32 die Datei zu kopieren, aber sie funktionierte nicht. Sie schienen den Verzeichnispfad nicht zu erkennen.

Die Syntax Ich war wie folgt verwendet:

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) 

In diesem Code die CopyFile() Funktion Falsch und die Marshal.GetLastWin32Error() Funktion gibt gibt einen 0x3 Win32-Fehlercode.

Die Copyfile/CopyFileEx Definitionen I verwendet wurden, waren die gleichen wie die auf der Website veröffentlicht Pinvoke.net (C# Versionen):


Wenn ein Der Benutzer kann die Datei einfach von einer Explorer-Instanz in das Smartphone-Verzeichnis ziehen, dann ist es offensichtlich, dass dies programmatisch reproduziert werden kann Sie finden und verwenden dieselben Win32-Funktionen, die Windows selbst verwendet, um diese Art von Kopiervorgängen von der UI-Seite aus durchzuführen. Was mache ich dann falsch? Warum kann CopyFile/CopyFileEx die Datei nicht kopieren? Und wie kann ich es kopieren?

Beachten Sie, dass ich nach einer in C# oder VB.NET geschriebenen Lösung suche, die nur mit verwaltetem Code oder mit nicht verwaltetem Code P/Aufrufen der Win32-Funktionen gelöst werden kann, mit Ausnahme der Verwendung von COM-Bibliotheken wie der Shell COM-Objekte (die eine CopyHere() Methode bereitstellt). Ich möchte lernen und verstehen, wie ich diese Art von Dateikopiervorgang mit den Win32-API-Mitgliedern durchführen konnte.

+0

Wenn Sie die SD-Karte Ordner im Explorer öffnen, [Shift-Rechtsklick] (http://superuser.com/ q/582980/52365) eine Datei und klicken Sie auf Als Pfad kopieren, welche Art von Pfad erhalten Sie in der Zwischenablage? – GSerg

+0

@GSerg Es scheint, dass die CopyAsPath-Shell-Erweiterung für diese Art von Geräten nicht funktioniert, oder zumindest für dieses spezifische Gerät wird die Option "Als Pfad kopieren" im Kontextmenü nicht so angezeigt, wie sie für normal angezeigt wird Laufwerk) Ordner. Danke für den Kommentar – ElektroStudios

+1

Nun, Sie können auch versuchen [Procmon] (https: // technet.microsoft.com/en-us/sysinternals/processmonitor). Setzen Sie den Filter auf den Explorer-Prozess und sehen Sie, was er mit welchen Parametern aufruft. – GSerg

Antwort

1

Sie suchen nach der Windows Portable Devices API.

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

Edit: Ich habe erfolgreich diese API, mit COM-Interop in C#, dient zum Lesen/Schreiben von Dateien auf meinem Android Galaxy S3.

Sie können auch gute Informationen über die Verwendung dieser API in C# unter dem folgenden Blog finden: https://cgeers.wordpress.com/category/programming/wpd/

+0

Danke für den Vorschlag. Ich habe auf die verwandten WPD COM-Bibliotheken in meinem .NET-Projekt verwiesen, aber ich habe wirklich keine Ahnung, wie man Geräte auflistet, das gewünschte auswählt und schließlich Dateien in einen seiner Ordner kopiert. Außerdem sind die MSDN-Beispiele nur für C++ https://msdn.microsoft.com/en-us/library/windows/desktop/dd798115(v=vs.85).aspx und die vorhandenen Beispiele in C# in Websites wie CodePlex oder GirHub sind sehr große allgemeine Projekte, die viel mehr Dinge abdecken, die Dateien übertragen, oder mit anderen Worten: eine schmerzhafte Analyse für einen unerfahrenen Benutzer in WPD. Wie auch immer ich es überprüfe, um zu versuchen, zu verstehen. – ElektroStudios

+3

Ich denke nicht, dass dieser Rat richtig ist. Das Betriebssystem sollte (und kann) die Geräte-API beim Kopieren von Dateien abstrahieren. – GSerg

+0

Bitte erläutern Sie, wie dieser Hinweis in "incorrect" oder "poor" lautet. Entweder bieten Sie eine Alternative zur WPD-API an oder Sie behalten solche unkonstruktive Kritik für sich. Unsere Forschung ergab, dass es buchstäblich keine andere Möglichkeit gibt, dies zu tun, sondern die erwähnte (sehr klobige) API zu verwenden. Es gibt starke Hinweise darauf, dass sogar das Betriebssystem oder der Explorer genau diese API verwenden, wenn Sie mit solchen Geräten arbeiten. –

Verwandte Themen