أصبح فك الضغط سهلاً مع Go
أصبح فك ضغط الملفات في Go أمرًا سهلاً مع الحزمة المضغوطة. تسمح لك بساطتها بإنشاء وظيفة مساعدة مثل هذا:
func Unzip(src, dest string) error { r, err := zip.OpenReader(src) if err != nil { return err } defer func() { if err := r.Close(); err != nil { panic(err) } }() os.MkdirAll(dest, 0755) // Closure isolates file descriptor .Close() calls extractAndWriteFile := func(f *zip.File) error { rc, err := f.Open() if err != nil { return err } defer func() { if err := rc.Close(); err != nil { panic(err) } }() path := filepath.Join(dest, f.Name) // Prevent ZipSlip vulnerability if !strings.HasPrefix(path, filepath.Clean(dest) string(os.PathSeparator)) { return fmt.Errorf("illegal file path: %s", path) } if f.FileInfo().IsDir() { os.MkdirAll(path, f.Mode()) } else { os.MkdirAll(filepath.Dir(path), f.Mode()) f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_TRUNC, f.Mode()) if err != nil { return err } defer func() { if err := f.Close(); err != nil { panic(err) } }() _, err = io.Copy(f, rc) if err != nil { return err } } return nil } for _, f := range r.File { err := extractAndWriteFile(f) if err != nil { return err } } return nil }
يتكرر هذا الرمز بدقة على كل ملف في الأرشيف المضغوط، ويتعامل مع الدلائل والملفات العادية بشكل مناسب مع ضمان صحة مسار الملف. لاحظ أن أسلوب الإغلاق يلغي التراص غير الضروري، ويعزز التغليف، ويبسط معالجة الأخطاء.
تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.
Copyright© 2022 湘ICP备2022001581号-3