العمل مع نظام الملفات في Go: دليل عملي
Go (Golang) هي لغة حديثة ومترجمة، وهي مثالية لبناء تطبيقات الخادم والأدوات المساعدة وأدوات سطر الأوامر. إحدى المهام الرئيسية في مثل هذه المشاريع هي العمل مع نظام الملفات. في هذه المقالة، سنستعرض أمثلة عملية: من فتح وقراءة الملفات إلى التجوال التكراري عبر المجلدات. جميع الأمثلة مكتوبة بلغة Go الخالصة دون استخدام مكتبات خارجية.
الأساسيات: فتح وقراءة وكتابة الملفات
توفر حزمة os دوالًا للعمل مع الملفات على مستوى منخفض. لقراءة محتوى ملف كامل في الذاكرة، استخدم os.ReadFile (متاح منذ Go 1.16).
package main
import ( "fmt" "os")
func main() { data, err := os.ReadFile("example.txt") if err != nil { fmt.Println("خطأ في قراءة الملف:", err) return } fmt.Println(string(data))}لكتابة البيانات إلى ملف، توجد دالة os.WriteFile. تقوم بإنشاء الملف إذا لم يكن موجودًا، أو الكتابة فوق الملف الموجود.
package main
import ( "fmt" "os")
func main() { content := []byte("Hello, Go!السطر الثاني") err := os.WriteFile("output.txt", content, 0644) if err != nil { fmt.Println("خطأ في الكتابة:", err) return } fmt.Println("تمت كتابة الملف بنجاح")}الوسيط الثالث 0644 هو صلاحيات الوصول بنظام Unix (يمكن للمالك القراءة والكتابة، والآخرون القراءة فقط). في Windows، يتم تجاهل هذا الوسيط جزئيًا.
القراءة والكتابة المتدفقة: العمل مع الملفات الكبيرة
للعمل مع الملفات الكبيرة (أكثر من بضعة ميغابايت)، لا ينبغي تحميلها بالكامل في الذاكرة. استخدم القراءة المخزنة مؤقتًا عبر bufio أو حزمة io.
package main
import ( "bufio" "fmt" "os")
func main() { file, err := os.Open("large_file.log") if err != nil { fmt.Println("خطأ في الفتح:", err) return } defer file.Close()
scanner := bufio.NewScanner(file) for scanner.Scan() { line := scanner.Text() // معالجة السطر fmt.Println(line) }
if err := scanner.Err(); err != nil { fmt.Println("خطأ في المسح:", err) }}للكتابة المتدفقة، استخدم bufio.NewWriter:
package main
import ( "bufio" "fmt" "os")
func main() { file, err := os.Create("output_stream.txt") if err != nil { fmt.Println("خطأ في الإنشاء:", err) return } defer file.Close()
writer := bufio.NewWriter(file) for i := 0; i < 10; i++ { _, err := writer.WriteString(fmt.Sprintf("السطر %d", i+1)) if err != nil { fmt.Println("خطأ في الكتابة:", err) return } } writer.Flush() // مهم: تفريغ المخزن المؤقت fmt.Println("اكتملت الكتابة")}طريقة Flush() إلزامية - بدونها قد تبقى البيانات في المخزن المؤقت ولا تصل إلى الملف.
العمل مع المجلدات: الإنشاء والحذف والتجوال
يمكن إنشاء مجلد جديد باستخدام os.Mkdir (مجلد واحد) أو os.MkdirAll (بشكل تكراري، مثل mkdir -p).
package main
import ( "fmt" "os")
func main() { // إنشاء مجلد واحد err := os.Mkdir("new_folder", 0755) if err != nil { fmt.Println("خطأ في إنشاء المجلد:", err) }
// إنشاء هيكل متداخل err = os.MkdirAll("a/b/c/d", 0755) if err != nil { fmt.Println("خطأ في إنشاء المجلدات المتداخلة:", err) } else { fmt.Println("تم إنشاء المجلدات") }}يتم حذف المجلد باستخدام os.Remove (فقط ال