2008-11-11 5 views
19

Ich möchte mein PHP-Skript eine Ausgabedatei in einem Ordner basierend auf dem Datum erstellen. Die Art, wie ich das tue, ist, dass es den Ordnername/Dateinamen von einer Textdatei erhalten soll, die von einem anderen Programm ausgegeben wurde, das ich nicht bearbeiten kann.Erstellen einer Datei in einem Ordner, der noch nicht existiert in PHP

So die seine Datei die Daten aus sieht wie folgt aus Grabbing:

data/newfolder/10302008/log_for_Today.txt | 24234234 

Nur mit mehreren Linien, ich brauche nur das Skript durch sie Zeile für Zeile zu gehen, greifen Sie den Ordner/Dateinamen und ein leeres Datei mit diesem Namen an diesem Ort.

Die Verzeichnisse sind alle 777. Jetzt weiß ich, wie man eine neue leere exe-Datei in einem Ordner erstellt, aber nicht herausfinden kann, wie man zuerst den Ordner erstellt, dann die exe darin, irgendwelche Ideen?

Antwort

0

Kannst du nicht einfach das tun, indem die dir mit mkdir Erstellen (http://nl.php.net/manual/en/function.mkdir.php) dann chmod es 777 (http://nl.php.net/manual/en/function.chmod.php) das Verzeichnis wechselt mit chdir (http://nl.php.net/manual/en/function.chdir.php) und erstellen Sie dann die Datei (touch)?

+0

Worüber ich am meisten besorgt bin, ist, dass ich die Datei und das Verzeichnis auf einmal schnappe und mir nicht sicher bin, wie ich sie leicht trennen kann. –

2

Erstellen Sie fehlende Ordner mithilfe von mkdir() und erstellen Sie dann die leere Datei mit touch().

Sie können in beiden Fällen absolute Pfade verwenden, was bedeutet:

 
mkdir('data'); 
mkdir('data/newfolder'); 
mkdir('data/newfolder/10302008'); 
touch('data/newfolder/10302008/log_for_Today.txt'); 

, wenn Sie neugierig auf, wo es Ausgangspunkt wird es sein, Sie getcwd() verwenden Sie das Arbeitsverzeichnis zu erzählen.

+0

Downvoted, da dies viel einfacher mit rekursiven mkdir() durchgeführt werden kann - siehe gnud Antwort. – siliconrockstar

4

Mit

$directories = explode('/', $path); 

können Sie den Pfad aufgespalten einzelne Verzeichnisnamen zu erhalten. Dann gehen Sie durch das Array und erstellen Sie die Verzeichnisse Einstellung chmod 777. (Der Systembenutzer, der php führt die Fähigkeit, das zu tun haben muss.)

$file = array_pop($directories); 
$base = '/my/base/dir'; 

foreach($directories as $dir) 
{ 

    $path = sprintf('%s/%s', $base, $dir) 
    mkdir($path); 
    chmod($path, 777); 
    $base = $path; 

} 

// file_put_contents or something similar 
file_put_contents(sprintf('%s/%s', $base, $file), $data); 

Das Problem hierbei ist, dass Sie nicht chmod von Ihrem PHP gesetzt könnte Skript.

Eine Alternative könnte FTP sein. Der Benutzer gibt FTP-Anmeldedaten an das Skript weiter und verwendet FTP-Funktionen zum Verwalten von Dateien.

http://www.php.net/FTP

55
if(!file_exists(dirname($file))) 
    mkdir(dirname($file), 0777, true); 
//do stuff with $file. 

den dritten Parameter zu mkdir() verwenden, die es rekursiv Verzeichnisse macht.

+0

Das ist mir noch nie aufgefallen, thx :-) – okoman

+2

Ich auch nicht. Recursive wurde offenbar in Version 5 hinzugefügt. Coolness! – da5id

1

Es ist etwas zu spät, aber ich habe diese Frage gefunden und ich habe eine Lösung dafür, hier ist ein Beispiel Code und es funktioniert gut für mich, egal wie tief ist Ihre Datei. Sie sollten das Verzeichnistrennzeichen für die Zeilen 1 und 3 ändern, wenn Sie es auf dem Windows-Server ausführen.

$pathToFile = 'test1/test2/test3/test4/test.txt'; 
$fileName = basename($pathToFile); 
$folders = explode('/', str_replace('/' . $fileName, '', $pathToFile)); 

$currentFolder = ''; 
foreach ($folders as $folder) { 
    $currentFolder .= $folder . DIRECTORY_SEPARATOR; 
    if (!file_exists($currentFolder)) { 
     mkdir($currentFolder, 0755); 
    } 
} 
file_put_contents($pathToFile, 'test'); 

Mit freundlichen Grüßen, Georgi!

+0

Diese Lösung funktioniert sehr gut in Kombination mit RecursiveDirectoryIterator, da die grundlegende Ausgabe für den Dateinamen eine Zeichenfolge ist, die den vollständigen Pfad sowie die Datei selbst enthält. Diese Lösung funktioniert gut, um alles auszupacken. In meinem Fall schreibe ich ein Skript, das einen statischen Cache einer Site, die tatsächlich als serialisiertes Objekt gespeichert ist, entpackt, entpackt, um den HTML-Inhalt aus dem Array zu extrahieren, und speichert das dann als Datei an einem anderen Basisstandort. Dadurch kann ich eine statische Version der Site aus dem Cache erstellen, ohne die Site crawlen zu müssen, um sie zu spiegeln. Funktioniert super! – Carnix

Verwandte Themen