مع تطور التكنولوجيا، يستمر وضوح الصور ومقاطع الفيديو التي نلتقطها في حياتنا اليومية في التحسن، ولكن هذا له أيضًا عيب كبير، وهو أن حجمها يصبح أكبر فأكبر أيضًا. ما زلت أتذكر عندما بدأت استخدام الهواتف الذكية لأول مرة، كان حجم الصورة يتراوح 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 => { إذا (يوجد()) { إرجاع readJsonSync(CONFIG_PATH); } // لا يمكن العثور على ملف التكوين return createDefaultConfig(); };
عند تنفيذ البرنامج النصي، حدد ID
الجهاز الذي يحتاج إلى نسخ احتياطي. وحدد الجهاز عند تنفيذ أمر adb
(async () => { جهاز const: سلسلة |. boolean = انتظار SelectDevice(); إذا (الجهاز) MIB ()؛ })(); تصدير const SelectDevice = async ():وعد<string|false> => { // الحصول على قائمة الأجهزة const: devicesType[] = devices(); إذا (طول القائمة === 0) { log("لا يوجد جهاز متصل حاليًا، يرجى الاتصال قبل تنفيذ الأداة"، "warn"); عودة كاذبة. } نتيجة const = list.map((i) => ({ title: i.name, value: i.name })); const { value } = انتظار المطالبات({ اكتب: "حدد"، الاسم: "القيمة"، الرسالة: "الرجاء تحديد جهازك"، الاختيارات: النتيجة، }); اسم الجهاز الحالي = القيمة؛ إرجاع اسم الجهاز الحالي؛ };بعد
اجتياز عقدة النسخ الاحتياطي
واختيار الجهاز، أدخل معلومات عقدة الاجتياز وقم بتنفيذ نسخ الملف إلى المسار المحدد (سمة output
في ملف التكوين)
const MIB = () => { // احصل على ملف التكوين const { Backup, Output } = getConfig(); // تحديد ما إذا كانت عقدة النسخ الاحتياطي فارغة if (backups.length === 0) { log("عقدة النسخ الاحتياطي الحالية فارغة"، "warn"); log("الرجاء إضافة العقد الاحتياطية إلى ملف التكوين"، "warn"); } إذا (backups. length > 0) { isPath(output); // تحليل المجلد الأخير لمسار النسخ الاحتياطي 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); constoutputDir = item.output item.output && pathRepair(item.output)؟ : مسار الجذر؛ // تحديد ما إذا كان مسار النسخ الاحتياطي موجودًا if (!isPathAdb(backupDir)) { log(`مسار النسخ الاحتياطي:${backupDir} غير موجود وتم تخطيه`، "خطأ"); } آخر { // تحديد مسار التصدير isPath(outputDir); النسخ الاحتياطي (backupDir،outputDir، item.full)؛ } }); } سجل ("انتهى البرنامج")؛ }; // قم بتحسين الملفات التي تحتاج إلى نسخ احتياطي، وأدخلها في قائمة انتظار النسخ الاحتياطي const Backup = (target: string,put: string, full: boolean = false) => { إذا (! كامل) { // النسخ الاحتياطي لبيانات الملف غير الاحتياطية // احصل على معلومات الملف في الهاتف المحمول وقارنها بالقيمة المحلية const { BackupQueue } = initData(target,output); // احسب الحجم والكمية computeBackupSize(backupQueue); // تنفيذ نقل برنامج النسخ الاحتياطي (backupQueue،output)؛ } آخر { // لا توجد مقارنة للملفات، نسخة احتياطية مباشرة moveFolder(target,output); } }; // انقل الملفات الموجودة في قائمة انتظار الملفات ليتم نسخها احتياطيًا const move = (backupQueue: FileNodeType[],outputDir: string): void => { إذا (backupQueue. length === 0) { log("لا يلزم النسخ الاحتياطي"); يعود؛ } لـ (ملف constN من قائمة انتظار النسخ الاحتياطي) { log("النسخ الاحتياطي ${fileN.fileName}`); يحاول { ثابت خارج: سلسلة = execAdb ( `اسحب "${fileN.filePath}" "${outputDir + fileN.fileName}"`, ); سرعة ثابتة: سلسلة |.null = out.match(speedReg) !== null ? out.match(speedReg)![0] : "فشلت قراءة السرعة"; log("متوسط سرعة الإرسال${speed}`); } قبض (ه: أي) { log(`فشل النسخ الاحتياطي ${fileN.fileName} خطأ:${e.message}`، "خطأ"); } }
;
USB
للبيانات الاحتياطيةأدخل الأمر التالي في الجهاز لتثبيت mib
عالميًا.
ملف البرنامج النصي للتكوين
npm i @qc2168/mib -g
لأول مرة، تحتاج إلى إنشاء ملف .mibrc
جديد في دليل المستخدم وتعيين محتوى المعلمة المقابل.
{ "النسخ الاحتياطية": [ { "المسار": "/sdcard/MIUI/sound_recorder/call_rec"، "تعليق": "تسجيل المكالمات" }, { "المسار": "/sdcard/DCIM/الكاميرا"، "comment": "ألبوم الصور المحلي" }, { "المسار": "/sdcard/DCIM/Creative"، "تعليق": "إبداعي" }, { "المسار": "/sdcard/Pictures/weixin"، "تعليق": "ألبوم صور WeChat" }, { "المسار": "/sdcard/tencent/qq_images", "تعليق": "ألبوم صور QQ" }, { "المسار": "/sdcard/Pictures/zhihu"، "تعليق": "زيهو" }, { "المسار": "/sdcard/tieba"، "تعليق": "طيبة" }, { "المسار": "/sdcard/DCIM/لقطات الشاشة"، "تعليق": "لقطة شاشة" }, { "المسار": "/sdcard/DCIM/مسجل الشاشة"، "تعليق": "تسجيل الشاشة" }, { "المسار": "/sdcard/MIUI/sound_recorder"، "تعليق": "تسجيل" }, { "المسار": "/sdcard/MIUI/sound_recorder/app_rec"، "تعليق": "تسجيل التطبيق" } ]، "الإخراج": "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