Wie lösche ich einen Ordner, der sehr tief verschachtelt ist, und vermeide, dass der Dateiname zu lang ist?


70

Eclipse hat einen temporären Ordner in einem der Verzeichnisse erstellt, der ziemlich tief verschachtelt ist, z

dir1\dir1\dir1\dir1\...

Ich kann diesen Ordner in Windows nicht über den Explorer, die Befehle deloder rmdiroder den Cygwin-Befehl 'rm' löschen . Wie soll ich diesen sehr langen Ordner entfernen?

Es sagt immer nur "Dateiname zu lang ..."


Antworten:


105

Wenn Sie wie ich sind und keine zusätzliche Software installieren möchten , um ein Problem wie dieses zu beheben, gehe ich auf den Vorschlag von XQYZ ein und benutze ihn robocopy, um das Problem zu lösen. (In meinem Fall wurde das Problem in erster Linie durch Robocopy verursacht, indem ein Verzeichnis kopiert wurde, das rekursive Knotenpunkte enthielt, ohne / XJ an Robocopy zu übergeben.)

So löschen Sie den Verzeichnisbaum, der bei c: \ subdir \ more \ offending_dir beginnt :

Der gesamte Schritt-für-Schritt-Prozess ist so einfach:

  1. cd c:\subdir\more auf CD in das übergeordnete Verzeichnis.
  2. mkdir empty um ein leeres Verzeichnis zu erstellen.
  3. robocopy empty offending_dir /mir um das leere Verzeichnis in das fehlerhafte zu spiegeln.
  4. Nach einigem Warten bist du fertig! Beende es mit:
  5. rmdir offending_dir das jetzt leere beleidigende Verzeichnis loszuwerden und
  6. rmdir empty um Ihr leeres Zwischenverzeichnis loszuwerden.

2
Hervorragender Vorschlag. Mein Problem wurde auch durch Robocopy verursacht, und wie Sie beschrieben haben, hat der Robocopy-Fix ​​für mich funktioniert.
Nathan Garabedian

3
Ich habe auch ein Durcheinander mit robocopyund Knotenpunkten gemacht; danke, dass du mir gezeigt hast, wie man es benutzt, um das Chaos zu beseitigen!
Mr.Wizard

Meine Ordner wurden nicht von Robocopy erstellt, aber es hat sie perfekt entfernt
Sasha

11
Der Node Package Manager (NPM) hat dieses Problem für mich verursacht. Es gab aus irgendeinem Grund so viele verschachtelte Pakete.
David Sherret

Dies ist eindeutig die beste und vernünftigste Antwort, viel besser als ein maßgeschneidertes rekursives Batch-Skript
monastic-panic

39

Dies ist eigentlich ganz einfach zu beheben. Angenommen, die Verzeichnisstruktur lautet wie folgt:

C:\Dir1\Dir1\Dir1\Dir1…

Um das Problem zu beheben, benennen Sie einfach jeden Ordner in einen aus einem Zeichen bestehenden Ordnernamen um, bis das Löschen nicht mehr zu lange dauert:

  1. Umbenennen C:\Dir1inC:\D
  2. Navigiere zu C:\D\
  3. Umbenennen C:\D\Dir1inC:\D\D
  4. Navigiere zu C:\D\D\
  5. Gehe zu 1, bis die Gesamtlänge des Pfades <260 ist

Hier ist eine Batch-Datei zur Automatisierung des Prozesses (diese einfache Version eignet sich am besten für einfache Verzeichnisse wie das in der Frage beschriebene, insbesondere für Einwegverzeichnisse). Übergebe es dem höchstmöglichen Ordner (zB C:\Dir1für C:\Dir1\Dir1\Dir1…oder C:\Users\Bob\Desktop\New Folderfür C:\Users\Bob\Desktop\New Folder\abcdefghi…)

