Startpagina » hoe » Waarom rapporteert Windows deze map is te lang om te kopiëren?

    Waarom rapporteert Windows deze map is te lang om te kopiëren?

    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 hartelijke groet,

    Mr. Disorganized

    Het probleem dat je tegenkomt is een ongelukkige kruising 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 samenwerkt 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 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 oudere SFN's leuk met elkaar te laten spelen. Als je ooit een oudere diskette of CD-ROM tegenkwam met vreemd afgeknotte 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 ver verwijderd van het midden van de jaren negentig en het hele lange bestandsnaam-ding is (voor het grootste deel) duidelijk gladgestreken. Als je een versie van Windows van de laatste 10 jaar gebruikt, heb je waarschijnlijk nooit een bestandslengteconflict tegengekomen, zoals we in de DOS / Windows 95-dagen tegenkwamen. Dat gezegd hebbende, komen we nog steeds hikken tegen, zoals je ontdekte met je schijfopruimingproject. Maar waarom? Als Windows 'Long Filename-systeem mappen en bestandsnamen ondersteunt van maximaal 255 tekens per component, tegen welke muur loopt u dan aan? We kunnen NTFS (het bestandssysteem dat de overgrote meerderheid van moderne Windows-machines gebruiken) niet de schuld geven, omdat NTFS een koppeling van mappen en bestandsnamen tot een totale padlengte van 32,767 tekens ondersteunt. 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 toen je probeerde een of meer van 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, u denkt 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 zo lang heeft opgegeven. We kunnen het niet zomaar veranderen, zonder een enorme puinhoop te creëren.

    Waar verlaat dat jou? Welnu, de eenvoudigste oplossing is om alleen de padgegevens te bewerken. Als u bijvoorbeeld een hoop opgeslagen artikelen hebt, waarbij de applicatie / 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 is van het artikel + de artikelstatus, zou het heel eenvoudig zijn om de MAX_PATH te raken of te overschrijden met een enkele opslag. Het is een eenvoudige manier om het probleem op te lossen door die enorme mappen- en artikeltitels te redigeren.

    Als u een groot aantal bestanden met een lang pad hebt en u ze niet allemaal wilt bewerken (of als u dat wilt) verwijderen een ton oude mappen die te lang zijn voor Windows om mee om te gaan als deze wordt beperkt door de MAX_PATH-variabele), er is een opdrachtregel rond. Hoewel Windows wordt beperkt door de variabele MAX_PATH, realiseerden Windows-technici zich dat er situaties zouden zijn waarin 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 in:

    rmdir c: \ documents \ some-really-super-long-folder-name-scheme \

    naar:

    rmdir \\? \ c: \ documents \ some-really-super-long-folder-name-scheme \

    De sleutel is de toevoeging van de \\? \ gedeelte voor 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 communiceren 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 je nieuwsgierig bent naar ons overzicht van dit onderwerp, moet je zeker ingaan op dit artikel uit de Microsoft Developer Network-bibliotheek, Bestanden, paden en naamruimtes een naam geven, voor meer informatie over wat er gebeurt onder de motorkap.


    Heeft u een dringende technische vraag? Schiet ons een e-mail op [email protected] en we zullen ons best doen om het te beantwoorden.