در گذشته، برنامهنویسان برای کار با مسیر فایلها اغلب از رشتههای ساده (مانند 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++