דף הבית » איך ל » מדוע Windows מדווח על תיקיה זו ארוכה מדי להעתקה?

    מדוע Windows מדווח על תיקיה זו ארוכה מדי להעתקה?

    אם אתה עובד עם Windows מספיק זמן, במיוחד עם תיקיות וקבצים בעלי שמות ארוכים, אתה נתקל בשגיאה מוזרה: Windows ידווח כי נתיב התיקיה או שם הקובץ ארוך מדי כדי לעבור ליעד חדש או אפילו למחוק. מה העניין?

    היי כיצד חנון!

    אז לפני כמה ימים, הייתי reorganizing כמה קבצים במחשב שלי, יצירת תיקיות, דברים כאלה. ואז, כשהעברתי כמה קבצים לתוך תיקיה, אני מקבל הודעה, וציין כי נתיב התיקיה שהתקבל יהיה ארוך מדי. הייתי מבולבל. אני יודע שכל מערכת הפעלה אחת מאז DOS תומך שמות קבצים ארוכים, אך Windows טוען כי הנתיב הוא ארוך מדי? למה זה קרה?

    בכבוד רב,

    מר מאורגן

    הבעיה שאתם נתקלים בה היא צומת מצערת של שתי מערכות שבמקרים כאלה מניבה שגיאה. כדי להבין בדיוק מהיכן מגיעה השגיאה, עלינו לחפור לתוך ההיסטוריה של שמות קבצים ארוכים (LFN) וכיצד Windows מקיים איתם אינטראקציה לפני שנכנס לפתרונות.

    שמות קבצים ארוכים הוכנסו, באמצעות הארכיטקטורה הבסיסית MS-DOS, ב- Windows 95. מערכת LFN החדשה אפשרה שמות קבצים וספריות של עד 255 תווים. זה היה הרחבה מבורכת של שם הקובץ הקודם המערכת, בדרך כלל נקרא 8.3 filenaming כי השם היה מוגבל ל 8 תווים ו 3 ספרות הרחבה, אך ידוע גם בשם קובץ קצר (SFN). כפי שאתה יכול לדמיין, אז היו עדיין הרבה יישומים מבוססי DOS סביב היו יותר מכמה כאבי ראש מנסה להשיג את LFNs החדש ואת SFNs מדור קודם לשחק נחמד אחד עם השני. אם אי פעם נתקלת בדיסקט ישן יותר או בתקליטור עם קבצים מקוצצים באופן מוזר (כמו abcdef ~ 1.txt) שם קובץ זה נחתך על ידי יישום מורשת של SFN באמצעות כמה LFN ארוך יותר ולא נתמך (כמו abcdefghijk. טקסט).

    אנחנו רחוקים מאוד מאמצע שנות התשעים, אבל כל העניין של שם הקובץ הארוך הוא (ברוב המקרים) מגוהץ היטב. אם אתה משתמש בגירסה של Windows מ -10 השנים האחרונות, סביר להניח שאף פעם לא תיתקל בסכסוך של אורך קובץ כמו שאנחנו נהגנו להריץ בחזרה ב- DOS / Windows 95 ימים. עם זאת, אנו עדיין נתקלים שיהוקים, כפי שגילית עם פרוייקט ניקוי הדיסק שלך. אבל למה? אם מערכת הקבצים 'קבצים ארוכים' של Windows תומכת בתיקיות ובשמות קבצים של עד 255 תווים לכל רכיב, באיזה קיר אתה נתקל? אנחנו לא יכולים להאשים את NTFS (מערכת הקבצים כי הרוב המכריע של מכונות Windows המודרניות להשתמש) כמו NTFS יתמוך שרשור של תיקיות ושמות קבצים עד אורך נתיב כולל של 32,767 תווים. זה עולה בהרבה על מבנה הספריות טיפוסי רוב המשתמשים היו צריכים אי פעם.

    איפה כל זה מתפרק הוא הגבלה מלאכותית Windows ערימות על גבי מערכת LFN / NTFS: המשתנה MAX_PATH. המשתנה MAX_PATH מציין שמבנה ספריות מלא ב- Windows לא יעלה על 260 תווים בסך הכל, כולל אות הכונן, המעי הגס, קו נטוי הפוך ו- back null בסוף. לכן יש לך רק MAX_PATH פוטנציאלי של 256 תווים, למשל. C: \ your-256-character-path \.

    אז מה שקרה כאשר היית מנקה את המחשב שלך הוא שיש לך ספרייה עם נתיב ארוך כבר (או בגלל שמות התיקייה היו ארוכים, שמות הקבצים היו ארוכים, או שניהם), וכאשר ניסית להעביר אחד או יותר של אלה ספריות לספרייה אחרת עם נתיב ארוך, אורך הכולל של שם הנתיב חרג ממגבלת 260 תווים שהוטלו על ידי המשתנה MAX_PATH.

    עכשיו, אתה עשוי לחשוב "אה-הא! אנחנו פשוט לשנות את המשתנה MAX_PATH ולפתור את הבעיה! "למרבה הצער, זה לא כל כך פשוט. לא רק המשתנה MAX_PATH הוא למעשה מקודד קשה לתוך Windows, אבל גם אם אתה עבר את הטרחה העצומה של שינוי זה, היית בסופו של דבר לשבור כל כך הרבה שזה לא יהיה שווה את זה. יותר מדי יישומים מצפים שמשתנה הנתיב יהיה מה ש- Windows כבר ציין זמן רב. אנחנו לא יכולים פשוט לשנות את זה בלי ליצור בלגן עצום.

    איפה זה משאיר אותך? ובכן, הפתרון הפשוט ביותר הוא פשוט לערוך את הנתונים נתיב. לדוגמה, אם יש לך טון של מאמרים שמורים שבהם היישום / ההרחבה שבו השתמשת לשמירתם מהאינטרנט יצר ספרייה שהיתה הכותרת המלאה של המאמר + המאמר, ולאחר מכן שם הקובץ עצמו הוא הכותרת המלאה של המאמר + להוביל את המאמר, זה יהיה פשוט מאוד להכות או יעלה על MAX_PATH עם שמירה אחת. עריכת תיקיות עצומות אלה כותרות המאמר למטה לגודל סביר יותר היא דרך קלה לתקן את הבעיה.

    אם יש לך מספר עצום של קבצים עם נתיב ארוך ואתה לא רוצה לערוך את כולם (או אם אתה רוצה למחוק טון של ספריות ישנות שאורכות זמן רב מדי עבור Windows כדי להתמודד עם כאשר מוגבל על ידי המשתנה MAX_PATH), יש עבודה שורת הפקודה מסביב. למרות ש- Windows מוגבל על ידי המשתנה MAX_PATH, מהנדסי Windows הבינו שיהיו מצבים שבהם המשתמשים יצטרכו להתמודד עם שמות נתיבים ארוכים יותר. ככזה, ה- API של Windows יש פונקציה להתמודדות עם נתיבים ארוכים מאוד.

    כדי לנצל את ה- API הזה ולהשתמש בכלי שורת הפקודה על תיקיות מסובך שלך / שמות קבצים, אתה פשוט צריך לצרף את שם המדריך עם כמה תווים מיותרים. לדוגמה, אם היה לך מבנה ספריות ענק שרצית למחוק (אך קיבלת שגיאה עקב אורך הנתיב בעת ניסיון), באפשרותך לשנות את הפקודה מ:

    rmdir c: \ Documents \ some-really-super-long-folder-name-schem \

    ל:

    rmdir \\? \ c: \ Documents \ some-really-super-long-folder-name-schem \

    המפתח הוא תוספת של \\? \ חלק לפני תחילת נתיב הקובץ; הדבר מורה ל- Windows להתעלם מהמגבלות שהוטלו על-ידי המשתנה MAX_PATH ולפעול עם הנתיב שסיפקת זה עתה כמסופק / מובנה ישירות על-ידי מערכת הקבצים הבסיסית (אשר יכולה לתמוך בבירור בנתיב ארוך יותר). כמו תמיד, לנקוט משנה זהירות בשורת הפקודה כדי למנוע בטעות מחיקת קבצים או ספריות אתה מתכוון להשאיר שלם.

    אם סקירה כללית של בעיה זו מעוררת בך סקרנות, בהחלט חפץ במאמר זה מתוך ספריית Microsoft Developer Network, שמות השמות, הנתיבים ושמות השמות, לקבלת מידע נוסף על מה שמתרחש מתחת למכסה המנוע.


    יש לך שאלה טק הקשה? תירה לנו דוא"ל בכתובת [email protected] ואנו נעשה כמיטב יכולתנו לענות על זה.