Comment éviter d'être induit en erreur par des liens souples lors de la jugement d'un répertoire par la fonction IS_DIR ()?
Dans le développement de PHP, la fonction is_dir () est souvent utilisée pour déterminer si un chemin est un répertoire. Ses fonctions sont très simples, mais dans certains cas, surtout en ce qui concerne les liens souples, IS_DIR () peut conduire à des résultats trompeurs. Un lien souple est essentiellement un raccourci vers d'autres fichiers ou répertoires, donc lors de la jugement d'un lien souple, la fonction is_dir () peut ne pas nous dire exactement quel type de contenu il pointe, en particulier lorsque le lien souple pointe vers un fichier plutôt qu'un répertoire.
Supposons que vous ayez une structure de répertoire où un répertoire est un lien souple qui pointe vers un autre chemin. Lorsque nous utilisons IS_DIR () pour juger ce lien souple, il renvoie généralement vrai , même si le lien souple n'est pas un répertoire, mais un fichier normal. Ce problème peut entraîner des jugements logiques incorrects, en particulier lorsque les opérations de fichiers et la traversée du répertoire. Afin de déterminer plus précisément si le chemin est un répertoire, nous devons éviter la confusion causée par is_dir () .
Afin de résoudre la nature trompeuse de la fonction is_dir () dans le jugement de liaison souple, nous pouvons combiner d'autres fonctions pour rendre le jugement de chemin plus précis. Voici quelques pratiques courantes:
Tout d'abord, nous pouvons utiliser la fonction is_link () pour déterminer si un chemin est un lien souple. La fonction is_link () renvoie une valeur booléenne indiquant si le chemin est un lien souple. En jugeant d'abord s'il s'agit d'un lien souple, nous pouvons éviter une erreur de jugement.
<span><span><span class="hljs-variable">$path</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-title function_ invoke__">is_link</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>)) {
</span><span><span class="hljs-comment">// Si c'est un lien doux,Vérifiez le chemin cible pointé par le lien souple</span></span><span>
</span><span><span class="hljs-variable">$target</span></span><span> = </span><span><span class="hljs-title function_ invoke__">readlink</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Pointeur de liaison souple:<span class="hljs-subst">$target</span></span></span><span>";
} </span><span><span class="hljs-keyword">elseif</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>)) {
</span><span><span class="hljs-comment">// Si ce n'est pas un lien doux,Déterminer s'il s'agit d'un répertoire</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$path</span></span></span><span> C'est un répertoire";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$path</span></span></span><span> 不C'est un répertoire";
}
</span></span>
De cette façon, nous pouvons d'abord confirmer si le chemin est un lien souple, puis déterminer s'il pointe vers un répertoire valide.
Une autre méthode consiste à utiliser la fonction realPath () , qui renverra le chemin absolu standard du chemin donné, en résolvant le problème de résolution du chemin causé par des liaisons souples. En passant le chemin vers RealPath (), nous pouvons obtenir l'emplacement réel final du chemin cible, évitant ainsi d'être induit en erreur par des liens souples lors de l'utilisation directement d'Is_dir () .
<span><span><span class="hljs-variable">$path</span></span><span> = </span><span><span class="hljs-string">'/path/to/directory'</span></span><span>;
</span><span><span class="hljs-variable">$realPath</span></span><span> = </span><span><span class="hljs-title function_ invoke__">realpath</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$realPath</span></span><span> !== </span><span><span class="hljs-literal">false</span></span><span> && </span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$realPath</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$realPath</span></span></span><span> est un répertoire valide";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$path</span></span></span><span> 不est un répertoire valide";
}
</span></span>
Dans cet exemple, realPath () analyse le lien souple et renvoie le chemin réel vers lequel il pointe. Ensuite, nous pouvons utiliser IS_DIR () en toute sécurité pour déterminer s'il s'agit d'un répertoire sans être induit en erreur par des liens souples.
LSTAT () est une fonction similaire à STAT () , mais elle ne suit pas les liens souples. Il renvoie les informations d'état du lien souple lui-même, et non les informations cibles indiquées par le lien. Si vous souhaitez obtenir le statut du lien lui-même dans le cas d'un lien souple, vous pouvez utiliser LSTAT () pour le juger.
<span><span><span class="hljs-variable">$path</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-title function_ invoke__">lstat</span></span><span>(</span><span><span class="hljs-variable">$path</span></span><span>)[</span><span><span class="hljs-string">'mode'</span></span><span>] & </span><span><span class="hljs-number">0170000</span></span><span> === </span><span><span class="hljs-number">0040000</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$path</span></span></span><span> C'est un répertoire(Même si c'est un lien doux)";
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"<span class="hljs-subst">$path</span></span></span><span> 不C'est un répertoire";
}
</span></span>
En utilisant la fonction LSTAT () , vous pouvez contrôler plus précisément le jugement du lien souple et obtenir des informations détaillées sur le lien.
En PHP, bien que la fonction IS_DIR () puisse indiquer si le chemin est un répertoire, il peut donner des résultats inexacts dans le cas des liens souples. Pour éviter cette tromperie, nous pouvons utiliser des fonctions telles que is_link () , realPath () et lStat () pour vérifier efficacement le chemin de diverses manières. Cela garantit que nous faisons fonctionner le système de fichiers plus précisément, évitant ainsi les problèmes potentiels en raison de liens souples.