@echo off
if not (%1)==() cd %1
for /D %%i in (*) do if not %%i==_ ren "%%i" _
pushd _ 
%0 
popd

Technische Erklärung

Die anderen vorgeschlagenen Lösungen sind rückwärts; Sie können es nicht beheben, indem Sie sich vom innersten Verzeichnis nach außen arbeiten. Sie müssen in die andere Richtung gehen.

Wenn Sie versuchen, auf ein Verzeichnis zuzugreifen, verwenden Sie explizit oder nicht explizit dessen absoluten Pfad, der alles beinhaltet, was davor stand. Daher C:\Dir1\Dir1\Dir1\Dir1beträgt für eine Verzeichnisstruktur wie Dir122 die Länge des Pfads zum Innersten . Die Länge des Pfads zum Äußersten Dir1beträgt jedoch nur 7 und ist daher unabhängig von seinem Inhalt (im Kontext des Pfads eines bestimmten Verzeichnisses) immer noch zugänglich hat das Dateisystem keine Kenntnis darüber, was es enthält oder welche Auswirkungen es auf die Gesamtpfadlänge seiner untergeordneten Verzeichnisse hat, sondern nur auf seine Vorgängerverzeichnisse - Sie können ein Verzeichnis nicht umbenennen, wenn die Gesamtpfadlänge zu lang ist.

Wenn Sie auf einen zu langen Pfad stoßen, müssen Sie daher zur höchstmöglichen Ebene wechseln und sie in einen Namen mit einem Buchstaben umbenennen und für jede Ebene darin wiederholen. Jedes Mal, wenn Sie dies tun, verkürzt sich die Gesamtlänge des Pfads um den Unterschied zwischen dem alten und dem neuen Namen.

Auch das Gegenteil ist der Fall. Sie können keinen Pfad erstellen, der die maximal unterstützte Länge überschreitet (unter DOS und Windows MAX_PATH = 260). Sie können Verzeichnisse jedoch von innen nach außen in einen längeren Namen umbenennen. Das Ergebnis ist, dass auf tiefere Ordner mit einem absoluten Pfad von> 260 nicht zugegriffen werden kann. (Das macht sie nicht "versteckt" oder sicher, da sie einfach genug sind, um darauf zuzugreifen. Verwenden Sie diese Methode also nicht, um Dateien auszublenden.)


Interessante Randnotiz

Wenn Sie Ordner in Windows 7 Explorer erstellen, kann es so aussehen, als ob Sie in Explorer Unterverzeichnisse erstellen können, deren Gesamtlänge länger ist als MAX_PATHund tatsächlich betrügt dies jedoch tatsächlich mit „DOS 8.3-Dateinamen“. Sie können dies anzeigen, indem Sie einen Baum wie den folgenden erstellen:

C:\abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
   \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
    \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
     \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
      \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
       \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
        \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
         \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
          \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
           \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
            \abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\

Es ist 696 Zeichen lang, was natürlich viel länger als 260 Zeichen ist. Wenn Sie im Explorer zum innersten Unterverzeichnis navigieren, wird es erwartungsgemäß in der Adressleiste angezeigt, wenn es nicht im Fokus ist, aber wenn Sie auf die Adresse klicken In der Leiste ändert sich der Pfad zu C:\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\ABCDEF~1\, der nur 102 Zeichen lang ist.

In XP wird dies nicht ausgeführt, stattdessen weigert es sich standhaft, einen längeren Pfad zu erstellen, als unterstützt wird.

Was wirklich interessant wäre, ist herauszufinden, wie Windows 7 Explorer mit zu langen Pfaden umgeht, wenn die NtfsDisable8dot3NameCreationOption aktiviert ist.


3
Es ist möglich, einen Pfad zu erstellen, der länger als MAX_PATH ist, wie hier erläutert . Leider \\?` doesn't work with rmdir`.
Grawity

