کتابخانه‌ی استاندارد · سیستم و ابزار

پوشه fs/dir

ساختن، فهرست کردن، رونوشت، جابه‌جایی و حذف پوشه‌ها.

واردسازی سیستم پرونده.پوشه

بسته‌ی پوشه هر کاری را که با پوشه‌ها دارید پوشش می‌دهد: ساختن، فهرست کردن، پیمودن درخت، اندازه گرفتن، رونوشت، جابه‌جایی و حذف. روی تابع‌های پوشه‌ی بسته‌ی سیستم عامل ساخته شده و دو چیز به آن‌ها می‌افزاید: تابعی که شکست بخورد جزئیات را (یک خطای ورودی خروجی با نام عملیات و مسیر) در بسته‌ی خطای سیستم عامل ثبت می‌کند، و جابجایی میان دو دیسک هم کار می‌کند. برای پرونده‌ها بسته‌ی پرونده و برای ساختن مسیرها بسته‌ی مسیر را ببینید.

تابع‌های فهرست نام خالی برمی‌گردانند و پیمایش مسیر کامل. تابع‌هایی که دیسک را تغییر می‌دهند ۰ یا -۱ برمی‌گردانند.

اشتباه‌های رایج:

  • به کار بردن وجود دارد برای پرونده. این‌جا فقط برای پوشه درست است؛ برای پرونده‌ها پرونده.وجود دارد را به کار ببرید.
  • انتظار این‌که کپی و جابجایی مقصدِ موجود را رد کنند. هر دو درون آن ادغام می‌کنند: پرونده‌های هم‌نام جایگزین می‌شوند و بقیه می‌مانند.
  • به کار بردن حذف همه، پیمایش، اندازه یا کپی روی درختی با پیوند نمادین. این‌ها پیوندی را که به پوشه اشاره می‌کند بخشی از درخت می‌گیرند، پس حذف همه محتوای مقصد پیوند را پاک می‌کند و پیوند حلقوی هرگز تمام نمی‌شود.

ساختن چیدمان یک پروژه

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

fs-dir-guide-skeleton.salam
واردسازی سیستم پرونده.پوشه
واردسازی سیستم پرونده.پرونده
واردسازی مرتب سازی

تابع ریشه:
    هر د در ["فروشگاه/src/models"، "فروشگاه/src/views"، "فروشگاه/tests"، "فروشگاه/docs"]:
        پوشه.ساخت پوشه ها(د)
    پایان
    پرونده.نوشتن متن("فروشگاه/main.salam"، "تابع ریشه:\nپایان\n")
    پرونده.نوشتن متن("فروشگاه/README.md"، "# فروشگاه\n")
    پرونده.نوشتن متن("فروشگاه/src/models/order.salam"، "")
    بالایی‌ها := پوشه.فهرست پوشه ها("فروشگاه")
    مرتب سازی.مرتب(بالایی‌ها)
    سرچاپ "پوشه‌ها:"، بالایی‌ها
    پرونده‌ها := پوشه.فهرست پرونده ها("فروشگاه")
    مرتب سازی.مرتب(پرونده‌ها)
    سرچاپ "پرونده‌ها:"، پرونده‌ها
    سرچاپ "src"، پوشه.فهرست پوشه ها("فروشگاه/src").طول()، "پوشه دارد"
    پوشه.حذف همه("فروشگاه")
پایان
خروجیپوشه‌ها: ["docs", "src", "tests"] پرونده‌ها: ["README.md", "main.salam"] src 2 پوشه دارد

پیمایش یک درخت کامل

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

fs-dir-guide-walk.salam
واردسازی سیستم پرونده.پوشه
واردسازی سیستم پرونده.پرونده
واردسازی سیستم پرونده.مسیر

