کتابخانه‌ی std::filesystem دو روش اصلی برای کپی کردن فایل‌ها ارائه می‌دهد. تابع عمومی copy که بسته به نوع مسیر مبدأ، عمل کپی را به‌صورت هوشمندانه انجام می‌دهد؛ اگر مبدأ یک فایل باشد، آن را کپی می‌کند و اگر یک دایرکتوری باشد، بسته به گزینه‌های تعیین‌شده، رفتار متفاوتی از خود نشان می‌دهد . در مقابل، تابع copy_file که تخصصی‌تر است، صرفاً برای کپی کردن فایل‌های معمولی طراحی شده و اگر مبدأ یک دایرکتوری باشد، عملیات با خطا مواجه می‌شود . یکی از مهم‌ترین نکات در کپی فایل‌ها، تعیین سیاست برخورد با نام‌های تکراری (Overwrite Policy) است. این سیاست از طریق پارامتر copy_options تعیین می‌شود که شامل گزینه‌هایی مانند overwrite_existing برای بازنویسی فایل مقصد در صورت وجود، skip_existing برای صرف‌نظر کردن از کپی در صورت وجود فایل مقصد، و update_existing برای کپی کردن تنها در صورتی که فایل مبدأ جدیدتر از فایل مقصد باشد، می‌شود . اگر هیچ‌کدام از این گزینه‌ها به‌صراحت مشخص نشود، عملیات کپی در صورت وجود فایل مقصد، با شکست مواجه شده و استثنا پرتاب می‌کند .

تغییر نام و انتقال فایل‌ها

تابع rename یک عملیات سطح بالا است که در پس‌زمینه از قابلیت‌های سیستمعامل برای تغییر نام و جابه‌جایی فایل‌ها استفاده می‌کند . این تابع در واقع نوعی «تغییر نشانه» (جدول مسیر) است و داده‌ها را کپی نمی‌کند، بنابراین یک عملیات بسیار سریع محسوب می‌شود . برای تغییر نام فایل‌ها در یک مسیر، rename به‌سادگی نام جدید را به آن انتساب می‌دهد و برای جابه‌جایی فایل‌ها بین دایرکتوری‌های مختلف، مسیر جدید همراه با نام فایل را مشخص می‌کند . یک کاربرد کلاسیک این تابع، چرخش لاگ‌ها (log rotation) است که در آن فایل لاگ فعلی به نسخه‌ی قدیمی‌تر تغییر نام می‌یابد . نکته‌ی بسیار مهم در مورد rename این است که اگر فایل مقصد از قبل وجود داشته باشد، رفتار آن کاملاً وابسته به سیستمعامل است: در برخی سیستم‌ها (مانند ویندوز) با خطا مواجه می‌شود و در برخی دیگر (مانند لینوکس) فایل مقصد را بازنویسی می‌کند . بنابراین، برای نوشتن کد قابل‌حمل، بهتر است پیش از فراخوانی rename، با استفاده از exists از نبود فایل مقصد اطمینان حاصل شود .

حذف فایل‌ها و دایرکتوری‌ها

برای حذف فایل‌ها و دایرکتوری‌ها، کتابخانه دو تابع اصلی ارائه می‌دهد. تابع remove برای حذف یک فایل یا یک دایرکتوری خالی به کار می‌رود و مقدار بازگشتی bool آن نشان‌دهنده‌ی این است که آیا چیزی واقعاً حذف شده است یا خیر . اگر فایل یا دایرکتوری از قبل وجود نداشته باشد، تابع مقدار false بازمی‌گرداند که به‌معنای وقوع خطا نیست، بلکه به‌معنای «چیزی برای حذف کردن وجود نداشت» است . در مقابل، تابع remove_all یک عملیات بازگشتی انجام می‌دهد که یک دایرکتوری و تمام محتویات آن (شامل فایل‌ها و زیردایرکتوری‌ها) را حذف می‌کند . این تابع تعداد کل فایل‌ها و دایرکتوری‌های حذف‌شده را به‌عنوان یک عدد صحیح از نوع uintmax_t بازمی‌گرداند و در صورت بروز خطا (مثلاً به‌دلیل عدم دسترسی)، استثنا پرتاب می‌کند . نکته‌ی جالب توجه این است که remove_all در برخی کتابخانه‌های استاندارد، بهینه‌سازی شده و با استفاده از تکرارگر recursive_directory_iterator برای حذف فایل‌ها، عمل حذف را با سرعت بالایی انجام می‌دهد .

وضعیت فایل‌ها و تنظیمات کپی

برای مدیریت دقیق‌تر عملیات فایل، کتابخانه امکان بررسی وضعیت فایل‌ها را از طریق کلاس file_status و توابع مرتبط مانند status و symlink_status فراهم می‌کند . این توابع نوع فایل (فایل معمولی، دایرکتوری، پیوند سمبلیک و غیره) و مجوزهای دسترسی را مشخص می‌کنند . همچنین امکان تغییر مجوزهای فایل از طریق تابع permissions وجود دارد . در عملیات کپی، می‌توان با استفاده از گزینه‌های copy_options مانند copy_symlinks، skip_symlinks و create_symlinks نحوه‌ی برخورد با پیوندهای سمبلیک را کنترل کرد . همچنین گزینه‌های directories_only برای کپی کردن تنها ساختار دایرکتوری و create_hard_links برای ایجاد پیوند سخت به‌جای کپی فایل، از دیگر امکانات پیشرفته‌ی این کتابخانه هستند .

ملاحظات اتمی بودن و مدیریت خطا

در مورد عملیات تغییر نام، باید توجه داشت که اگر سیستم‌فایل از عملیات اتمی (Atomic) برای تغییر نام پشتیبانی کند، این عملیات به‌صورت اتمی انجام می‌شود و در غیر این صورت، رفتار وابسته به سیستم خواهد بود . همچنین هیچ‌یک از عملیات‌های copy_file و rename به‌تنهایی اتمی نیستند و ممکن است در حین انجام عملیات، فایل مقصد برای خواندن یا نوشتن باز شود و با خطا مواجه شوید . برای مدیریت این سناریوها، بسیاری از توابع به‌جز نسخه‌های پرتاب‌کننده‌ی استثنا، یک پارامتر error_code نیز دریافت می‌کنند که امکان مدیریت دقیق‌تر خطا را فراهم می‌آورد .

کلیدواژه ها : std::filesystem copy-کپی فایل در C++17-copy_file-std::filesystem rename-تغییر نام فایل C++-حذف فایل در C++-remove-remove_all-عملیات فایل در C++-انتقال فایل C++-manage filesystem-copy_options-بازنویسی فایل در C++-چرخش لاگ در C++-مدیریت خطا filesystem-آموزش std::filesystem