Rewinddir () verlangt ein gültiges Verzeichnishandle (Ressourcentyp) zum Betrieb. Wenn das Verzeichnisgriff vor der Ausführung von Rewinddir () von Condentir () oder anderen Mitteln geschlossen wurde, wird Rewinddir () nicht wirksam.
Lösung :
Stellen Sie sicher, dass das Verzeichnishandle gültig ist und nicht geschlossen ist, wenn Sie Rewinddir () anrufen. Beispielsweise können Sie Rewinddir () verwenden, um den Verzeichniszeiger zurückzusetzen, nachdem Sie Opendir () aufgerufen haben.
<span><span><span class="hljs-variable">$dir</span></span><span> = </span><span><span class="hljs-title function_ invoke__">opendir</span></span><span>(</span><span><span class="hljs-string">'/path/to/directory'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$dir</span></span><span>) {
</span><span><span class="hljs-comment">// Traversal -Verzeichnis</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">readdir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-comment">// Verzeichniszeiger zurücksetzen</span></span><span>
</span><span><span class="hljs-title function_ invoke__">rewinddir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>);
}
</span></span>Das Verzeichnis wird nicht korrekt mit Opendir () geöffnet
rewinddir () muss ein gültiges Verzeichnisressourcenhandel aufgerufen werden. Wenn Opendir () das Verzeichnis nicht erfolgreich eröffnet, funktioniert Rewinddir () nicht. Dies tritt normalerweise auf, wenn der Verzeichnispfad falsch ist oder nicht genügend Berechtigungen vorhanden sind.
Lösung :
Überprüfen Sie, ob Opendir () ein gültiges Verzeichnishandle erfolgreich zurückgibt, und prüfen Sie, ob der Verzeichnispfad korrekt ist, und verfügt über Zugriffsberechtigungen.
<span><span><span class="hljs-variable">$dir</span></span><span> = </span><span><span class="hljs-title function_ invoke__">opendir</span></span><span>(</span><span><span class="hljs-string">'/path/to/directory'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$dir</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Verzeichnis kann nicht geöffnet werden!"</span></span><span>);
}
</span><span><span class="hljs-comment">// Anruf rewinddir</span></span><span>
</span><span><span class="hljs-title function_ invoke__">rewinddir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>);
</span></span>Funktionen wie Scandir () wurden verwendet
Scandir () und andere ähnliche Funktionen geben direkt eine Reihe von Verzeichnisinhalten zurück, ohne sich auf Verzeichniszeiger zu verlassen. Nachdem Scandir () zur Erhöhung der Verzeichnisliste verwendet wurde, wird es nicht wirksam, wenn REWINDDIR () nicht wirksam wird, da sie das herkömmliche Verzeichnisgriff nicht verwendet.
Lösung :
Wenn Sie wiederholt auf den Verzeichnisinhalt zugreifen müssen, können Sie die Kombination von Opendir () und Readdir () anstelle von Scandir () verwenden. Dies stellt sicher, dass rewinddir () funktioniert.
<span><span><span class="hljs-variable">$dir</span></span><span> = </span><span><span class="hljs-title function_ invoke__">opendir</span></span><span>(</span><span><span class="hljs-string">'/path/to/directory'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$dir</span></span><span>) {
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">readdir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-title function_ invoke__">rewinddir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>); </span><span><span class="hljs-comment">// Zur Ausgangsposition umleiten</span></span><span>
}
</span></span>Gleichzeitige Operationen verursachen Probleme
In Umgebungen mit mehreren Threads oder gleichzeitigen Umgebungen kann der Verzeichnisgehalt durch andere Prozesse oder Threads geändert oder geschlossen werden, wodurch der Zeiger des Verzeichnisses nicht normal in die Startposition zurückkehrt, insbesondere in einigen sehr gleichzeitigen Serverumgebungen.
Lösung :
Versuchen Sie, Rewinddir () in Multi-Thread-oder gleichzeitigen Umgebungen zu vermeiden, oder nehmen Sie einen Verriegelungsmechanismus an, um sicherzustellen, dass das Verzeichnis während des Betriebs nicht geändert wird.
Nicht ordnungsgemäß gehandhabt Readdir () Rückgabewert
Wenn Sie einen Teil des Inhalts des Verzeichnisses über Readdir () gelesen haben, bevor Sie Rewinddir () anrufen, müssen Sie überprüfen, ob das Ende des Verzeichnisses erreicht ist. Andernfalls hat Rewinddir () möglicherweise keinen offensichtlichen Effekt.
Lösung :
Stellen Sie sicher, dass der Verzeichniszeiger das Ende nicht erreicht, bevor er Rewinddir () anruft, oder prüfen Sie, ob das Verzeichnis zuerst über Readdir () leer ist.
<span><span><span class="hljs-variable">$dir</span></span><span> = </span><span><span class="hljs-title function_ invoke__">opendir</span></span><span>(</span><span><span class="hljs-string">'/path/to/directory'</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$dir</span></span><span>) {
</span><span><span class="hljs-keyword">while</span></span><span> ((</span><span><span class="hljs-variable">$file</span></span><span> = </span><span><span class="hljs-title function_ invoke__">readdir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>)) !== </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$file</span></span><span> . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-comment">// Stellen Sie sicher, dass der Zeiger das Ende nicht erreicht</span></span><span>
</span><span><span class="hljs-title function_ invoke__">rewinddir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>);
}
</span></span>Inhalt des Verzeichnisses haben sich geändert
Wenn sich der Inhalt des Verzeichnisses nach dem Aufrufen von rewinddir () (wie die zugegebene oder gelöschte Datei) ändert, kann sich der Zeiger wie erwartet verhalten, insbesondere bei der Ausführung von Readdir () .
Lösung :
Versuchen Sie, das Verzeichnis mehrmals zu vermeiden, um das Verzeichnisgehalt zu ändern. Wenn Sie sicherstellen müssen, dass der Inhalt des Verzeichnisses unverändert bleibt, können Sie in Betracht ziehen, seinen Inhalt in einem Array zu speichern, bevor Sie das Verzeichnis durchqueren, um dynamische Änderungen zu vermeiden.