@grawity, ja, aber das liegt daran, dass es unter demselben Prinzip funktioniert: Ein kurzer Pfad wird in einen längeren Pfad umbenannt. Dies geschieht dynamisch, indem eine Variable erweitert und nicht manuell in eine größere umbenannt wird. Es ist nicht möglich, ein Verzeichnis zu erstellen, dessen absoluter Pfad zu lang ist, wenn der Erstellungsbefehl über genügend Informationen verfügt, um die Gesamtlänge zu bestimmen.
Synetech

3
@Synetech: Nein, das funktioniert anders. Pfade umgehen\\?\C:\dir\dir\dir\dir buchstäblich MAX_PATH. Es sind keine "Variablen" beteiligt. (Aber wie ich schon sagte, es funktioniert aus irgendeinem Grund nicht mit oder anderen Builtins.)rmdircmd.exe
Grawity

Beispiel: Versuchen md C:\01234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 Sie es mit "Ausführen". Dies funktioniert nicht, da das Dateisystem über ausreichende Informationen verfügt, um zu bestimmen, dass die gesamte Pfadlänge 263 Zeichen betragen würde. Daher schlägt dies fehl.
Synetech

2
(Verwechseln Sie auch die Pfadlänge nicht mit der Komponentenlänge . Sie können kein einzelnes Verzeichnis mit einem Namen mit mehr als 255 Zeichen haben. Sie können jedoch einen viel längeren Pfad haben .)
grawity

17

Sie können den Pfad verkürzen, indem Sie substein virtuelles Laufwerk erstellen:

C:\>subst Z: "C:\TEMP\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1\dir1"

Wechseln Sie in das virtuelle Laufwerk:

cd Z:

Jetzt können Sie die Dateien löschen:

del *.*

Entfernen Sie das virtuelle Laufwerk:

cd C:\TEMP
subst Z: /d

Entfernen Sie das Verzeichnis:

rd /s dir1

Nee; Dieser erste Befehl funktioniert nicht, wenn das Verzeichnis zu lang ist. es wird den Fehler Ungültiger Parameter zurückgeben .
Synetech

2
@Synetech, klar, aber wenn Sie nur subst C:\TEMP\dir1\dir1\dir1, dann wird es einen Teil davon verkürzen, so dass Sie einsteigen können. Es ist genau wie Ihr Vorschlag der Umbenennung, aber mit Mapping statt. ;)
Bobson

@ Bobson, okay, du hast recht; +1 für euch beide. :-)
Synetech

10

Ich habe eine kleine C # -App geschrieben, um eine ähnliche, sehr tiefe Struktur zu löschen, die durch eine unachtsame Verwendung von Robocopy und ein Backup von Homeserver generiert wurde. Standardmäßig behandelt Robocopy Gelenkpunkte als normale Ordner ... :-( Sie könnten ein großes Durcheinander erleben, ohne es zu bemerken.

Das Tool ist bei CodePlex mit Quelldateien erhältlich und kann von jedermann verwendet werden.

http://deepremove.codeplex.com


FUNKTIONIERT !!! Diese Antwort muss als funktionierend markiert sein! Die Software funktioniert wie Butter .. löste mein Problem in wenigen Sekunden !! Danke!
Rafique Mohammed

7

Vor einiger Zeit habe ich ein kleines, eigenständiges Dienstprogramm namens DeleteFiles erstellt , mit dem Sie diese Aufgabe einfach ausführen können.

Mit diesem eigenständigen Dienstprogramm können Sie einfach Folgendes tun:

deletefiles c:\yourfolder\subfolder\*.* -r -f

um die gesamte Ordnerstruktur zu löschen. -r recurses die Ordnerhierarchie aus dem Startverzeichnis nach unten, -f alle Ordner löscht , die leer sind (die alle von ihnen sein wird , wenn Sie verwenden . als Filespec). DeleteFiles unterstützt Pfade, die länger als das Windows MAX_PATH-Limit sind, sodass es für tief verschachtelte Ordner problemlos funktioniert.

