Как стать автором
Обновить

Комментарии 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, чтобы не парсить сообщения об ошибках на других языках. Ход грязный, но достаточно надёжный.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий