Комментарии 12
Не совсем понятно, в чём была задача. Вытащить файлы с карты памяти?
А может тогда было проще её вынуть и в кардридер воткнуть?
У него часть фоток на самом телефоне. А свободного пространства - 0.
Аргументация верная, но в скрипт я полез из-за того, что у меня бомбило от несовершенства софта. Кроме того флешку не так-то просто вынуть и физически, и программно (там приложения стоят). По хронометражу может и быстрее, но точно не удобнее.
Карта памяти окажется зашифрованной, если пользователь выбрал использовать её для "расширения встроенной памяти". Ключ шифрования хранится в самом телефоне, удачи его извлечь из TEE.
Я решил выкинуть проводник и разобраться с папкой при помощи скрипта.
Зачем писать обёртку вокруг adb, если можно сделать adb pull <directory>
? Поправить кодировку названий файлов?
Не, конфликт кодировок на содержимое файлов не распространяется. Так что если бы я шарил в adb больше, я бы может так и сделал. Однако я иначе представлял себе её назначение, поэтому даже не предполагал наличие такой команды.
К тому же я не знал точный путь к директории. Я был уверен, что меня ждёт отдельный диск D, а не подпапка. Благодаря SharpAdbClient
и SyncService
у меня была готовая структура данных, которой я мог оперировать в привычной мне манере, так что поиск не занял много времени.
Кроме того, структура папок моего фото-архива устроена сложнее, чем исходная папка на телефоне. На F# я могу легко написать предикат, который установит наличие копии в фото-архиве, но сделать это через консольный скрипт я сходу не смогу. Соответственно надо копировать либо всё, либо дёргать файлы по одному, а мне это проще делать через скрипт.
И наконец, мне надо было удалить файлы на телефоне, но не все. Некоторые моменты мне хотелось иметь и там, и там. Это подразумевает поштучное удаление, а в моём случае ещё и перенос файлов с внутреннего хранилища телефона на sd-карту.
Если бы я столкнулся с непреодолимым препятствием, я быть может допёр до adb pull
, но всё удавалось слишком быстро и легко, чтобы я успел остановиться и подумать об альтернативах. Правда и сейчас я не вижу в этом смысла, так как мои скрипты проворачивают все необходимые мне операции с предельной точностью. Причём они могут делать это в автоматическом режиме, просто обнаруживая телефон в своей зоне действия.
Можно пояснить зачем так сложно? Почему бы не воспользоваться просто ADB и скриптами в ОС (cmd, ps1, sh, и т.д.)? Или как вариантом - любой программой для синхронизации папок (Resilio, SyncThing и т.п.) и с компа спокойно перекинуть что куда надо, а двухсторонняя синхронизация сама на телефоне поубивает всё?
На похожий вопрос отвечал подробно выше https://habr.com/ru/companies/first/articles/865932/#comment_27667896
Добавить могу лишь то, что в абстрактной ситуации между скриптами на ОС и на F#, я выберу F#, ибо последний является моим основным инструментом. Весь свой девопс (отличный от готовых задач из маркета) держу в .fsx
. Потребностей перейти на что-то другое как-то не возникало.
Что касается специального софта. то в его сторону даже не смотрел. С областью не знаком, так что раскуривать её мне придётся дольше, чем я решил свою проблему.
Ещё можно запустить из некоторых файловых менеджеров (X-Plore, MiXplorer и др.) на ведроиде сервер ftp/http/smb/etc. и зайти в расшареные таким образом папки.
Ну и про кодировку: в винде можно задать кодировку для вывода консоли через реестр. Гуглиться способ должен легко (я когда-то давно его довольно быстро нагуглил).
Я не думаю, что проблема в кодировке происходит от оси. Latin1
- не дефолтная. Автор пакета сохранил на неё указатель, так что скорее всего переключение было сознательным. Предположу, что он упёрся в корнер кейс при разборе консольного вывода и обошёл его данным хаком. То есть ситуация аналогично тому, как девопсы лочат локаль на en
, чтобы не парсить сообщения об ошибках на других языках. Ход грязный, но достаточно надёжный.
// Промазал с ответом.
Как забрать фотки с флешки, если Android их не отдаёт