DeleteFiles ist kostenlos und Open Source. Sie können entweder den Binärcode oder den Quellcode von GitHub herunterladen oder direkt mit Chocolatey installieren


Danke, tolles Tool, ++ für das Einfügen in chocolatey;) Erleichtert die Integration in ein CI-Tool!
Charles Ouellet

1
Das hat den Trick gemacht. Wenn Sie einen sehr langen Weg haben, kann das Hinzufügen > NULzum Ende den Prozess beschleunigen.
ryscl

Die Robocopy-Lösung hat bei mir nicht funktioniert und auch nicht die von Synetech. DeleteFiles funktionierte für mich, aber aus irgendeinem Grund musste ich es dreimal ausführen, damit alle Unterordner gelöscht wurden. Auf jeden Fall hat dies mein Problem gelöst.
Frank

Betreff: DeleteFiles 3 mal ausführen. Ich habe das auch gesehen - ich glaube, es liegt an einigen Windows-Macken, die Ordner mit darin enthaltenen Dateien für eine kurze Zeit sperren, selbst wenn Dateien gelöscht wurden. In mehreren Durchläufen wird das gelegentliche Fehlschlagen dieses Problems in Unterordnern festgestellt - möglicherweise mehrfach verschachtelt. Ich sehe das gleiche Verhalten mit Explorer-Löschungen von tiefen Bäumen.
Rick Strahl

5

Einfach und unkompliziert

Ich hatte das gleiche Problem seit so langer Zeit mit node_modules, die sehr verschachtelte Ordner. also endlich ein script gemacht um das zu beheben was ordner löschen kann indem pfade gekürzt werden.

https://github.com/dev-mraj/fdel

npm install fdel -g

fdel ./node_modules

Ich weiß nicht, warum die Designer beschlossen haben, jede Abhängigkeit in eine Struktur einzubeziehen, wenn sie es mit einer flachen Struktur hätten schaffen können. Daher war dieses Skript der einfachste Weg für mich, da ich bereits node.js
user2610529

4

Während der Arbeit mit Sikuli wurde ich mit einer Calculator.sikuli-Rekursionsschleife in dem Programm überlistet, die eine unzählige Menge von "calculator.sikuli.calculator.sikuli" -Dirs erzeugte. Ich könnte den Baum verschieben, aber der Pfadname ist zu lang, um ihn zu löschen.

Nachdem ich mehrere Lösungen mit popd loop, Scandisk ausprobiert habe und (merklich) nirgendwo hingekommen bin ....

Ich habe dieses Skript geschrieben, um tief in die rekursiven Verzeichnisse (in ein Verzeichnis mit dem Namen "a") zu gehen, sie zu verschieben (in ein Verzeichnis mit dem Namen "b"), dann den abgeschnittenen Baum zu löschen und sie zurück zu verschieben (nach "a"). , und wiederholen:

1)cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
.............go deeeeeep in         dir *A*
2) move calculator.sikuli ---> D:\b    
.............move the crazy tree to dir *B*    
3) kill D:\a\calculator.sikuli <---KILL(rd)    
.............wipe dir *A*'s tree    
4) move D:\b\calculator.sikuli ---> D:\a\    
.............move the crazy tree back to dir *A*    
REPEAT
  • REM Dient zum Löschen unendlich rekursiver Unterordner
  • REM schlägt vor, den Windows-Suchdienst zuerst zu beenden (services.msc)

Remdirs.bat

D:
cd D:\a\calculator.sikuli\calculator.sikuli\calculator.sikuli\calculator.sikuli
move /-Y calculator.sikuli D:\b
cd D:\b
rd /s/q D:\a\calculator.sikuli
move /-Y calculator.sikuli D:\a
call D:\remdirs2.bat

Dies ist nur ein Aufruf, um die Batchdatei erneut auszuführen.


