2009-12-07 6 views
1

J'ai besoin de is_dir() pour ne pas se soucier si le dossier ou l'argument est majuscule ou minuscule, ou un mélange de haut et bas. Par conséquent, si le nom de fichier est "Mon dossier" et que je cours is_dir("mY FoLdEr"), le résultat devrait être true.

Répondre

7

Ce n'est pas à la hauteur de PHP. Cela dépend du système d'exploitation et du système de fichiers sur lesquels PHP s'exécute. Windows n'est pas sensible à la casse, mais chaque version d'Unix/Linux est sensible à la casse. Permettez-moi de le dire autrement: is_dir() est fondamentalement une enveloppe à un appel système ou il utilisera les résultats des appels système sur les informations de fichier. Ces appels système retourneront quelque chose ou non si, selon les règles de ce système d'exploitation et système de fichiers, un fichier est trouvé avec le nom correspondant. PHP ne peut pas changer cela, donc vous ne pouvez pas faire en sorte que is_dir() soit insensible à la casse sur Linux. Le mieux que vous pouvez faire est d'obtenir une liste de fichiers dans le répertoire et de les parcourir pour tester si une comparaison insensible à la casse correspond à ce que vous cherchez.

Remarque: vous pourriez avoir plusieurs hits, par exemple "HOME" et "Home" seront tous deux "home". Que ferait une telle fonction (que vous voulez) dans ce cas?

Vous pouvez également modifier tous vos noms de fichier en minuscules, puis vous pouvez utiliser la version minuscule de votre entrée pour rechercher le fichier spécifié.

+0

Il n'y a donc aucun moyen de faire 'is_dir()' pour ne pas s'en soucier? – Johan

+0

@Johan - il y a, mais comme le souligne la note de Cletus, une telle fonction serait probablement une mauvaise idée. –

0

façon sale pourrait être obtenir la liste de tous les répertoires dir et comparez-leur strtolower() - noms ées avec le nom souhaité

1

Vous pouvez utiliser des expressions régulières. Je ne suis pas tout à fait sûr de la syntaxe en php:

is_dir("[mM][yY] [fF][oO][lL][dD][eE][rR]") 

Ils peuvent être un meilleur regexp pour elle.

+1

L'utilisation d'expressions régulières n'est pas possible dans 'is_dir'. Cependant, il existe une fonction 'glob' pour un effet similaire:' glob ('{mM} {yY} {fF} {oO} {lL} {dD} {eE} {rR}', GLOB_BRACE) ' – daluege

0

J'ai rencontré un problème pour valider un chemin de répertoire. Je ne voulais pas avoir un mélange de répertoires de noms similaires dans différents cas. c'est-à-dire mon \ dir et My \ Dir. J'ai essayé l'approche grep mentionnée par Filipglob('{mM}{yY} {fF}{oO}{lL}{dD}{eE}{rR}', GLOB_BRACE) mais j'ai trouvé que si le nom du répertoire était plus long qu'environ 8 caractères, il s'arrêterait. Donc, ceci est ma solution pour une insensible à la casse is_dir();

$path = '/'; 
$parts = explode(DIRECTORY_SEPARATOR, '/My/DirecTorY/pATh'); 

foreach($parts as $key => $dir) { 
    $isUnique = true; 

    if (is_dir($path . DIRECTORY_SEPARATOR . $dir)) { 
     $path .= DIRECTORY_SEPARATOR . $dir; 
     $isUnique = false; 
    } else { 
     $iterator = new DirectoryIterator($path); 
     $name = strtolower($dir); 

     foreach($iterator as $file) { 
      $filename = $file->getFilename(); 
      if($file->isDir() && strtolower($filename) == $name) { 
       $path .= DIRECTORY_SEPARATOR . $filename; 
       $isUnique = false; 
       break; 
      } 
     } 
    } 

    if($isUnique) { 
     $path .= DIRECTORY_SEPARATOR 
       . implode(DIRECTORY_SEPARATOR, array_slice($parts, $key)); 
     break; 
    } 
} 

var_dump($isUnique, $path);