2008-11-11 14 views
19

Quiero que mi script php cree un archivo de salida en una carpeta en función de la fecha. La forma en que hago esto es que se supone que debe obtener el nombre de carpeta/nombre de archivo de un archivo de texto generado por otro programa que no puedo editar.Crear un archivo dentro de una carpeta que aún no existe en php

Así que el archivo de su acaparamiento de los datos desde el siguiente aspecto:

Sólo
data/newfolder/10302008/log_for_Today.txt | 24234234 

con múltiples líneas, sólo necesito el guión que pasar por línea por línea, agarra la carpeta/nombre de archivo y crear un vacío archivo con ese nombre en esa ubicación.

Los directorios son todos 777. Ahora sé cómo crear un nuevo archivo exe vacío en una carpeta, pero parece que no puede encontrar la manera de crear primero la carpeta y luego el exe dentro de ella, ¿alguna idea?

Respuesta

2

Cree las carpetas que faltan utilizando mkdir(), luego cree el archivo vacío usando touch().

Puede usar rutas absolutas en ambos casos, lo que significa:

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

si tienes curiosidad por saber dónde está punto de partida será, puede utilizar getcwd() para informarle del directorio de trabajo.

+0

Downvoted ya que esto se puede lograr mucho más simplemente usando mkdir recursivo() - vea la respuesta de gnud. – siliconrockstar

4

Con

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

puede dividir el camino para llegar los nombres de directorio individuales. A continuación, vaya a través de la matriz y crear los directorios de ajuste chmod 777. (El usuario del sistema, que ejecuta PHP debe tener la capacidad de hacer eso.)

$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); 

El problema aquí es que no podría establecer chmod de su php guión.

Una alternativa podría ser usar FTP. El usuario pasa datos de inicio de sesión FTP a la secuencia de comandos y utiliza la funcionalidad FTP para administrar archivos.

http://www.php.net/FTP

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

usar el tercer parámetro a mkdir(), lo que hace crear directorios de forma recursiva.

+0

Nunca he notado esto antes, thx :-) – okoman

+2

Yo tampoco. Recursive fue aparentemente agregado en la versión 5. ¡Frialdad! – da5id

1

Es un poco tarde, pero encontré esta pregunta y tengo una solución para esto, aquí hay un código de ejemplo y funciona bien para mí, no importa qué tan profundo sea su archivo. Debe cambiar el separador de directorios para las líneas 1 y 3 si lo está ejecutando en el servidor de Windows.

$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'); 

Best regards, Georgi!

+0

Esta solución funciona muy bien cuando se combina con RecursiveDirectoryIterator, ya que la salida básica del nombre de archivo es una cadena que incluye la ruta completa y el archivo en sí. Esta solución funciona bien para descomprimir todo eso. En mi caso, estoy escribiendo un script que toma un caché estático de un sitio que en realidad se guarda como un objeto serializado, descomprimiéndolo para extraer el contenido HTML de la matriz y luego guardándolo como un archivo en otra ubicación base. De este modo, me permite crear una versión estática del sitio desde la memoria caché sin tener que rastrear el sitio para reflejarlo. ¡Funciona genial! – Carnix

Cuestiones relacionadas