Verzeichnis erstellen mit Kontrolle

phpameise

Mitglied
Wer kann mir ein bischen helfen?
Ich erzeuge mit php ein Verzeichnis mit Ordnern, in die user fotos uploaden können.
Jeder user hat seinen Foto Ordner. Dabei möchte ich, dass immer nur maximal 999
Ordner in einem Ordner liegen (soll wohl sonst zu Problemen führen).
Realisiert habe ich das mit Zurhilfenahme der user-id.

PHP:
//id auffüllen nach links mit nullen 6 stellig
$zahl = str_pad($user_id, 6 ,'0', STR_PAD_LEFT);

//zahl in dreistellige zahlen zerlegen von rechts beginnend
$v1 = substr ($zahl,-3,3);
$v2 = substr ($zahl,-6,3);

$path = "$v2/$v1";

if ( mkdir ( '../foto/'.$path.'/files', 0700, true ) )
{echo 'Verzeichnis erstellt!';}

Das funktioniert, obwohl ich als greenhorn sicher Fehler gemacht habe.
Nun möchte ich aber kontrollieren, ob es diesen Pfad, also das Verzeichnis, bereits gibt.
Eigentlich dürfte das ja nicht vorkommen, da ja jede user-id einzigartig ist. Konnte ich mich halbwegs verständlich machen?
 
Zuletzt bearbeitet:
So könntest du zum Beispiel die Anzahl der Ordner in einem Ordner zählen:
PHP:
define('SD_NAMES', 1);
define('SD_COUNT', 2);

function getSubDirs($dir, $mode=SD_NAMES)
{
  if ( !dir_exists($dir) ) return array();
  $contents = scandir($dir);
  if ( $dir === FALSE ) return array();

  if ( $mode & SD_NAMES )
    $subdirs = 0;
  else
    $subdirs = array();

  foreach ( $contents as $entry )
  {
     if ( is_dir($dir.DIRECTORY_SEPARATOR.$entry) )
     {
        if ( $mode & SD_NAMES )
          $subdirs[] = $dir.DIRECTORY_SEPARATOR.$entry;
        else
          $subdirs++;
     }
  }
  return $subdirs;
}

if ( getSubDirs($v1, SD_COUNT) > 999 )
{
  // Fehlerbehandlung!
  // ...
  exit();
}
if ( getSubDirs($v2, SD_COUNT) > 999 )
{
  // Fehlerbehandlung!
  // ...
  exit();
}
 
Ich glaub ich habs:
PHP:
if (!is_dir('../foto/'.$path.'/files')) {

if ( mkdir ( '../foto/'.$path.'/files', 0700, true ) )
{echo 'Verzeichnis erstellt!';}
}  
else
{
  echo 'Verzeichnis gibts schon!';
}
 
Zuletzt bearbeitet:
Ich glaub ich habs:
PHP:
if (!is_dir('../foto/'.$path.'/files')) {

if ( mkdir ( '../foto/'.$path.'/files', 0700, true ) )
{echo 'Verzeichnis erstellt!';}
}  
else
{
  echo 'Verzeichnis gibts schon!';
}

Ein Tipp am Rande. Formatiere dein Code mit Tabulatoren und man erkennt sofort welcher if wo endet ohne das man Klammern zählen muss
PHP:
if (!is_dir('../foto/'.$path.'/files')) {
	if ( mkdir ( '../foto/'.$path.'/files', 0700, true ) ){
		echo 'Verzeichnis erstellt!';
	}
}else{
	echo 'Verzeichnis gibts schon!';
}

Nachtrag:
Ich finde ComFreaks Funktion ein wenig kompliziert (geschweige davon, dass is_dir($entry) mMn immer auf false läuft, da $entry nur ein Ordnername ist, jedoch kein Ordnerpfad).
Ist natürlich geschmacksache - ich bevorzuge Arrays und Array-Funktionen *g*
PHP:
//id auffüllen nach links mit nullen 6 stellig
$zahl = str_pad($user_id, 6 ,'0', STR_PAD_LEFT);
$path = substr_replace($zahl, DIRECTORY_SEPARATOR, 3, 0);

//Pfad generieren
$myDir = buildPath('..', 'foto', $path, 'files');

//TODO: Ermitteln ob der Pfad exisitert....

//Alle Items auslesen
$items = scandir($myDir);
//Alles was kein Ordner ist rausfiltern
$dirs= array_filter($items, 'filterIsDir');
//Die Anzahl Dateien ermitteln
$countDirs = count($dirs);

/**
 * generiert aus allen übergebenen Values einen Pfad mit dem passenden Separator 
 */
function buildPath(){
    $items = func_get_args();
    return implode(DIRECTORY_SEPARATOR, $items);
}

/**
 * Ermittelt ob es sich um eine Folder im angegeben verzeichnis handelt
 */
function filterIsDir($item){
	return is_dir(buildPath($GLOBALS['myDir'], $item));
}
 
Nachtrag:
Ich finde ComFreaeks Funktion ein wenig kompliziert (geschweige davon, dass is_dir($entry) mMn immer auf false läuft, da $entry nur ein Ordnername ist, jedoch kein Ordnerpfad).
Ist natürlich geschmacksache - ich bevorzuge Arrays und Array-Funktionen *g*

Mit $entry hast du Recht, da muss man noch den Ordnerpfad davorpacken (Code oben aktualisiert!).

Ich muss ehrlich sagen, deine Lösung schaut eleganter bis auf das $GLOBALS['myDir'] aus ;)
 
Ich muss ehrlich sagen, deine Lösung schaut eleganter bis auf das $GLOBALS['myDir'] aus ;)
Leider ja. Das $GLOBALS gefällt mir auch nicht.... Alternativ könnte man mit einem array_walk() aus jedem item ein Pfad machen.
oder die Funktion weglassen und mittels create_function eine Massgeschneiderte Funktion schreiben
 
Zurück