22Aug
Als je lang genoeg met Windows werkt, vooral met mappen en bestanden met lange namen, kom je een bizarre fout tegen: Windows meldt dat het mappad of de bestandsnaam te lang is om naar een nieuwe bestemming te gaan of zelfs te verwijderen. Wat is er aan de hand?
Hey How-To Geek!
Dus onlangs reorganiseerde ik sommige bestanden op mijn computer, maakte ik mappen, dat soort dingen. Toen ik een aantal bestanden naar een map verplaatste, kreeg ik een bericht waarin stond dat het resulterende mappad te lang zou zijn. Ik was in de war. Ik weet dat elk besturingssysteem sinds DOS lange bestandsnamen ondersteunt, maar Windows beweert dat het pad te lang is? Waarom gebeurt dit?
Met vriendelijke groet,
Mr. Disorganized
Het probleem dat u tegenkomt is een ongelukkig kruispunt van twee systemen die, in gevallen als deze, een fout oplevert. Om precies te begrijpen waar de fout vandaan komt, moeten we ingaan op de geschiedenis van lange bestandsnamen( LFN) en de manier waarop Windows met hen communiceert voordat we ons verdiepen in oplossingen.
Lange bestandsnamen werden geïntroduceerd, via de onderliggende MS-DOS-architectuur, in Windows 95. Het nieuwe LFN-systeem stond bestands- en mapnamen toe van maximaal 255 tekens. Dit was een welkome uitbreiding van het vorige bestandsnaamsysteem, meestal 8.3 bestandsnaamgeving genoemd, omdat de naam was beperkt tot acht tekens en een extensie van drie cijfers, maar ook bekend als Short Filename( SFN).Zoals je je wel kunt voorstellen, waren er toen nog steeds veel DOS-gebaseerde apps en er waren meer dan een paar hoofdpijnen die probeerden om de nieuwere LFN's en de oude SFN's leuk met elkaar te laten spelen. Als je ooit een oudere diskette of CD-ROM tegenkwam met vreemd geknipte bestanden erop( zoals abcdef ~ 1.txt), werd de bestandsnaam verkort door een SFN-gebruikende oude applicatie van wat langere en niet-ondersteunde LFN( zoals abcdefghijk.tekst).
We zijn echter nog ver verwijderd van het midden van de jaren negentig en het hele lange-bestandsnaam-ding is( voor het grootste deel) duidelijk gladgestreken. Als u een versie van Windows van de afgelopen 10 jaar gebruikt, is het conflict tussen de bestandsnamen waarschijnlijk nog nooit tegengekomen, zoals we in de DOS / Windows 95-dagen tegenkwamen. Dat gezegd hebbende, we lopen nog steeds tegen hikken aan, zoals je ontdekte met je schijfopruimingsproject. Maar waarom? Als Windows 'Long Filename-systeem mappen en bestandsnamen van maximaal 255 tekens per component ondersteunt, op welke plaats loop je dan tegen? We kunnen NTFS( het bestandssysteem dat de overgrote meerderheid van de moderne Windows-machines gebruiken) niet de schuld geven. NTFS ondersteunt namelijk het koppelen van mappen en bestandsnamen tot een totale padlengte van 32,767 tekens. Dat is veel groter dan de typische directorystructuur die de meeste gebruikers ooit nodig zouden hebben.
Waar het allemaal uit elkaar valt, is een kunstmatige beperking Windows-stacks bovenop het LFN / NTFS-systeem: de MAX_PATH-variabele. De variabele MAX_PATH geeft aan dat een volledige directorystructuur in Windows maximaal 260 tekens mag bevatten, inclusief de stationsletter, dubbele punt, backslash en nul-speling aan het einde. Je hebt dus alleen een potentieel reëel MAX_PATH van 256 tekens, bijvoorbeeld C: \ uw-256-karakter-pad \ .
Dus wat er gebeurde toen je je computer aan het opruimen was, was dat je een map had met een al lang pad( ofwel omdat de mapnamen lang waren, de bestandsnamen lang waren, of beide), en wanneer je probeerde om een of meer te verplaatsenvan die mappen in een andere map met een lang pad, de totale lengte van de padnaam overschreed de 260 tekens limiet opgelegd door de MAX_PATH variabele.
Nu denkt u misschien: "Ah-hah! We veranderen gewoon de MAX_PATH-variabele en lossen het probleem op! "Helaas is het niet zo eenvoudig. Niet alleen is de variabele MAX_PATH in feite hard gecodeerd in Windows, maar zelfs als je door het enorme gedoe ging om het te veranderen, zou je uiteindelijk zoveel breken dat het het niet waard zou zijn. Te veel toepassingen verwachten dat de padvariabele is wat Windows al lang heeft opgegeven. We kunnen het niet zomaar veranderen, zonder een enorme puinhoop te creëren.
Waar blijft dat bij jou? Welnu, de eenvoudigste oplossing is om alleen de padgegevens te bewerken. Als u bijvoorbeeld een hoop opgeslagen artikelen hebt, waarbij de toepassing / extensie die u gebruikte om ze op te slaan van het web een map heeft gemaakt die de volledige titel van het artikel + de artikellead was, en de bestandsnaam zelf de volledige titel isvan het artikel + de artikelstart, zou het heel eenvoudig zijn om de MAX_PATH te raken of te overschrijden met een enkele opslag. Het is een gemakkelijke manier om het probleem op te lossen door die enorme map en artikeltitels te bewerken tot een redelijker formaat.
Als je een groot aantal bestanden hebt met een lang pad en je wilt ze niet allemaal bewerken( of als je wilt verwijderen, verwijder dan een hoop oude mappen die te lang zijn voor Windows om mee om te gaan als ze worden beperkt door deMAX_PATH-variabele), er is een opdrachtregel rond werken. Hoewel Windows wordt beperkt door de variabele MAX_PATH, realiseerden Windows-technici zich dat er situaties zouden zijn waarbij gebruikers langere padnamen zouden moeten verwerken. Als zodanig heeft de Windows API een functie voor het omgaan met extreem lange paden.
Om te profiteren van die API en opdrachtregelprogramma's te gebruiken voor uw logge mappen / bestandsnamen, hoeft u alleen maar de mapnaam toe te voegen met een paar extra tekens. Als u bijvoorbeeld een enorme directorystructuur had die u wilde verwijderen( maar een fout ontving vanwege de padlengte toen u dit probeerde), kunt u de opdracht wijzigen van:
rmdir c: \ documents \ some-really-super-long-mapnaam-schema \
naar:
rmdir \\? \ c: \ documents \ some-really-super-long-folder-name-scheme \
De sleutel is de toevoeging van het \\? \ gedeeltevoor het begin van het bestandspad;dit geeft Windows de opdracht de beperkingen te negeren die zijn opgelegd door de MAX_PATH-variabele en om te werken met het pad dat je zojuist hebt opgegeven, zoals rechtstreeks door het onderliggende bestandssysteem wordt geleverd / begrepen( wat een langer pad duidelijk kan ondersteunen).Wees zoals altijd voorzichtig bij de opdrachtprompt om te voorkomen dat per ongeluk bestanden of mappen worden verwijderd die u intact wilde laten.
Als ons overzicht van dit probleem u nieuwsgierig maakt, moet u zeker ingaan op dit artikel uit de Microsoft Developer Network-bibliotheek, Bestanden, paden en naamruimten een naam geven, voor meer informatie over wat er onder de motorkap gebeurt.
Heeft u een dringende technische vraag? Schiet ons een e-mail op [email protected] en we zullen ons best doen om deze te beantwoorden.