تابع ریشه:
    پوشه.ساخت پوشه ها("سایت/pages/blog")
    پوشه.ساخت پوشه ها("سایت/assets/img")
    پرونده.نوشتن متن("سایت/pages/index.html"، "<h1>Home</h1>")
    پرونده.نوشتن متن("سایت/pages/blog/first.html"، "<p>First post</p>")
    پرونده.نوشتن متن("سایت/assets/style.css"، "body { margin: 0 }")
    پرونده.نوشتن متن("سایت/assets/img/logo.svg"، "<svg/>")
    شمار := نگاشت {} برگردان نگاشت<رشته، صحیح>
    ناپایا حجم := ۰ برگردان صحیح۶۴
    هر پ در پوشه.پیمایش("سایت"):
        پسوند := مسیر.پسوند(پ)
        اگر شمار.دارد(پسوند): شمار.درج(پسوند، شمار.بگیر(پسوند) + ۱) وگرنه: شمار.درج(پسوند، ۱) پایان
        حجم += پرونده.اندازه(پ)
    پایان
    هر پسوند در [".html"، ".css"، ".svg"]:
        سرچاپ پسوند، شمار.بگیر(پسوند)
    پایان
    سرچاپ "جمع:"، حجم، "بایت، برابر با پوشه.اندازه:"، حجم == پوشه.اندازه("سایت")
    پوشه.حذف همه("سایت")
پایان
خروجی.html 2 .css 1 .svg 1 جمع: 54 بایت، برابر با پوشه.اندازه: true

نگه داشتن پشتیبان‌های چرخشی

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

fs-dir-guide-backup.salam
واردسازی سیستم پرونده.پوشه
واردسازی سیستم پرونده.پرونده
واردسازی رشته

تابع نسخه(پایه: رشته، شماره: صحیح): رشته:
    برگشت پایه.پیوست(".bak").پیوست(رشته.از عدد(شماره))
پایان

تابع پشتیبان بگیر(منبع: رشته، نگه‌داری: صحیح):
    پوشه.حذف همه(نسخه(منبع، نگه‌داری))
    ناپایا ن := نگه‌داری - ۱
    تا ن >= ۱:
        اگر پوشه.وجود دارد(نسخه(منبع، ن)): پوشه.جابجایی(نسخه(منبع، ن)، نسخه(منبع، ن + ۱)) پایان
        ن -= ۱
    پایان
    پوشه.کپی(منبع، نسخه(منبع، ۱))
پایان

تابع ریشه:
    پوشه.ساخت پوشه ها("یادداشت")
    تکرار ۱ تا ۴ در روز:
        پرونده.نوشتن متن("یادداشت/امروز.txt"، "روز ".پیوست(رشته.از عدد(روز)))
        پشتیبان بگیر("یادداشت"، ۳)
    پایان
    تکرار ۱ تا ۳ در ن:
        سرچاپ نسخه("یادداشت"، ن)، پرونده.خواندن متن(نسخه("یادداشت"، ن).پیوست("/امروز.txt"))
    پایان
    سرچاپ "یادداشت.bak4 هست:"، پوشه.وجود دارد(نسخه("یادداشت"، ۴))
    هر د در ["یادداشت"، "یادداشت.bak1"، "یادداشت.bak2"، "یادداشت.bak3"]: پوشه.حذف همه(د) پایان
پایان
خروجییادداشت.bak1 روز 4 یادداشت.bak2 روز 3 یادداشت.bak3 روز 2 یادداشت.bak4 هست: false

خطاها و دام‌ها

هر تابعی که روی دیسک تغییری می‌دهد 0 یا -1 برمی‌گرداند و در صورت شکست پیام کوتاهی (به انگلیسی) در خطا می‌گذارد. این پیام می‌گوید کدام کار شکست خورد، نه چرا؛ پس اگر دلیل مهم است، احتمال‌های رایج را خودتان بررسی کنید: پوشه از قبل هست، والدش نیست، یا خالی نیست.

fs-dir-guide-errors.salam
واردسازی سیستم پرونده.پوشه
واردسازی سیستم پرونده.پرونده
واردسازی سیستم عامل.خطا

تابع گزارش(کار: رشته، کد: صحیح):
    اگر کد == ۰:
        سرچاپ کار، "انجام شد"
    وگرنه:
        سرچاپ کار، "شکست خورد:"، خطا.پیام آخرین خطا()
    پایان
پایان

