العمل مع نظام الملفات في Go: عمليًا

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

العمل مع نظام الملفات في Go: عمليًا

\n\n

العمل مع نظام الملفات هو أحد المهام الأساسية لأي تطبيق خادم. توفر لغة Go (Golang) مجموعة أدوات قوية وأنيقة لقراءة وكتابة وحذف وإدارة الملفات والمجلدات. في هذه المقالة، سنستعرض أمثلة عملية للعمل مع الملفات في Go باستخدام الحزم القياسية os و io/ioutil (قبل Go 1.16) و io. ستتعلم كيفية إدارة البيانات على القرص بكفاءة، ومعالجة الأخطاء، وكتابة كود نظيف.

\n\n

1. الأساسيات: فتح وقراءة وكتابة الملفات

\n\n

لنبدأ بأكثر العمليات شيوعًا. لفتح ملف، نستخدم الدالة os.OpenFile أو الدوال الأبسط os.Create و os.Open. لنلقِ نظرة على مثال لقراءة ملف كامل في الذاكرة:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc main() {\n    // قراءة الملف بأكمله (قبل Go 1.16 كنا نستخدم ioutil.ReadFile)\n    data, err := os.ReadFile("example.txt")\n    if err != nil {\n        fmt.Println("خطأ في قراءة الملف:", err)\n        return\n    }\n    fmt.Println("محتوى الملف:")\n    fmt.Println(string(data))\n}\n
\n\n

لكتابة البيانات إلى ملف، استخدم os.WriteFile:

\n\n
package main\n\nimport (\n    "os"\n)\n\nfunc main() {\n    content := []byte("مرحبًا، عالم Go!\\nالسطر الثاني.")\n    err := os.WriteFile("output.txt", content, 0644)\n    if err != nil {\n        panic(err)\n    }\n    // تم إنشاء ملف output.txt ويحتوي على نصنا\n}\n
\n\n

إذا كنت بحاجة إلى إضافة بيانات في نهاية الملف، استخدم العلامات:

\n\n
file, err := os.OpenFile("log.txt", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)\nif err != nil {\n    panic(err)\n}\ndefer file.Close()\n\nif _, err := file.WriteString("إدخال جديد في السجل\\n"); err != nil {\n    panic(err)\n}\n
\n\n

2. العمل مع المجلدات: إنشاء وحذف وتصفح

\n\n

إدارة المجلدات لا تقل أهمية. يمكن إنشاء مجلد جديد باستخدام os.Mkdir (مجلد واحد) أو os.MkdirAll (بشكل متكرر، مثل mkdir -p):

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n)\n\nfunc main() {\n    // إنشاء مجلد واحد\n    err := os.Mkdir("data", 0755)\n    if err != nil {\n        fmt.Println("خطأ في إنشاء المجلد:", err)\n    }\n\n    // إنشاء هيكل متداخل بشكل متكرر\n    err = os.MkdirAll("data/subdir/logs", 0755)\n    if err != nil {\n        fmt.Println("خطأ:", err)\n    }\n}\n
\n\n

لتصفح مجلد، يمكن استخدام الدالة os.ReadDir (بديل ioutil.ReadDir):

\n\n
entries, err := os.ReadDir(".")\nif err != nil {\n    panic(err)\n}\n\nfor _, entry := range entries {\n    fmt.Printf("الاسم: %s, مجلد: %t\\n", entry.Name(), entry.IsDir())\n}\n
\n\n

ولتصفح جميع الملفات والمجلدات بشكل متكرر، استخدم filepath.Walk من الحزمة path/filepath:

\n\n
package main\n\nimport (\n    "fmt"\n    "os"\n    "path/filepath"\n)\n\nfunc main() {\n    err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {\n        if err != nil {\n            return err\n        }\n        fmt.Println(path)\n        return nil\n    })\n    if err != nil {\n        fmt.Println("خطأ في التصفح:", err)\n    }\n}\n
\n\n

يتم حذف الملفات والمجلدات باستخدام الدالتين os.Remove و os.RemoveAll:

\n\n
// حذف ملف واحد أو مجلد فارغ\nos.Remove("temp.txt")\n\n// حذف مجلد بكل محتوياته (مشابه لـ rm -rf)\nos.RemoveAll("data")\n
\n\n

3. تقنيات متقدمة: الإدخال/الإخراج المخزن والعمل مع الملفات المؤقتة

\n\n

بالنسبة للملفات الكبيرة، قراءة المحتوى بالكامل في الذاكرة غير فعالة. استخدم القراءة المخزنة باستخدام bufio:

\n\n
package main\n\nimport (\n    "bufio"\n    "                

المدونات

توصيات الكتب