در کتابخانه‌ی std::filesystem، سطح دسترسی فایل‌ها از طریق نوع داده‌ی perms که یک BitmaskType است، مدیریت می‌شود . این نوع داده، مجموعه‌ای از ثابت‌های از پیش تعریف‌شده را ارائه می‌دهد که هرکدام نشان‌دهنده‌ی یک مجوز خاص مانند owner_read، owner_write، group_read و others_read هستند . این پرچم‌ها به‌صورت بیتی طراحی شده‌اند و با استفاده از عملگرهای بیتی مانند | و & می‌توان آنها را ترکیب یا بررسی کرد . باید توجه داشت که در برخی سیستم‌ها، پرمیشن‌ها ممکن است به‌صورت دقیقاً همان بیت‌ها پیاده‌سازی نشوند، اما به‌صورت مفهومی به‌همین شکل در نظر گرفته می‌شوند .

بررسی سطح دسترسی فایل

برای مشاهده‌ی پرمیشن‌های فعلی یک فایل، دو روش اصلی وجود دارد. اولین روش، استفاده از تابع status است که یک شیء از نوع file_status برمی‌گرداند و با فراخوانی متد permissions() روی آن، می‌توان به مقدار پرمیشن‌ها دسترسی پیدا کرد . این روش، از تابع سیستمعامل stat استفاده می‌کند و در صورت وجود پیوند سمبلیک، آن را تا رسیدن به فایل مقصد دنبال می‌کند . روش دوم، استفاده از متدهای status و symlink_status در کلاس directory_entry است که در حین پیمایش دایرکتوری‌ها، اطلاعات پرمیشن‌ها را به‌عنوان یک محصول جانبی فراهم می‌کنند و نیازی به فراخوانی مجدد سیستمعامل ندارند . همچنین symlink_status مشابه status عمل می‌کند با این تفاوت که پیوندهای سمبلیک را دنبال نمی‌کند و اطلاعات خود پیوند را بازمی‌گرداند .

تغییر پرمیشن‌ها با تابع permissions

برای تغییر سطح دسترسی فایل‌ها، تابع std::filesystem::permissions در اختیار برنامه‌نویس قرار گرفته است که با دریافت سه پارامتر اصلی کار می‌کند: مسیر فایل (path)، پرمیشن‌های مورد نظر (prms)، و گزینه‌های عملیات (perm_options) . این تابع می‌تواند به‌صورت پیش‌فرض پرمیشن‌ها را جایگزین کند، یا با استفاده از گزینه‌های add و remove، به‌صورت افزایشی یا کاهشی عمل نماید .

گزینه‌های تغییر پرمیشن

گزینه‌های عملیات که از طریق perm_options مشخص می‌شوند، نقش کلیدی در نحوه‌ی اعمال تغییرات دارند :

  • replace (حالت پیش‌فرض): پرمیشن‌های فعلی فایل را کاملاً با پرمیشن‌های مشخص‌شده جایگزین می‌کند .

  • add: پرمیشن‌های مشخص‌شده را به پرمیشن‌های فعلی اضافه می‌کند (عملیات OR بیتی) .

  • remove: پرمیشن‌های مشخص‌شده را از پرمیشن‌های فعلی حذف می‌کند (عملیات AND با نقیض) .

  • nofollow: در صورت وجود پیوند سمبلیک، تغییرات روی خود پیوند اعمال می‌شود، نه روی فایل مقصد .

مدیریت خطا و تفاوت‌های سیستمعامل

تابع permissions در دو نسخه ارائه شده است: یک نسخه که در صورت بروز خطا، استثنای filesystem_error پرتاب می‌کند و نسخه‌ی دیگر که یک شیء error_code را برای گزارش خطا دریافت می‌کند . نکته‌ی مهم در مورد پرمیشن‌ها، رفتار متفاوت آنها در سیستمعامل‌های مختلف است. برای مثال، ممکن است برخی از بیت‌های پرمیشن در برخی سیستم‌ها نادیده گرفته شوند، یا تغییر یک بیت به‌صورت خودکار بیت‌های دیگر را تحت تأثیر قرار دهد. به‌عنوان نمونه، در سیستم‌هایی که تفاوتی بین مالک، گروه و دیگران قائل نمی‌شوند، تنظیم هر یک از سه بیت نوشتن، هر سه بیت را فعال می‌کند .

کاربرد عملی در پیمایش دایرکتوری

یکی از کاربردهای مهم پرمیشن‌ها، هنگام پیمایش دایرکتوری‌ها با directory_iterator است. همان‌طور که در نمونه‌های مستندات مشاهده می‌شود، می‌توان در حین پیمایش، وضعیت پرمیشن‌های هر ورودی را با استفاده از directory_entry دریافت کرد و بر اساس آن تصمیم‌گیری نمود . این روش بسیار کارآمد است، زیرا بسیاری از سیستمعامل‌ها در حین بازگشت ورودی‌های دایرکتوری، اطلاعات پرمیشن‌ها را نیز ارائه می‌دهند و نیازی به فراخوانی سیستم‌های اضافی نیست .

کلیدواژه ها : std::filesystem permissions-بررسی سطح دسترسی فایل در C++17-تغییر پرمیشن فایل در C++-std::filesystem status-std::filesystem perms-perm_options-std::filesystem file_status-مدیریت مجوزهای فایل-std::filesystem symlink_status-تنظیم دسترسی فایل-std::filesystem error_code-تفاوت پرمیشن در ویندوز و لینوکس-آموزش std::filesystem-کاربرد directory_entry status