تابع ریشه:
    گزارش("ساخت داده"، پوشه.ساخت پوشه("داده"))
    گزارش("ساخت دوباره‌ی داده"، پوشه.ساخت پوشه("داده"))
    گزارش("ساخت a/b/c"، پوشه.ساخت پوشه("a/b/c"))
    پرونده.نوشتن متن("داده/x.txt"، "x")
    گزارش("حذف داده"، پوشه.حذف("داده"))
    سرچاپ "داده/x.txt پوشه است:"، پوشه.وجود دارد("داده/x.txt")، "پرونده است:"، پرونده.وجود دارد("داده/x.txt")
    گزارش("حذف کامل داده"، پوشه.حذف همه("داده"))
    سرچاپ "فهرست پوشه‌ی ناموجود:"، پوشه.فهرست("داده").طول()
پایان
خروجیساخت داده انجام شد ساخت دوباره‌ی داده شکست خورد: mkdir failed ساخت a/b/c شکست خورد: mkdir failed حذف داده شکست خورد: rmdir failed داده/x.txt پوشه است: false پرونده است: true حذف کامل داده انجام شد فهرست پوشه‌ی ناموجود: 0
  • ساخت پوشه وقتی پوشه از قبل باشد یا والدش نباشد شکست می‌خورد؛ ساخت پوشه ها هر دو حالت را درست می‌کند.
  • حذف فقط پوشه‌ی خالی را حذف می‌کند. حذف همه همه چیزِ درون پوشه را بی‌پرسش پاک می‌کند، پس ورودی‌اش را با دقت بسازید و هرگز مسیری را مستقیم از ورودی کاربر به آن ندهید؛ مسیر.مسیر امن است بررسی می‌کند که مسیر درون یک پوشه‌ی پایه بماند.
  • وجود دارد برای پرونده نادرست است و فهرست روی پوشه‌ی ناموجود وکتور خالی برمی‌گرداند، نه خطا.

کدام تابع برای کدام کار

کارتابع
ساختن یک پوشه در والدی که هستساخت پوشه
ساختن یک مسیر کامل از پوشه‌هاساخت پوشه ها
نام‌های درون یک پوشهفهرست، یا فهرست پوشه ها و فهرست پرونده ها برای یک نوع
همه‌ی پرونده‌های زیر یک پوشه، با مسیرپیمایش
اندازه‌ی کل یک درختاندازه
رونوشت یک درختکپی
تغییر نام یا جابه‌جایی یک درختجابجایی
حذف پوشه‌ی خالیحذف
حذف پوشه با همه‌ی محتوایشحذف همه

تابع‌ها

ساخت پوشه Mkdir

تابع ساخت پوشه(p: رشته): صحیح
یک پوشه می‌سازد؛ اگر پوشه باشد یا والدش نباشد شکست می‌خورد (-۱، همراه با ثبت در خطای سیستم عامل).
fs-dir-List.salam
واردسازی سیستم پرونده.پوشه
واردسازی سیستم پرونده.پرونده

تابع ریشه:
    پوشه.ساخت پوشه("کتابخانه")
    پوشه.ساخت پوشه ها("کتابخانه/شعر/حافظ")
    پرونده.نوشتن متن("کتابخانه/فهرست.txt"، "۳ کتاب")
    پرونده.نوشتن متن("کتابخانه/شعر/حافظ/غزل.txt"، "الا یا ایها الساقی")
    سرچاپ پوشه.وجود دارد("کتابخانه")، پوشه.پوشه است("کتابخانه/فهرست.txt")
    سرچاپ پوشه.فهرست("کتابخانه").طول()، پوشه.فهرست پوشه ها("کتابخانه")، پوشه.فهرست پرونده ها("کتابخانه")
    سرچاپ پوشه.پیمایش("کتابخانه").طول()، پوشه.اندازه("کتابخانه") > ۰
    سرچاپ پوشه.مجوزها("کتابخانه") > ۰، پوشه.زمان تغییر("کتابخانه") > ۰
    پوشه.کپی("کتابخانه"، "پشتیبان")
    پوشه.جابجایی("پشتیبان"، "بایگانی")
    سرچاپ پوشه.وجود دارد("پشتیبان")، پوشه.وجود دارد("بایگانی/شعر/حافظ")، پرونده.وجود دارد("بایگانی/شعر/حافظ/غزل.txt")
    پوشه.ساخت پوشه("خالی")
    پوشه.حذف("خالی")
    پوشه.حذف همه("کتابخانه")
    پوشه.حذف همه("بایگانی")
    سرچاپ پوشه.وجود دارد("کتابخانه")، پوشه.وجود دارد("خالی")