Ich habe mich stundenlang damit beschäftigt. Diese .bat-Datei ist wie ein Geschenk des Himmels. Du, Silo, bist ein Engel. xD
Squish

2

Wir hatten ein Problem wie dieses bei der Arbeit, als Eclipse beschloss, Müll auf den Festplatten zu erzeugen. Wir haben es behoben, indem wir die / MIR-Funktion von robocopy verwendet haben, um ein leeres Verzeichnis in das verschachtelte zu spiegeln.


1

Ich würde versuchen, eine Eingabeaufforderung zu öffnen und Folgendes auszuführen:

rmdir /s <directory>

Wenn das nicht funktioniert, würde ich mich halbwegs in den Verzeichnisbaum einarbeiten und versuchen, eine Untergruppe der Verzeichnisse zu löschen - sagen wir die 20 innersten Verzeichnisse - und mich dann von dort herauszuarbeiten.


1
Ich habe Ihren obigen Vorschlag ausprobiert und es steht immer noch "Verzeichnis ist nicht leer", wenn ich den obigen Befehl mehrere Ebenen tief
ausführe

1
Das liegt daran, dass diese Methode rückwärts ist. ;-)
Synetech

1

Wenn es sich um einen Netzwerkordner handelt, geben Sie einfach das übergeordnete Verzeichnis dieses Verzeichnisses frei, ordnen Sie es einem Laufwerk auf Ihrem lokalen Computer zu und löschen Sie dann Ihren Ordner.


21966 [main] mv 1288 D: \ work \ software \ cygwin \ bin \ mv.exe: *** Fehler - Interner Fehler beim Lesen der Windows-Umgebung - Zu viele Umgebungsvariablen?
user39186

Ich habe versucht, einen Unterordner zu verschieben, der 20 Ebenen tief verschachtelt ist, und habe den obigen Fehler erhalten
user39186

1

Öffnen Sie eine Eingabeaufforderung.

Navigieren Sie zu dem Ordner / Verzeichnis, der das höchste 'dir1' enthält (wir gehen von C: \ aus).

c:\> RD /s dir1

Bearbeiten (nach Kommentaren) :

Andere Ideen:

MS bietet Informationen darüber , wie mit dem Problem zu befassen (viele Ideen zu versuchen) hier .

Es gibt auch dieses Tool (das ich nie persönlich benutzt habe) - TooLongPath .

Vielleicht schreiben Sie etwas (seit Sie Eclipse haben), das ganz nach innen navigiert und dann jeweils eine Ordnerebene zurücksetzt und dabei löscht?


1
Ich erhalte die folgenden drei Fehler , während die oben Befehls Verzeichnis verwendet , ist nicht das System leer Pfad konnte nicht finden angegeben Der Dateiname ist zu lang
user39186

Ich habe versucht, "n" Ebenen tief zu durchlaufen und habe versucht, denselben Befehl zu verwenden, aber es scheint nicht zu helfen
user39186

das hat bei mir auf win7 geklappt! danke
leoh

1

Eine andere Lösung: Laden Sie Total Commander herunter. Es ist ein sehr nützliches Programm, nicht nur, weil es lange Dateinamen kennt.

Die nicht registrierte Version ist nagware, aber voll funktionsfähig, es wird den Job erledigen.


1

Dies kann direkt über die Befehlszeile oder in einer Batch-Datei erfolgen, indem ein UNC-Pfad zu dem zu löschenden Verzeichnis erstellt wird

also statt

rmdir /s/q c:\mydirectory

verwenden

rmdir /s/q \\?\c:\myDirectory

Solche Pfade im UNC-Stil können viel länger sein und die 260-Zeichen-Grenze umgehen.


Funktioniert nicht The path \\?\C:\temp\wqiyretiuqyertiuyqwteiyrutqwuiyertiqrqweirqyert\wqteriuwqyetriuqwteiryutwiuertiuyqerieerrt\IOQWUE~1\QIWUYE~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\ OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1\OIUQYW~1 is too long.Windows 7 64-Bit.
Victor

