
С развитием технологий четкость фотографий и видео, которые мы снимаем в повседневной жизни, продолжает улучшаться, но у этого есть и серьезный недостаток: их размер также становится все больше и больше. Я до сих пор помню, когда я впервые начал пользоваться смартфонами, размер фотографии был всего 2-5MB , а сейчас размер фотографии достиг 15-20MB , а то и больше.

Место для хранения на наших мобильных телефонах ограничено. Как создать резервную копию этих фотографий и видео, чтобы освободить место на наших мобильных телефонах?
Итак, вначале я хранил все эти данные в облаке фотоальбома. Хотя проблема хранения этих данных была решена, возникли и новые проблемы, такие как ограничения по размеру загрузки и необходимость все время занимать фон, что привело. к повышенному энергопотреблению, реклама.
Позже я просто перестал им пользоваться и написал скрипт для резервного копирования данных, так и вышла эта статья.
Для создания этого сценария я использовал Node.js и adb и назвал его MIB
Этот небольшой инструмент реализован с помощью отладки adb на мобильном телефоне, чтения информации о файлах и копирования, а также перемещения файлов на мобильном телефоне с помощью команд shell .
Я нарисовал простую блок MIB
до конца узла.

установите необходимую среду
и загрузите пакет adb , который используется для выполнения различных операций с устройством.
Загрузите Node.js Я считаю, что у всех братьев на своих компьютерах уже есть библиотека зависимостей установки fs-extra
:
fs-extra Node на основе вторичной инкапсуляции модуля fs .prompts : Библиотека Node для взаимодействия в командной строке.winston : Библиотека Node для записи журналов сценариев.Поскольку исходный код проекта слишком велик, мне интересно только основную часть кода
. друзья могут зайти на
github, чтобы увидеть исходный код проекта. github.com/ QC2168/mib
читает файл конфигурации.
Export const getConfig = (): ConfigType => {
если (existConf()) {
вернуть readJsonSync (CONFIG_PATH);
}
// Файл конфигурации не найден return createDefaultConfig();
}; При выполнении скрипта выберите ID устройства, резервную копию которого необходимо создать. И указать устройство при выполнении команды adb
(async() => {
константное устройство: строка | логическое значение = ожидание selectDevice();
если (устройство) MIB();
})();
экспортировать const selectDevice = async ():Promise<string|false> => {
// Получаем список констант устройств: devicesType[] = devices();
если (list.length === 0) {
log("В настоящее время ни одно устройство не подключено, пожалуйста, подключитесь перед запуском инструмента", "предупреждать");
вернуть ложь;
}
const result = list.map((i) => ({ title: i.name, value: i.name }));
const { значение } = ожидание подсказок({
тип: «выбрать»,
имя: «значение»,
сообщение: «пожалуйста, выберите свое устройство»,
выбор: результат,
});
имя_текущего_устройства = значение;
вернуть текущее имя_устройства;
} После обхода резервного узла
и выбора устройства введите информацию об узле обхода и выполните копирование файла по указанному пути ( output атрибут в файле конфигурации)
const MIB = () => {;
// Получаем файл конфигурации const { backups, output } = getConfig();
// Определяем, пуст ли резервный узел if (backups.length === 0) {
log("Текущий резервный узел пуст", "предупреждать");
log("Пожалуйста, добавьте резервные узлы в файл конфигурации", "предупреждать");
}
if (backups. length > 0) {
isPath (выход);
// Анализируем последнюю папку пути резервного копирования backups.forEach((item: SaveItemType) => {
log(`В настоящее время выполняется задача резервного копирования:${item.comment}`);
const arr = item.path.split("/").filter((i: string) => i !== "");
const имя_папки = arr.at(-1);
const backupDir = pathRepair(item.path);
// Каталог резервных копий // Определить, существует ли в узле каталог резервных копий // Соединить путь экспорта const rootPath = pathRepair(pathRepair(output) +folderName);
const outputDir = item.output
? item.output && pathRepair(item.output)
: корневой путь;
// Определяем, существует ли путь резервного копирования if (!isPathAdb(backupDir)) {
log(`Путь к резервной копии:${backupDir} не существует и был пропущен`, "ошибка");
} еще {
// Определяем путь экспорта isPath(outputDir);
резервное копирование (backupDir, выходной каталог, item.full);
}
});
}
log("Программа завершается");
};
// Уточняем файлы, которые необходимо скопировать, и помещаем их в очередь резервного копирования const backup = (target: string, output: string,full: boolean = false) => {
если (!full) {
// Резервное копирование данных файла, не являющихся резервными копиями // Получите информацию о файле в мобильном телефоне и сравните ее с локальным const { backupQueue } = initData(target, output);
// Вычисляем объем и количество ComputeBackupSize(backupQueue);
//Выполняем программу резервного копирования move(backupQueue, output);
} еще {
// Никакого сравнения файлов, прямое резервное копирование moveFolder(target, output);
}
};
//Перемещение файлов в очереди файлов для резервного копирования const move = (backupQueue: FileNodeType[], outputDir: string): void => {
если (backupQueue.length === 0) {
log("Резервное копирование не требуется");
возвращаться;
}
for (const fileN of backupQueue) {
log(`Резервное копирование ${fileN.fileName}`);
пытаться {
const out: строка = execAdb(
`pull "${fileN.filePath}" "${outputDir + fileN.fileName}"`,
);
const скорость: строка | null = out.match(speedReg) !== null ? out.match(speedReg)![0] : «Не удалось прочитать скорость»;
log(`Средняя скорость передачи${speed}`);
} поймать (е: любой) {
log(`Ошибка резервного копирования ${fileN.fileName}:${e.message}`, "ошибка");
}
}
}; USB соединение для резервного копирования данныхвведите следующую команду в терминале, чтобы установить mib глобально.
.mibrc
файла сценария конфигурации
npm i @qc2168/mib -gвам необходимо создать новый файл .mibrc в каталоге пользователя и установить соответствующее содержимое параметра.
{
"резервные копии": [
{
"path": "/sdcard/MIUI/sound_recorder/call_rec",
"comment": "Запись разговора"
},
{
"путь": "/sdcard/DCIM/Камера",
"comment": "Местный фотоальбом"
},
{
"path": "/sdcard/DCIM/Creative",
"comment": "Моё творение"
},
{
"path": "/sdcard/Pictures/weixin",
"comment": "Фотоальбом WeChat"
},
{
"path": "/sdcard/tencent/qq_images",
"comment": "Фотоальбом QQ"
},
{
"path": "/sdcard/Pictures/zhihu",
"комментарий": "Чжиху"
},
{
"path": "/sdcard/tieba",
"комментарий": "Тиеба"
},
{
"path": "/sdcard/DCIM/Скриншоты",
"comment": "Скриншот"
},
{
"path": "/sdcard/DCIM/screenrecorder",
"comment": "Запись экрана"
},
{
"path": "/sdcard/MIUI/sound_recorder",
"комментарий": "запись"
},
{
"path": "/sdcard/MIUI/sound_recorder/app_rec",
"comment": "Запись приложения"
}
],
"output": "E:/backups/MI10PRO"
} Чтобы выполнить резервное копирование
в консоли, введите mib напрямую, чтобы запустить скрипт, без других параметров.
mib
выведет соответствующую информацию на основе файла конфигурации.
2022-04-09 20:58:11 информация Текущая задача резервного копирования: запись экрана2022-04-09 20:58:11 информация Количество резервных копий 1 2022-04-09 20:58:11 информация Получено 24Мб данных 2022-04-09 20:58:11 размер инфо-бэкапа 24Мб 2022-04-09 20:58:11 информация Резервное копирование Screenrecorder-2022-04-08-19-45-51-836.mp4 2022-04-09 20:58:12 информация средняя скорость передачи 27,7 МБ/с 2022-04-09 20:58:12 информация Текущая задача резервного копирования: запись 2022-04-09 20:58:12 информация Количество резервной копии 0 2022-04-09 20:58:12 размер инфо-бэкапа 0Мб 2022-04-09 20:58:12 информация Резервное копирование не требуется 2022-04-09 20:58:13 информация Программа завершается
Исходный адрес: https://juejin.cn/post/7084889987631710221
Автор: _island