رفتن به مطلب
جامعهٔ برنامه‌نویسان مُدرن ایران
کامبیز اسدزاده

معرفی و کار با فایل‌سیستم‌ها در استاندارد C++17


پست های پیشنهاد شده

اگرچه که زبان برنامه‌نویسی سی‌پلاس‌پلاس به عنوان یک زبان بسیار قدرتمند و قدیمی شناخته شده است، اما کتابخانهٔ استاندارد و پیشفرض آن برخی از موارد واقعاً مهم را به تازگی تعبیه کرده است. ویژگی‌هایی که در زبان‌هایی مثل جاوا و یا سی‌شارپ دات‌نت سال‌هاست وجود دارند. به هر حال این ویژگی‌ها در سی++ ۱۷ موجود شده‌اند و این یک بهبود و پیشرفت بسیار خوب است. برای مثال ما الآن فایل‌سیستم استانداردی را در اختیار داریم.

cpp-filesystem-01.png

این ویژگی به عنوان یک کتابخانه، امکان برای انجام عملیات بر روی سیستم‌فایل‌ها و اجزای آن‌ها مانند، مسیر‌ها، فایل‌ها و پوشه‌ها را فراهم می‌کند.

کتابخانهٔ فایل‌سیستم در فایل سرآیند <filesystem> قرار گرفته است که توسط فضای نام مخصوص خود std::filesystem قابل فراخوانی است.

به مثال زیر توجه کنید:

namespace fs = std::filesystem;

استفاده از این کتابخانه بسیار ساده و کاربردی است، بنابراین اگر بخواهیم به سادگی مسیری از یک ریشه را به دست آوریم، کد آن به صورت زیر خواهد بود:

#include <iostream>
#include <filesystem>

namespace fs = std::filesystem;
 
int main()
{
    fs::path p = fs::current_path();
 
    std::cout << "The current path " << p << " decomposes into:\n"
              << "root name " << p.root_name() << '\n'
              << "root directory " << p.root_directory() << '\n'
              << "relative path " << p.relative_path() << '\n';
}

فراخوانی کتابخانه، نمونه‌سازی از کلاس current_path و سپس چاپ نام، ریشه و مسیر مربوطهٔ آن صورت گرفته است.

بنابراین این کتابخانه دارای کلاس‌های زیر است که توضیح و کاربرد هر کدام را آورده‌ایم:

  1. کلاس path، این کلاس امکان کار با مسیر‌ها را فراهم می‌کند، در واقع برای نمایش یا مشاهدهٔ یک مسیر از این کلاس استفاده خواهیم کرد.
  2. کلاس filesystem_error یک شیء استثناء در اثر سربارگذاری بیش‌از حد کتابخانهٔ فایل‌سیستم ایجاد می‌کند، در واقع برای مدیریت خطاها کاربردی خواهد بود.
  3. کلاس directory_entry برای کنترل ورودی یک مسیر استفاده می‌شود، برای مثال بررسی وجود یا عدم وجود در زیر مجموعه‌های این کلاس امکان‌پذیر است.
  4. کلاس directory_iterator یک تکرار کننده از محتوای یک مسیر (دایرکتوری) را ارائه می‌کند.
  5. کلاس recursive_directory_iterator یک تکرار کننده از محتوایت یک مسیر یا زیر مسیر‌های آن را ارائه می‌کند.
  6. کلاس file_status نوع فایل و مجوز‌های آن را ارائه می‌کند.
  7. کلاس space_info اطلاعات مربوط به فضای آزاد و موجود در سیستم‌فایل را ارائه می‌کند.
  8. کلاس file_type اطلاعات مربوط به نوع فایل را ارائه می‌کند.
  9. کلاس perms مجوز‌های سیستم‌فایل را شناسایی می‌کند.
  10. کلاس perm_options معانی هر یک از عملیات مرتبط با مجوز‌ها را ارائه می‌کند.
  11. کلاس copy_options معانی عملیات کپی را مشخص می‌کند.
  12. کلاس directory_options معانی عملیات مربوط به مسیر (دایرکتوری) را مشخص می‌کند.
  13. کلاس file_time_type مقادیر زمانی مربوط به فایل را ارائه می‌کند.

هر یک از کلاس‌های فوق دارای متد‌ها و توابعی هستند که در مدیریت فایل‌سیستم بسیار کاربردی و مفید خواهد بود.

در کلاس path شما می‌توانید با متد‌های مفیدی کار کنید، برای مثال کد زیر پسوند یک فایل موجود که در مسیر به آن اشاره می‌شود را، در صورت وجود ارائه خواهد کرد.

fs::path("/foo/bar.txt").extension();

اگر مسیر فوق دارای فایل ذکر شده باشد، مقدار برگشتی آن .txt خواهد بود. و یا اگر نیاز باشد نام فایل را ارائه کند کافی است از متد file_name آن استفاده کنید! به مثال‌های زیر توجه کنید:

#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;

int main()
{
  std::cout << fs::path("/foo/bar.txt").filename() << '\n'
            << fs::path("/foo/.bar").filename() << '\n'
            << fs::path("/foo/bar/").filename() << '\n'
            << fs::path("/foo/.").filename() << '\n'
            << fs::path("/foo/..").filename() << '\n'
            << fs::path(".").filename() << '\n'
            << fs::path("..").filename() << '\n'
            << fs::path("/").filename() << '\n'
            << fs::path("//host").filename() << '\n';
}

همچنین جهت مدیریت خطا و دریافت یک کد یا پیغام خطا به کد زیر توجه کنید:

  try {
    cout << fs::file_size("path&file");
  }  catch (fs::filesystem_error &e) {
    cout << "Error Message = " << e.what() << " with Code : " << e.code();
  }

در صورتی که خطایی رخ دهد، کد خطا ساطع خواهد شد، جهت نمایش پیام خطا از تابع what و دریافت کد خطا از تابع code استفاده می‌شود.

این مقاله ادامه دارد...

  • تشکر شده 1

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر
مهمان
این موضوع برای عدم ارسال قفل گردیده است.

  • کاربران آنلاین در این صفحه   0 کاربر

    هیچ کاربر عضوی،در حال مشاهده این صفحه نیست.

×
×
  • جدید...