پوشه fs/dir
ساختن، فهرست کردن، رونوشت، جابهجایی و حذف پوشهها.
واردسازی سیستم پرونده.پوشه
بستهی پوشه هر کاری را که با پوشهها دارید پوشش میدهد: ساختن، فهرست کردن، پیمودن درخت، اندازه گرفتن، رونوشت، جابهجایی و حذف. روی تابعهای پوشهی بستهی سیستم عامل ساخته شده و دو چیز به آنها میافزاید: تابعی که شکست بخورد جزئیات را (یک خطای ورودی خروجی با نام عملیات و مسیر) در بستهی خطای سیستم عامل ثبت میکند، و جابجایی میان دو دیسک هم کار میکند. برای پروندهها بستهی پرونده و برای ساختن مسیرها بستهی مسیر را ببینید.
تابعهای فهرست نام خالی برمیگردانند و پیمایش مسیر کامل. تابعهایی که دیسک را تغییر میدهند ۰ یا -۱ برمیگردانند.
اشتباههای رایج:
- به کار بردن
وجود داردبرای پرونده. اینجا فقط برای پوشه درست است؛ برای پروندههاپرونده.وجود داردرا به کار ببرید. - انتظار اینکه
کپیوجابجاییمقصدِ موجود را رد کنند. هر دو درون آن ادغام میکنند: پروندههای همنام جایگزین میشوند و بقیه میمانند. - به کار بردن
حذف همه،پیمایش،اندازهیاکپیروی درختی با پیوند نمادین. اینها پیوندی را که به پوشه اشاره میکند بخشی از درخت میگیرند، پسحذف همهمحتوای مقصد پیوند را پاک میکند و پیوند حلقوی هرگز تمام نمیشود.
ساختن چیدمان یک پروژه
ساخت پوشه ها همهی والدهای ناموجود را میسازد و اگر پوشه از قبل باشد هم موفق است، پس برای ساختن ساختاری که شاید بخشی از آن موجود باشد انتخاب امنی است. فهرست، فهرست پوشه ها و فهرست پرونده ها فقط نامها را برمیگردانند نه مسیر کامل را، آن هم به ترتیبی که سیستم پرونده نگه میدارد و از سیستمی به سیستم دیگر فرق میکند. پیش از نمایش یا مقایسه، آنها را با مرتب سازی.مرتب مرتب کنید.
واردسازی سیستم پرونده.پوشه
واردسازی سیستم پرونده.پرونده
واردسازی مرتب سازی
تابع ریشه:
هر د در ["فروشگاه/src/models"، "فروشگاه/src/views"، "فروشگاه/tests"، "فروشگاه/docs"]:
پوشه.ساخت پوشه ها(د)
پایان
پرونده.نوشتن متن("فروشگاه/main.salam"، "تابع ریشه:\nپایان\n")
پرونده.نوشتن متن("فروشگاه/README.md"، "# فروشگاه\n")
پرونده.نوشتن متن("فروشگاه/src/models/order.salam"، "")
بالاییها := پوشه.فهرست پوشه ها("فروشگاه")
مرتب سازی.مرتب(بالاییها)
سرچاپ "پوشهها:"، بالاییها
پروندهها := پوشه.فهرست پرونده ها("فروشگاه")
مرتب سازی.مرتب(پروندهها)
سرچاپ "پروندهها:"، پروندهها
سرچاپ "src"، پوشه.فهرست پوشه ها("فروشگاه/src").طول()، "پوشه دارد"
پوشه.حذف همه("فروشگاه")
پایانپیمایش یک درخت کامل
پیمایش مسیر همهی پروندههای زیر یک پوشه را برمیگرداند و هر مسیر از قبل به پوشهای که دادهاید چسبیده است، پس میشود آن را مستقیم به تابعهای پرونده داد. خود پوشهها در فهرست نیستند و مثل تابعهای فهرست، ترتیب ثابتی ندارد. این نمونه پروندهها را بر پایهی پسوند میشمارد و اندازهشان را جمع میزند، کاری که اندازه با یک فراخوانی میکند.
واردسازی سیستم پرونده.پوشه
واردسازی سیستم پرونده.پرونده
واردسازی سیستم پرونده.مسیر
تابع ریشه:
پوشه.ساخت پوشه ها("سایت/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"]:
سرچاپ پسوند، شمار.بگیر(پسوند)
پایان
سرچاپ "جمع:"، حجم، "بایت، برابر با پوشه.اندازه:"، حجم == پوشه.اندازه("سایت")
پوشه.حذف همه("سایت")
پایاننگه داشتن پشتیبانهای چرخشی
کپی یک درخت را با همهی محتوایش رونوشت میکند (فقط محتوای پروندهها؛ مجوزها حفظ نمیشوند) و جابجایی نامش را عوض میکند، و اگر تغییر نام شکست بخورد، مثلاً چون مقصد روی دیسک دیگری است، به رونوشت و حذف برمیگردد. این دو با هم یک چرخش ساده میسازند: قدیمیترین پشتیبان را حذف کنید، بقیه را یکی جلو ببرید و پوشهی اصلی را در .bak1 رونوشت کنید. قدیمیترین را اول حذف میکنیم تا پیش از آنکه چیزی روی نامش برود، آن نام آزاد باشد.
واردسازی سیستم پرونده.پوشه
واردسازی سیستم پرونده.پرونده
واردسازی رشته
تابع نسخه(پایه: رشته، شماره: صحیح): رشته:
برگشت پایه.پیوست(".bak").پیوست(رشته.از عدد(شماره))
پایان
تابع پشتیبان بگیر(منبع: رشته، نگهداری: صحیح):
پوشه.حذف همه(نسخه(منبع، نگهداری))
ناپایا ن := نگهداری - ۱
تا ن >= ۱:
اگر پوشه.وجود دارد(نسخه(منبع، ن)): پوشه.جابجایی(نسخه(منبع، ن)، نسخه(منبع، ن + ۱)) پایان
ن -= ۱
پایان
پوشه.کپی(منبع، نسخه(منبع، ۱))
پایان
تابع ریشه:
پوشه.ساخت پوشه ها("یادداشت")
تکرار ۱ تا ۴ در روز:
پرونده.نوشتن متن("یادداشت/امروز.txt"، "روز ".پیوست(رشته.از عدد(روز)))
پشتیبان بگیر("یادداشت"، ۳)
پایان
تکرار ۱ تا ۳ در ن:
سرچاپ نسخه("یادداشت"، ن)، پرونده.خواندن متن(نسخه("یادداشت"، ن).پیوست("/امروز.txt"))
پایان
سرچاپ "یادداشت.bak4 هست:"، پوشه.وجود دارد(نسخه("یادداشت"، ۴))
هر د در ["یادداشت"، "یادداشت.bak1"، "یادداشت.bak2"، "یادداشت.bak3"]: پوشه.حذف همه(د) پایان
پایانخطاها و دامها
هر تابعی که روی دیسک تغییری میدهد 0 یا -1 برمیگرداند و در صورت شکست پیام کوتاهی (به انگلیسی) در خطا میگذارد. این پیام میگوید کدام کار شکست خورد، نه چرا؛ پس اگر دلیل مهم است، احتمالهای رایج را خودتان بررسی کنید: پوشه از قبل هست، والدش نیست، یا خالی نیست.
واردسازی سیستم پرونده.پوشه
واردسازی سیستم پرونده.پرونده
واردسازی سیستم عامل.خطا
تابع گزارش(کار: رشته، کد: صحیح):
اگر کد == ۰:
سرچاپ کار، "انجام شد"
وگرنه:
سرچاپ کار، "شکست خورد:"، خطا.پیام آخرین خطا()
پایان
پایان
تابع ریشه:
گزارش("ساخت داده"، پوشه.ساخت پوشه("داده"))
گزارش("ساخت دوبارهی داده"، پوشه.ساخت پوشه("داده"))
گزارش("ساخت a/b/c"، پوشه.ساخت پوشه("a/b/c"))
پرونده.نوشتن متن("داده/x.txt"، "x")
گزارش("حذف داده"، پوشه.حذف("داده"))
سرچاپ "داده/x.txt پوشه است:"، پوشه.وجود دارد("داده/x.txt")، "پرونده است:"، پرونده.وجود دارد("داده/x.txt")
گزارش("حذف کامل داده"، پوشه.حذف همه("داده"))
سرچاپ "فهرست پوشهی ناموجود:"، پوشه.فهرست("داده").طول()
پایانساخت پوشهوقتی پوشه از قبل باشد یا والدش نباشد شکست میخورد؛ساخت پوشه هاهر دو حالت را درست میکند.حذففقط پوشهی خالی را حذف میکند.حذف همههمه چیزِ درون پوشه را بیپرسش پاک میکند، پس ورودیاش را با دقت بسازید و هرگز مسیری را مستقیم از ورودی کاربر به آن ندهید؛ مسیر.مسیر امن است بررسی میکند که مسیر درون یک پوشهی پایه بماند.وجود داردبرای پرونده نادرست است وفهرستروی پوشهی ناموجود وکتور خالی برمیگرداند، نه خطا.
کدام تابع برای کدام کار
| کار | تابع |
|---|---|
| ساختن یک پوشه در والدی که هست | ساخت پوشه |
| ساختن یک مسیر کامل از پوشهها | ساخت پوشه ها |
| نامهای درون یک پوشه | فهرست، یا فهرست پوشه ها و فهرست پرونده ها برای یک نوع |
| همهی پروندههای زیر یک پوشه، با مسیر | پیمایش |
| اندازهی کل یک درخت | اندازه |
| رونوشت یک درخت | کپی |
| تغییر نام یا جابهجایی یک درخت | جابجایی |
| حذف پوشهی خالی | حذف |
| حذف پوشه با همهی محتوایش | حذف همه |
تابعها
ساخت پوشه Mkdir
تابع ساخت پوشه(p: رشته): صحیحخطای سیستم عامل).واردسازی سیستم پرونده.پوشه
واردسازی سیستم پرونده.پرونده
تابع ریشه:
پوشه.ساخت پوشه("کتابخانه")
پوشه.ساخت پوشه ها("کتابخانه/شعر/حافظ")
پرونده.نوشتن متن("کتابخانه/فهرست.txt"، "۳ کتاب")
پرونده.نوشتن متن("کتابخانه/شعر/حافظ/غزل.txt"، "الا یا ایها الساقی")
سرچاپ پوشه.وجود دارد("کتابخانه")، پوشه.پوشه است("کتابخانه/فهرست.txt")
سرچاپ پوشه.فهرست("کتابخانه").طول()، پوشه.فهرست پوشه ها("کتابخانه")، پوشه.فهرست پرونده ها("کتابخانه")
سرچاپ پوشه.پیمایش("کتابخانه").طول()، پوشه.اندازه("کتابخانه") > ۰
سرچاپ پوشه.مجوزها("کتابخانه") > ۰، پوشه.زمان تغییر("کتابخانه") > ۰
پوشه.کپی("کتابخانه"، "پشتیبان")
پوشه.جابجایی("پشتیبان"، "بایگانی")
سرچاپ پوشه.وجود دارد("پشتیبان")، پوشه.وجود دارد("بایگانی/شعر/حافظ")، پرونده.وجود دارد("بایگانی/شعر/حافظ/غزل.txt")
پوشه.ساخت پوشه("خالی")
پوشه.حذف("خالی")
پوشه.حذف همه("کتابخانه")
پوشه.حذف همه("بایگانی")
سرچاپ پوشه.وجود دارد("کتابخانه")، پوشه.وجود دارد("خالی")
پایانساخت پوشه ها 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