فایل تهی

**فایل تُهی** (به انگلیسی: ) نوعی از پروندهٔ رایانه‌ای است که تلاش می‌کند فضای سامانهٔ پرونده‌ها را به‌صورت کارآمدتر استفاده کند، زمانی که خود فایل تا حدی خالی است. این کار از طریق نوشتن اطلاعات مختصر (یا فراداده) برای نمایش بلوک‌های خالی به رسانهٔ ذخیره‌سازی انجام می‌پذیرد، به‌جای آن‌که فضای واقعی خالی که بلوک را تشکیل می‌دهد، ذخیره شود. در نتیجه، فضای کمتری در ذخیره‌سازی مصرف می‌شود. تنها زمانی که یک بلوک شامل داده‌های واقعی (غیر خالی) باشد، به‌طور کامل در رسانه ذخیره می‌شود.

فایل‌های تُهی معمولاً زمانی ساخته می‌شوند که بخش‌هایی از فایل هیچ‌گاه نوشته نمی‌شوند. این موضوع در فایل‌هایی با دسترسی تصادفی مانند پایگاه‌های داده معمول است. برخی از سامانه‌های عامل یا ابزارها فراتر رفته و هنگام نوشتن یا کپی‌کردن فایل‌ها، آن‌ها را تهی‌سازی می‌کنند: اگر بلوکی تنها شامل بایت‌های صفر باشد، در رسانهٔ ذخیره‌سازی نوشته نمی‌شود، بلکه به‌عنوان بلوک خالی علامت‌گذاری می‌شود.

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

بیشتر سامانه‌های پروندهٔ مدرن از فایل‌های تُهی پشتیبانی می‌کنند؛ از جمله بیشتر توزیع‌های یونیکسی و NTFS. HFS+ اپل پشتیبانی بومی از فایل‌های تُهی ارائه نمی‌دهد، اما در مک‌اواس، لایهٔ سامانهٔ پروندهٔ مجازی (VFS) امکان ذخیرهٔ آن‌ها را در هر سامانهٔ پروندهٔ پشتیبانی‌شده، از جمله HFS+، فراهم می‌سازد.[نیازمند منبع] APFS نیز از فایل‌های تُهی پشتیبانی می‌کند. این نوع فایل‌ها معمولاً در تصاویر دیسک، گرفت‌های پایگاه داده، فایل‌های وقایع و در برنامه‌های علمی کاربرد دارند.

## مزایا
برتری فایل‌های تُهی آن است که فضای ذخیره‌سازی تنها زمانی اختصاص می‌یابد که واقعاً موردنیاز باشد: ظرفیت ذخیره‌سازی حفظ می‌شود و گاهی می‌توان فایل‌های بزرگی را ایجاد کرد حتی اگر فضای آزاد کافی برای اندازهٔ واقعی آن فایل در رسانهٔ ذخیره‌سازی موجود نباشد. این ویژگی همچنین زمان نخستین نوشتن را کاهش می‌دهد؛ زیرا سامانه مجبور نیست برای فضای «پرشده» بلوک‌ها، فضای اختصاص دهد. اگر تخصیص اولیه نیازمند نوشتن همهٔ صفرها به آن فضا باشد، فایل تُهی باعث می‌شود سامانه دوباره‌کاری نکرده و صفرها را دوباره ننویسد.

برای نمونه، یک تصویر ماشین مجازی با اندازهٔ بیشینهٔ ۱۰۰ گیگابایت که تنها ۲ گیگابایت دادهٔ واقعی در آن نوشته شده، در صورت استفاده از ذخیره‌سازی پیش‌اختصاصی به‌طور کامل به ۱۰۰ گیگابایت فضا نیاز خواهد داشت؛ در حالی که اگر از یک فایل تُهی استفاده شود، تنها ۲ گیگابایت فضا اشغال می‌شود. اگر سامانهٔ پرونده از حذف سوراخ پشتیبانی کند و فرمان‌های TRIM توسط سامانهٔ عامل میهمان صادر شود، حذف فایل‌ها در مهمان می‌تواند فضای استفاده‌شده را کاهش دهد.

## معایب
از جمله کاستی‌های فایل‌های تُهی می‌توان به احتمال پراکندگی آن‌ها، نمایش نادرست فضای آزاد در سامانهٔ پرونده، و اثرات غیرمنتظره در هنگام پرشدن سامانه‌های دارای فایل تُهی اشاره کرد (مانند دریافت خطای پرشدن دیسک یا فراتررفتن از سهمیه در زمانی که تنها بخشی از یک فایل موجود بازنویسی می‌شود که پیش‌تر تُهی بوده است). همچنین کپی‌کردن فایل تُهی با برنامه‌ای که به‌طور صریح از این قابلیت پشتیبانی نمی‌کند، ممکن است موجب کپی کل اندازهٔ نامتراکم فایل شود، از جمله بخش‌های صفر که در رسانه ذخیره نشده‌اند؛ و این مزیت تهی‌بودن فایل را از بین ببرد.

همچنین برخی نرم‌افزارهای پشتیبان‌گیری یا برنامه‌های کاربردی از فایل‌های تُهی به‌طور کامل پشتیبانی نمی‌کنند. با این حال، پیاده‌سازی VFS دو مورد اول را دور می‌زند. بارگذاری فایل‌های اجرایی در ویندوز ۳۲ بیتی (مانند exe یا dll) که تُهی هستند، زمان بسیار بیشتری می‌برد؛ زیرا فایل نمی‌تواند در فضای آدرس‌دهی ۴ گیگابایتی محدود، نگاشت حافظه شود و به حافظه کش نیز وارد نمی‌شود؛ چرا که مسیر کدی برای کش‌کردن فایل‌های اجرایی ۳۲ بیتی تُهی وجود ندارد. (ویندوز در معماری‌های ۶۴ بیتی می‌تواند فایل‌های اجرایی تُهی را نگاشت کند).نیازمند منبع در NTFS، فایل‌های تُهی (یا بخش‌های غیرصفری آن‌ها) قابل فشرده‌سازی نیستند. NTFS تهی‌بودن را به‌صورت نوعی فشرده‌سازی پیاده‌سازی می‌کند؛ بنابراین یک فایل یا می‌تواند تُهی باشد یا فشرده.

