17Aug
כאשר אתה משתמש ב- Linux וב- OS X, מערכת ההפעלה לא תמנע ממך למחוק קובץ שנמצא בשימוש עדיין ב- Windows, שתמנע ממך לעשות זאת במפורש.מה נותן?למה אתה יכול לערוך ולמחוק קבצים בשימוש על מערכות Unix הנגזרות אבל לא Windows?
השאלה של היום &מפגש תשובה מגיע אלינו באדיבות SuperUser - חלוקה של סטאק שערי, קהילה מונחה קיבוץ של Q & אתרי אינטרנט.
השאלה
SuperUser הקורא. .midget רוצה לדעת למה לינוקס ו- Windows לטפל קבצים בשימוש שונה:
אחד הדברים שיש לי תמוה אותי מאז התחלתי להשתמש לינוקס היא העובדה שהיא מאפשרת לך לשנות את השם שלקובץ או אפילו למחוק אותו בזמן שהוא נקרא.דוגמה לכך היא כיצד ניסיתי למחוק סרטון בעת הפעלתו.הצלחתי, והופתעתי לגלות כי אתה יכול לשנות כמעט כל דבר בקובץ בלי לדאוג אם זה נמצא בשימוש כרגע או לא.
אז מה קורה מאחורי הקלעים ומונע ממנו למחוק את הדברים בחשאי ב- Windows כמו שהוא יכול בלינוקס?
תשובה
תורמים SuperUser לשפוך קצת אור על המצב עבור.נדהם כותב:
בכל פעם שאתה פותח או מבצע קובץ ב- Windows, Windows נועל את הקובץ במקום( זה פישוט, אבל בדרך כלל נכון.) קובץ שננעל על ידי תהליך לא ניתן למחוק עד תהליך זה משחרר אותו.זו הסיבה מדוע בכל פעם Windows יש לעדכן את עצמו אתה צריך אתחול מחדש זה ייכנסו לתוקף.
מצד שני, כמו מערכות הפעלה כמו יוניקס ו- Mac OS X לא לנעול את הקובץ, אלא את המגזרים הדיסק הבסיסית.זה אולי נראה הבדל טריוויאלי, אבל זה אומר כי הרשומה של הקובץ בטבלה תוכן המערכת ניתן למחוק מבלי להפריע כל תוכנית שכבר יש את הקובץ פתוח.אז אתה יכול למחוק את הקובץ בזמן שהוא עדיין ביצוע או אחרת בשימוש והוא ימשיך להתקיים על הדיסק כל עוד כמה תהליך יש להתמודד פתוח על זה למרות הכניסה שלו בטבלה הקובץ נעלם.
דוד שוורץ מרחיב את הרעיון ומדגיש כיצד הדברים צריכים להיות אידיאליים ואיך הם בפועל:
ברירת המחדל של Windows לנעילת קבצים אוטומטית, חובה.ברירת מחדל UNIXes ידנית, שיתוף קבצים נעילה.בשני המקרים, ברירות המחדל יכול להיות overriden, אבל בשני המקרים הם בדרך כלל לא.
הרבה קוד הישן של Windows משתמש C / C + + API( פונקציות כמו fopen) ולא API יליד( פונקציות כמו CreateFile).C / C + + API נותן לך שום דרך לציין כיצד נעילה חובה יפעל, כך שאתה מקבל את ברירות המחדל.ברירת המחדל "מצב המניות" נוטה לאסור על פעולות "סותרות".אם אתה פותח קובץ לכתיבה, כותב הם להניח להתנגש, גם אם אתה אף פעם לא ממש לכתוב לקובץ.כנ"ל עבור שינוי שם.
, וכאן זה נהיה יותר גרוע.מלבד פתיחה לקריאה או כתיבה, C / C + + API לא מספק שום דרך לציין מה אתה מתכוון לעשות עם הקובץ.אז ה- API צריך להניח שאתה הולך לבצע כל פעולה משפטית.מכיוון שהנעילה היא חובה, יידחה פתח המאפשר פעולה סותרת, גם אם הקוד לא התכוון לבצע את הפעולה הסותרת, אלא רק פתח את התיק למטרה אחרת.
אם הקוד משתמש בממשק ה- API של C / C + + או משתמש בממשק ה- API המקורי מבלי לחשוב באופן ספציפי על בעיות אלה, הם יפסיקו למנוע את הפעולה המקסימלית של פעולות אפשריות עבור כל קובץ שנפתח, ולא יוכלו לפתוח קובץ, אלא אם כן כל פעולה אפשריתהם יכלו לבצע על זה פעם אחת נפתחת היא unconflicted.
לדעתי, שיטת Windows יעבוד הרבה יותר טוב מאשר בשיטת UNIX אם כל תוכנית בחרה מצבי המניות שלה מצבים פתוחים בתבונה ו לטפל במקרים כישלון.השיטה UNIX, לעומת זאת, עובד טוב יותר אם הקוד לא טורחים לחשוב על נושאים אלה.למרבה הצער, הבסיסי C / C + + API לא מפה טוב על ממשק ה- API של Windows קובץ באופן מטפל מצבי המניות ואת נפתחת נפתחת היטב.אז התוצאה נטו היא קצת מבולגן.
יש לך את זה: שתי גישות שונות לטיפול הקובץ תשואה שתי תוצאות שונות.
יש מה להוסיף להסבר?נשמע את ההערות.רוצה לקרוא תשובות נוספות ממשתמשים אחרים בעלי ידע טכנולוגי?בדוק את נושא הדיון המלא כאן.