در گذشته، برنامه‌نویسان برای کار با مسیر فایل‌ها اغلب از رشته‌های ساده (مانند std::string) استفاده می‌کردند. این روش اگرچه ساده به نظر می‌رسید، اما با چالش‌های متعددی همراه بود. تفاوت جداکننده‌های مسیر در سیستمعامل‌های مختلف (مثلاً \ در ویندوز و / در لینوکس)، خطر خطا در عملیات‌های رشته‌ای مانند پیدا کردن آخرین جداکننده برای استخراج نام فایل، و ناتوانی در تشخیص خودکار بخش‌های مختلف یک مسیر، از جمله این مشکلات بودند . کلاس path که در C++17 به کتابخانه‌ی std::filesystem اضافه شده، با ارائه‌ی یک نمایش انتزاعی و قابل‌حمل از مسیرها، تمام این مشکلات را حل کرده است .

ساختار و مؤلفه‌های اصلی یک مسیر

یک شیء از نوع path می‌تواند از رشته‌های معمولی ساخته شود و نیازی به بررسی وجود فایل در سیستم ندارد؛ این کلاس صرفاً یک ظرف مناسب برای نگهداری مسیر است و عملیات‌های مربوط به وجود فایل، توسط توابع جداگانه‌ای مانند exists انجام می‌شود . یک مسیر در std::filesystem از بخش‌های زیر تشکیل شده است: نام ریشه (مانند C: در ویندوز)، دایرکتوری ریشه (مانند / در یونیکس یا \ در ویندوز) و مسیر نسبی (شامل صفر یا چند نام فایل و دایرکتوری) . کلاس path توابعی برای دسترسی به هر یک از این مؤلفه‌ها ارائه می‌دهد.

تجزیه و تحلیل مؤلفه‌های مسیر

یکی از قدرتمندترین قابلیت‌های کلاس path، امکان تجزیه و دسترسی به بخش‌های مختلف یک مسیر به‌صورت مستقیم و بدون درگیری با عملیات رشته‌ای است . مهم‌ترین این متدها عبارتند از:

  • parent_path(): مسیر دایرکتوری والد را بازمی‌گرداند .

  • filename(): آخرین مؤلفه‌ی مسیر را که معمولاً نام فایل یا آخرین دایرکتوری است، برمی‌گرداند .

  • stem(): نام فایل را بدون پسوند بازمی‌گرداند .

  • extension(): پسوند فایل را به‌همراه نقطه (".") بازمی‌گرداند. برای مثال، برای مسیر "/foo/bar.txt"، مقدار ".txt" را برمی‌گرداند .

  • root_name() و root_directory(): به‌ترتیب نام ریشه و دایرکتوری ریشه را برمی‌گردانند .

  • has_extension() و توابع مشابه: بررسی می‌کنند که آیا مؤلفه‌ی مورد نظر در مسیر وجود دارد یا خیر .

نکته‌ی مهم در مورد متد extension این است که نقطه‌ی ابتدای پسوند را نیز شامل می‌شود و در صورتی که نام فایل با نقطه شروع شود (مانند فایل‌های مخفی یونیکس)، آن نقطه را به‌عنوان پسوند در نظر نمی‌گیرد .

ساخت و اتصال مسیرها

برای ساخت یک مسیر جدید از مؤلفه‌ها، کلاس path عملگر / و /= را ارائه می‌دهد که برخلاف عملگر + در رشته‌ها، به‌صورت خودکار جداکننده‌ی مناسب را بین بخش‌های مسیر قرار می‌دهد . این عملگرها، همخوانی بسیار بالایی با مفهوم ذهنی «ساختن مسیر» دارند و کد را خواناتر می‌سازند؛ به‌طوری که نوشتن dir / filename به‌وضوح قصد برنامه‌نویس را نشان می‌دهد . برای اتصال صرف و بدون درج جداکننده نیز می‌توان از متد concat یا عملگر += استفاده کرد، که این موارد بیشتر برای کار با رشته‌های خاص کاربرد دارند .

تغییر مؤلفه‌های مسیر

علاوه بر تجزیه، کلاس path امکان تغییر مؤلفه‌های مسیر را نیز فراهم می‌کند. متد replace_filename نام فایل را با مقدار جدید جایگزین می‌کند و replace_extension پسوند فایل را تغییر می‌دهد . این متد، که یک کاربرد کلاسیک آن ساخت نسخه‌ی پشتیبان از یک فایل با تغییر پسوند به ".bak" است، بسیار کارآمدتر از عملیات‌های دستی روی رشته‌ها عمل می‌کند .

پردازش لغوی مسیرها: normalize و relative

گاهی اوقات نیاز به پردازش یک مسیر بدون دسترسی به سیستم‌فایل داریم. کلاس path متدهای لغوی (Lexical) را برای این منظور ارائه می‌دهد . lexically_normal مسیر را با حذف . و .. و جداکننده‌های اضافی، به حالت عادی درمی‌آورد . lexically_relative یک مسیر را نسبت به مسیر پایه، به‌صورت نسبی محاسبه می‌کند و در صورت عدم امکان، یک مسیر خالی بازمی‌گرداند . lexically_proximate نیز مشابه است، اما در صورت عدم موفقیت، خود مسیر اصلی را بازمی‌گرداند . این توابع کاملاً بر اساس رشته‌ها عمل می‌کنند و به هیچ‌وجه به وجود فایل‌ها در سیستم کاری ندارند .

نکته‌ی مهم: کراس‌پلتفرم بودن و نمایش

کلاس path به‌گونه‌ای طراحی شده که امکان استفاده از جداکننده‌های استاندارد (مثلاً /) در کد را فراهم می‌کند و خود آن را به فرمت بومی هر سیستمعامل تبدیل می‌نماید. همچنین متدهای string() و generic_string() امکان دریافت مسیر را به‌صورت رشته‌ای با جداکننده‌های بومی یا عمومی فراهم می‌آورند . در مورد کدگذاری (Encoding) مسیرها نیز باید توجه داشت که کتابخانه‌ی filesystem با کدگذاری‌های مختلف کار می‌کند و در C++26 بهبودهایی برای پشتیبانی کامل از مسیرهای یونیکد، حتی در ویندوز، ارائه شده است .

کلیدواژه ها : std::filesystem path-کار با مسیرها در C++17-std::path tutorial-تجزیه مسیر در C++-parent_path-filename-stem-extension-replace_extension-lexically_normal-lexically_relative-اتصال مسیرها در C++-ساخت مسیر با operator/-متدهای کلاس path-آموزش std::filesystem-مدیریت مسیر در C++