Funktioniert nicht für Windows 10. Immer noch zu lang.
BananaAcid

Die `\\?` Version funktionierte für mich unter Windows 10!
Peter

0

Wenn ich dieses Problem habe, benenne ich einfach einige der Ordnernamen viel kürzer um. Sobald der Gesamtpfad kurz genug ist, wird OK gelöscht. Es werden keine zusätzlichen Werkzeuge benötigt.


Ja, aber wie gesagt, man muss von außen nach innen arbeiten, sonst geht es nicht.
Synetech

Na sicher. Ich habe festgestellt, dass die längsten Ordnernamen in der Regel die ersten (in Patch-Ordnern) oder die letzten sind. In den meisten Fällen müssen Sie nur einen oder zwei Ordnernamen ändern, um die richtige Länge zu erhalten.
music2myear

Ja, aber wenn Sie mit dem innersten beginnen, funktioniert dies nicht, da der renBefehl mit fehlschlägt path too long.
Synetech

1
Ja, die oben bereitgestellten Skripte sind eine clevere und effektive Methode zur automatischen Behandlung dieses Problems. Es ist mir nur ein paar Mal passiert und so habe ich einfach den manuellen Umbenennungsprozess verwendet. Zu diesem Zweck benenne ich die Ordnerstruktur einfach an der Stelle um, an der ich mich gerade im fehlerhaften Baum befinde, und meiner Erfahrung nach erscheinen die längsten Ordnernamen häufiger am Anfang oder am Ende der Baumstruktur. Meine Antwort ist daher gültig, obwohl sie hier wahrscheinlich nicht die stärkste oder klügste ist. Es ist keine Ablehnung wert.
music2myear

> Ich beginne einfach damit, die Ordnerstruktur umzubenennen, wo immer ich mich gerade in dem betreffenden Baum befinde. Nun ja, wenn Sie sich bereits in dem Baum befinden, können Sie zumindest diesen Ordner umbenennen (Sie müssen zu seinem übergeordneten Ordner wechseln). ; Möglicherweise können Sie auch einen Unterordner umbenennen, dieser ist jedoch möglicherweise zu lang.
Synetech

0

Ich hatte das gleiche Problem, außer dass es durch eine rekursive Cobian Backup-Aufgabe erstellt wurde. Ich stelle fest, dass die kostenlose Cobian-Software eine Deleter-Anwendung enthält, mit der sich diese lästigen verschachtelten Ordner sehr schnell entfernen lassen.

Es befindet sich unter dem Menü Extras.


0

Ich bin auf dasselbe Problem gestoßen, bei dem es um mehr als 5000 verzeichnisintensive Ordner ging, wie bei einigen Java-Anwendungen, und ich habe ein Programm geschrieben, mit dem Sie diesen Ordner entfernen können. Der gesamte Quellcode befindet sich in diesem Link:

https://gitlab.imanolbarba.net/imanol/DiREKT

Es hat das Ganze nach einer Weile entfernt, aber es hat es geschafft, die Arbeit zu erledigen. Ich hoffe, es hilft Menschen, die (wie ich) auf dasselbe frustrierende Problem stoßen


-3

Ihr Dateisystem ist möglicherweise beschädigt. Führen Sie chkdsk aus, um festzustellen, ob Reparaturen durchgeführt wurden, und löschen Sie dann den Ordner.


Nein, das ist nicht das Problem. Das Problem ist, dass die gesamte Pfadlänge länger ist als unterstützt ( MAX_PATH=255). Dies kann sogar mit einem nicht beschädigten Dateisystem passieren.
Synetech

Das Ausführen von chkdsk für den Ordner gab mir den folgenden Fehler. Das Laufwerk, der Pfad oder der Dateiname sind ungültig
user39186
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.