## شفافیت و ایجاد
فایل‌های تُهی معمولاً به‌صورت شفاف برای کاربر مدیریت می‌شوند؛ اما تفاوت میان فایل معمولی و تُهی در برخی شرایط آشکار می‌شود.

دستور زیر در یونیکس:
 dd if=/dev/zero of=sparse-file bs=1 count=0 seek=5M
فایلی با اندازهٔ ۵ مبی‌بایت ایجاد می‌کند، بدون آن‌که داده‌ای در رسانه ذخیره شده باشد (تنها فراداده ذخیره می‌شود). (در نسخهٔ GNU از دستور dd این رفتار وجود دارد زیرا از تابع ftruncate برای تنظیم اندازه فایل استفاده می‌کند؛ در حالی که برخی پیاده‌سازی‌های دیگر ممکن است تنها یک فایل خالی ایجاد کنند.)

به‌صورت مشابه، دستور truncate نیز در صورت موجودبودن، می‌تواند استفاده شود:
 truncate -s 5M sparse-file
در لینوکس، یک فایل موجود را می‌توان با اجرای:
 cp --sparse=always existing-file sparse-file
به فایل تُهی تبدیل کرد.

هیچ فراخوانی سیستمی به‌صورت قابل حمل برای سوراخ‌زدایی وجود ندارد؛ لینوکس تابع fallocate با پرچم FALLOC_FL_PUNCH_HOLE را ارائه می‌دهد، و Solaris نیز fcntl با پرچم F_FREESP را فراهم می‌کند.

## شناسایی
گزینهٔ ‎-s در دستور ls فضای اشغال‌شده در قالب بلوک را نشان می‌دهد.

همچنین، دستور du فضای اشغال‌شده را چاپ می‌کند، در حالی که ls اندازهٔ ظاهری فایل را نمایش می‌دهد. در برخی نسخه‌های غیراستاندارد du، گزینهٔ ‎--block-size=1 فضای اشغال‌شده را به جای بلوک، بر حسب بایت نمایش می‌دهد؛ تا بتوان آن را با خروجی ls مقایسه کرد:
 du --block-size=1 sparse-file

 ls -l sparse-file
توجه شود که استفادهٔ بالا از du، معادل دستور مختصرتر زیر نیز هست:
 du -B 1 sparse-file

 و همچنین:

 du -b sparse-file
همان‌طور که در دفترچه راهنمای du آمده است، ‎-b معادل ‎--apparent-size --block-size=1 می‌باشد.

ابزار filefrag از بستهٔ e2fsprogs نیز می‌تواند برای نمایش جزئیات تخصیص بلوک فایل استفاده شود.

## کپی کردن
نسخهٔ GNU از دستور cp معمولاً قادر به تشخیص تُهی بودن فایل است:
 cp existing-sparse-file new-file
در نتیجه فایل new-file نیز تُهی خواهد بود. GNU همچنین گزینه‌ای به‌نام ‎--sparse دارد، که مخصوصاً زمانی مفید است که فایلی شامل بلوک‌های طولانی از صفرها به‌صورت غیر تُهی ذخیره شده باشد (یعنی بلوک‌های صفر به‌طور کامل روی رسانه نوشته شده‌اند). با اجرای:
 cp --sparse=always existing-file new-sparse-file
می‌توان فضای ذخیره‌سازی را حفظ کرد.

برخی پیاده‌سازی‌های cp مانند نسخهٔ FreeBSD از گزینهٔ ‎--sparse پشتیبانی نمی‌کنند و همواره فایل تُهی را گسترش می‌دهند. یک جایگزین نسبتاً کارآمد در این سیستم‌ها استفاده از rsync با گزینهٔ ‎--sparse است:
 rsync --sparse existing-file new-sparse-file
متأسفانه، نسخه‌های قدیمی‌تر rsync از ترکیب ‎--sparse با ‎--inplace پشتیبانی نمی‌کنند.

از طریق ورودی استاندارد نیز می‌توان فایل تُهی را کپی کرد:
 cat existing-sparse-file | cp --sparse=always /dev/stdin new-sparse-file

## همچنین ببینید
مقایسه سامانه‌های پرونده

## منابع
Giampaolo, Dominic (1999). Practical File System Design with the Be File System (PDF). Morgan Kaufmann Publishers. ISBN 9781558604971.

"Apple File System Guide". Apple's Developer Site. Apple Inc. Retrieved 27 April 2017.

"Du(1) – Linux manual page".

Meyering, Jim (1995-12-21). "GNU coreutils/cp: Accept new option, --sparse={never,auto,always}, to control creation of sparse files". Retrieved 2016-06-17.

Tridgell, Andrew (1996-06-29). "rsync: hard links, better sparse handling, FERROR and FINFO". Retrieved 2016-06-17.

Tridgell, Andrew (2016-06-30). "rsync manpage". Retrieved 2017-01-19.

Davison, Wayne (2005-08-30). "rsync: Reject attempts to combine --sparse with --inplace". Retrieved 2017-01-19.

Davison, Wayne. "Support --sparse combined with --preallocate or --inplace".

*
رده:فایل‌ها