العمل مع نظام الملفات في Rust: دليل شامل

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

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

ابدأ الدورة

مقدمة في العمل مع نظام الملفات في Rust

Rust هي لغة برمجة أنظمة حديثة تقدم أدوات قوية وآمنة للتفاعل مع نظام الملفات. على عكس العديد من اللغات الأخرى، تضمن Rust سلامة العمل مع الذاكرة والخيوط، وهو أمر مهم بشكل خاص في عمليات الإدخال والإخراج. في هذه المقالة، سنشرح بالتفصيل كيفية إنشاء وقراءة وكتابة الملفات والدلائل، وإدارة المسارات، ومعالجة الأخطاء باستخدام المكتبة القياسية std::fs و std::path.

ستكون المادة مفيدة لكل من المبتدئين الذين يتعرفون على Rust لأول مرة، والمطورين ذوي الخبرة الذين يرغبون في تحديث معرفتهم. جميع أمثلة الكود جاهزة للتشغيل ومرفقة بتعليقات.



الوحدات الأساسية والاستيرادات

للعمل مع نظام الملفات في Rust، يتم استخدام وحدتين رئيسيتين:

  • std::fs — توفر دوال للعمليات على الملفات والمجلدات (القراءة، الكتابة، الحذف، النسخ، إلخ).
  • std::path — تحتوي على الأنواع Path و PathBuf للعمل مع المسارات.

لمعظم المهام، يكفي إضافة الاستيرادات التالية:

use std::fs;use std::path::Path;use std::io::prelude::*; // للعمل مع التدفقات


العمل مع الملفات: القراءة والكتابة

قراءة محتوى الملف

أبسط طريقة لقراءة ملف كامل في سلسلة نصية هي استخدام الدالة fs::read_to_string. تقوم بإرجاع Result<String>، لذلك يجب معالجة الخطأ المحتمل.

use std::fs;

fn read_file(path: &str) -> Result<String, std::io::Error> { let content = fs::read_to_string(path)?; Ok(content)}

fn main() { match read_file("example.txt") { Ok(text) => println!("محتوى الملف:{}", text), Err(e) => eprintln!("خطأ في القراءة: {}", e), }}

إذا كنت بحاجة لقراءة ملف كبيانات ثنائية، استخدم fs::read الذي يُرجع Vec<u8>.



الكتابة في ملف

لكتابة سلسلة نصية في ملف، يتم استخدام fs::write. ستقوم بإنشاء الملف إذا لم يكن موجودًا، أو إعادة كتابة الملف الموجود.

use std::fs;

fn write_file(path: &str, content: &str) -> Result<(), std::io::Error> { fs::write(path, content)?; println!("تمت كتابة الملف بنجاح"); Ok(())}

fn main() { let data = "Hello, Rust!السطر الثاني."; if let Err(e) = write_file("output.txt", data) { eprintln!("خطأ في الكتابة: {}", e); }}

للإلحاق بنهاية الملف أو للتحكم الدقيق، استخدم OpenOptions:

use std::fs::OpenOptions;use std::io::Write;

fn append_to_file(path: &str, line: &str) -> Result<(), std::io::Error> { let mut file = OpenOptions::new() .append(true) .create(true) .open(path)?; writeln!(file, "{}", line)?; Ok(())}


العمل مع الدلائل

إنشاء وحذف المجلدات

لإنشاء دليل، استخدم fs::create_dir (مجلد واحد) أو fs::create_dir_all (بشكل متكرر، مثل mkdir -p).

use std::fs;

fn main() -> Result<(), std::io::Error> { // إنشاء مجلد واحد fs::create_dir("my_folder")?;

// إنشاء مجلدات متداخلة بشكل متكرر fs::create_dir_all("data/subdir/logs")?;

// حذف مجلد فارغ fs::remove_dir("my_folder")?;

// حذف مجلد بكل محتوياته بشكل متكرر fs::remove_dir_all("data")?;

Ok(())}


قراءة محتوى الدليل

الدالة fs::read_dir تُرجع مكررًا على إدخالات الدليل. كل إدخال هو DirEntry، يمكن من خلاله الحصول على الاسم والنوع والبيانات الوصفية.

use std::fs;

fn list_directory(path:

المدونات

توصيات الكتب