پایان
خروجیtrue false 2 ["شعر"] ["فهرست.txt"] 2 true true true false true true false false

ساخت پوشه ها MkdirAll

تابع ساخت پوشه ها(p: رشته): صحیح
پوشه را همراه با همه‌ی والدهای لازم می‌سازد؛ اگر از قبل باشد موفق است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

حذف Remove

تابع حذف(p: رشته): صحیح
یک پوشه‌ی خالی را حذف می‌کند؛ پوشه‌ای که چیزی در آن باشد شکست می‌خورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

حذف همه RemoveAll

تابع حذف همه(p: رشته): صحیح
پوشه را با همه‌ی محتوایش حذف می‌کند؛ مسیر ناموجود موفقیت حساب می‌شود. پیوندهای نمادین به پوشه را دنبال می‌کند و محتوای مقصدشان را پاک می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

فهرست List

تابع فهرست(p: رشته): وکتور<رشته>
نام همه‌ی مدخل‌های درون پوشه، پنهان‌ها هم، بدون . و ..، بی ترتیب ثابت. پوشه‌ی ناموجود وکتور خالی می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

فهرست پوشه ها ListDirs

تابع فهرست پوشه ها(p: رشته): وکتور<رشته>
فقط نام زیرپوشه‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

فهرست پرونده ها ListFiles

تابع فهرست پرونده ها(p: رشته): وکتور<رشته>
فقط نام پرونده‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

پیمایش Walk

تابع پیمایش(p: رشته): وکتور<رشته>
مسیر همه‌ی پرونده‌های پوشه و زیرپوشه‌هایش، هر کدام با مسیری که داده‌اید شروع می‌شود؛ خود پوشه‌ها فهرست نمی‌شوند. همان پیمایش سیستم عامل است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

کپی Copy

تابع کپی(src: رشته، dst: رشته): صحیح
پوشه را با همه‌ی محتوایش در dst رونوشت می‌کند، اگر لازم باشد آن را می‌سازد و با آن‌چه از قبل هست ادغام می‌کند. مجوزها رونوشت نمی‌شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

جابجایی Move

تابع جابجایی(src: رشته، dst: رشته): صحیح
پوشه را جابه‌جا می‌کند. اگر تغییر نام شکست بخورد، مثلاً میان دو دیسک، درون مقصد رونوشت می‌کند (و با مقصد موجود ادغام می‌کند) و بعد اصلی را حذف می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

وجود دارد Exists

تابع وجود دارد(p: رشته): منطقی
اگر مسیر وجود داشته باشد و یک پوشه باشد، درست برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

پوشه است IsDir

تابع پوشه است(p: رشته): منطقی
اگر مسیر یک پوشه باشد، درست برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

اندازه Size

تابع اندازه(p: رشته): صحیح۶۴
جمع اندازه‌ی همه‌ی پرونده‌های پوشه و زیرپوشه‌هایش بر حسب بایت؛ برای پوشه‌ی ناموجود ۰.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

مجوزها Permissions

تابع مجوزها(p: رشته): صحیح
مجوزهای پوشه، با رقم‌های هشت‌هشتی.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam

زمان تغییر ModTime

تابع زمان تغییر(p: رشته): صحیح۶۴
زمان آخرین تغییر فهرست مدخل‌های پوشه (افزودن، حذف یا تغییر نام یک پرونده) به ثانیه‌ی یونیکس؛ ویرایش پرونده‌ای درون آن این زمان را عوض نمی‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: fs-dir-List.salam