2017-03-05 72 views
8

Korzystając z technologii WindowsForms, próbuję skopiować plik zapisany lokalnie na dysku twardym (C: \) do folderu zapisanego na podłączonym smartfonie przez USB.Którą funkcję Win32 należy użyć do skopiowania pliku do folderu smartfona?

Folder "ścieżka" jest reprezentowany przy użyciu przyjaznych nazw jako MyPCName\MyName\Card\Android w pasku nawigacyjnym Eksploratora, a jako ::{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} wewnętrznie w systemie Windows.

że ów „wewnętrzną ścieżkę” za pomocą COM Shell.BrowseForFolder Sposób następnie sprawdzenie właściwości obiektu zwróconej FolderItem.Path.

Następnie po otrzymaniu ścieżkę Próbowałem zarówno CopyFile i CopyFileEx funkcje Win32 skopiować plik, ale nie działa. Wydawało się, że nie są w stanie rozpoznać ścieżki do katalogu.

Składnia Kiedyś było tak:

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) 

W tym kodem funkcja CopyFile() powraca fałszywy a funkcja Marshal.GetLastWin32Error() zwraca 0x3 Win32 kod błędu.

W CopyFile/CopyFileEx definicje I stosowane były takie same jak te, opublikowane na stronie internetowej Pinvoke.net (C# wersje):


Jeśli użytkownik może skopiować plik po prostu przeciągając go z instancji Explorera do katalogu smartfona, wtedy myślę, że jest oczywiste, że można to odtworzyć programowo y po prostu znalezienie i używanie tych samych funkcji Win32, które Windows sam używa do wykonywania tego rodzaju operacji kopiowania ze strony interfejsu użytkownika. Więc co robię źle? Dlaczego CopyFile/CopyFileEx nie może skopiować pliku? I jak mogę to skopiować?

Zauważ, że szukam rozwiązania napisanego w języku C# lub VB.NET, które można rozwiązać za pomocą kodu zarządzanego lub używając niezarządzanego kodu P/Wywoływanie funkcji Win32, z wyjątkiem użycia bibliotek COM, takich jak Shell Obiekty COM (zapewniające metodę CopyHere()). Chciałbym się nauczyć i zrozumieć, w jaki sposób mogę wykonać tego rodzaju operację kopiowania plików przy użyciu członków Win32 API.

+0

Po otwarciu folderu w Eksploratorze karta SD, [shift-right click] (http://superuser.com/ q/582980/52365) plik i kliknij opcję Kopiuj jako ścieżkę, jaki rodzaj ścieżki znajduje się w schowku? – GSerg

+0

@GSerg Wygląda na to, że rozszerzenie powłoki CopyAsPath nie działa dla tego rodzaju urządzeń, lub przynajmniej dla tego konkretnego urządzenia, opcja "Kopiuj jako ścieżkę" w menu kontekstowym nie jest wyświetlana tak, jak jest pokazana dla normalnej (twarda napęd) folderów. Dzięki za komentarz – ElektroStudios

+1

Cóż, możesz także spróbować [Procmon] (https://technet.microsoft.com/en-us/sysinternals/processmonitor). Ustaw filtr na proces eksploratora i zobacz, co wywołuje i jakie parametry. – GSerg

Odpowiedz

1

Szukasz interfejsu API urządzeń przenośnych z systemem Windows.

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

Edit: I z powodzeniem stosować ten interfejs API, za pomocą COM Interop w języku C#, do odczytu/zapisu plików na moim Android Galaxy S3.

Można również znaleźć dobre informacje na temat korzystania z tego interfejsu API w języku C# na poniższym blogu: https://cgeers.wordpress.com/category/programming/wpd/

+0

Dzięki za sugestię. Odniosłem się do powiązanych bibliotek WPD COM w moim projekcie .NET, ale tak naprawdę nie mam pojęcia, jak wyświetlić listę urządzeń, wybrać żądaną i na koniec skopiować pliki do jednego z jej folderów. Również próbki MSDN są tylko dla C++ https://msdn.microsoft.com/en-us/library/windows/desktop/dd798115(v=vs.85).aspx i istniejących próbek w C# w witrynach takich jak CodePlex lub GirHub to bardzo duży ogólny projekt, który obejmuje znacznie więcej rzeczy, które przenoszą pliki, lub innymi słowy: bolesne analizy dla niedoświadczonego użytkownika w WPD. W każdym razie sprawdzam to, aby spróbować zrozumieć .. – ElektroStudios

+3

Nie sądzę, że ta rada jest poprawna. System operacyjny powinien być (i jest) w stanie wyodrębnić interfejs API urządzenia podczas kopiowania plików. – GSerg

+0

Proszę wyjaśnić, w jaki sposób ta porada jest "nieprawidłowa" lub "zła". Albo oferujesz alternatywę dla WPD-API, albo zachowujesz sobie taką niekonstruktywną krytykę. Nasze badania doprowadziły do ​​wniosku, że nie ma żadnego innego sposobu, aby to zrobić, ale używać wspomnianego (bardzo przylegającego) API. Istnieje silne wskazanie, że nawet system operacyjny lub eksplorator używają dokładnie tego API podczas pracy z takimi urządzeniami. –