العمل مع نظام الملفات في Rust: عمليًا
\n\nRust هي لغة برمجة أنظمة حديثة تجمع بين الأداء العالي وأمان الذاكرة. إحدى المهام الرئيسية التي يواجهها كل مطور هي العمل مع نظام الملفات. في هذه المقالة، سنستعرض من خلال أمثلة عملية كيفية قراءة وكتابة الملفات، وإنشاء المجلدات، ومعالجة الأخطاء، وتنفيذ عمليات أخرى مع نظام الملفات في Rust.
\n\nالوحدات الأساسية للعمل مع نظام الملفات
\n\nفي Rust، يتركز العمل مع نظام الملفات في المكتبة القياسية. الوحدات الأساسية:
\n\n- \n
std::fs— دوال للعمل مع الملفات والمجلدات (قراءة، كتابة، إنشاء، حذف). \n std::path— التعامل مع المسارات (Path,PathBuf). \n std::io— الإدخال والإخراج، بما في ذلك السماتReadوWrite. \n
للبدء، يكفي استيراد الوحدات المطلوبة:
\n\nuse std::fs;\nuse std::path::Path;\nuse std::io::prelude::*;\nuse std::fs::File;\n\nقراءة الملفات في Rust
\n\nأبسط طريقة لقراءة ملف كامل هي استخدام الدالة fs::read_to_string. تقوم بإرجاع Result<String>، مما يسمح بمعالجة الأخطاء بسهولة.
use std::fs;\n\nfn main() {\n let file_path = "example.txt";\n \n match fs::read_to_string(file_path) {\n Ok(content) => println!("محتوى الملف:\\n{}", content),\n Err(e) => eprintln!("خطأ في قراءة الملف: {}", e),\n }\n}\n\nإذا كنت بحاجة لقراءة الملف سطرًا بسطر (مثل الملفات الكبيرة)، استخدم BufReader:
use std::fs::File;\nuse std::io::{BufRead, BufReader};\n\nfn main() {\n let file = File::open("example.txt").expect("فشل فتح الملف");\n let reader = BufReader::new(file);\n\n for line in reader.lines() {\n match line {\n Ok(content) => println!("{}", content),\n Err(e) => eprintln!("خطأ في قراءة السطر: {}", e),\n }\n }\n}\n\nكتابة البيانات إلى الملفات
\n\nلكتابة البيانات إلى ملف، استخدم fs::write (كتابة سلسلة نصية بسيطة) أو File::create مع الكتابة عبر write! أو writeln!.
use std::fs;\n\nfn main() {\n let content = "مرحبًا بالعالم!\\nهذا سطر للكتابة.";\n fs::write("output.txt", content).expect("خطأ في كتابة الملف");\n println!("تم كتابة الملف بنجاح");\n}\n\nللكتابة المتسلسلة أو إلحاق البيانات، استخدم OpenOptions:
use std::fs::OpenOptions;\nuse std::io::Write;\n\nfn main() {\n let mut file = OpenOptions::new()\n .append(true) // إلحاق الملف\n .create(true) // إنشاء إذا لم يكن موجودًا\n .open("log.txt")\n .expect("فشل فتح الملف");\n\n writeln!(file, "تسجيل في السجل: {}", chrono::Local::now()).expect("خطأ في الكتابة");\n}\n\nالعمل مع المجلدات والمسارات
\n\nيوفر Rust أدوات مناسبة لإنشاء وحذف وتصفح المجلدات. دعنا نستعرض العمليات الأساسية.
\n\nإنشاء وحذف المجلدات
\n\nuse std::fs;\n\nfn main() {\n // إنشاء مجلد واحد\n fs::create_dir("new_folder").expect("خطأ في إنشاء المجلد");\n \n // إنشاء مجلدات متداخلة (مشابه لـ mkdir -p)\n fs::create_dir_all("parent/child/grandchild").expect("خطأ في إنشاء المجلدات المتداخلة");\n \n // حذف مجلد فارغ\n fs::remove_dir("new_folder").expect("خطأ في حذف المجلد");\n \n // حذف مجلد بكل محتوياته\n fs::remove_dir_all("parent").expect("خطأ في حذف المجلد بمحتوياته");\n}\n\nتصفح محتويات المجلد
\n\nللحصول على قائمة بالملف