2010-09-01 5 views
3

Je travaille actuellement sur ce projet qui m'oblige à faire une fonction qui décide de façon dinamique le nom du répertoire puis crée un simple fichier .txt dans ce répertoire.Pourquoi fopen() se comporte-t-il comme ça?

mon code est le suivant: (destinatario de $ est une chaîne)

 $diretorio="../messages/".$destinatario; 
if (is_dir($diretorio)) { 
    ; 
}else{ 
    mkdir($diretorio); 
} 
$path=$diretorio."/".$data.",".$assunto.",".$remetente.".txt"; 
$handle=fopen($path,'w+'); 

fwrite($handle, $corpo); 

fclose($handle); 

Nevermind le portugais, mais la ligne de fond est qu'il doit créer un fichier .txt à l'aide des lignes directrices de nommage que j'ai fournies . La chose amusante est que quand je fais cela, php crée ce fichier bizarre dont le nom de fichier est "01.09.2010 04" (sans extension du tout) ce qui revient aux premiers caractères du nom de fichier que je voudrais créer. ..

modifier (données $ est en fait la sortie d'un appel à ce jour (« dmY H: i »))

+0

Pourquoi le chemin comporte-t-il des virgules? J'imagine que le problème réside avec eux. – slikts

+2

Donc '$ data' contient '01 .09.2010 04 ', et il n'y a pas de virgule après? Qu'est-ce que vous obtenez si vous collez 'echo $ path;' avant $ handle? – Lekensteyn

+2

Avez-vous vérifié que votre chemin $ ne contient aucun caractère illégal, par ex. un saut de ligne? – Select0r

Répondre

4

par comment by OP:

[$ data est] en fait la sortie d'un appel à ce jour ("d.m.Y H: i")

Le problème est le caractère :. (encore, il peut y avoir d'autres caractères illégaux dans les autres parties qui composent le nom du fichier final.)


EDIT
L'essence du problème et la solution est dans les commentaires à @tchen's answer. Gardez à l'esprit que le signe deux-points est un caractère de nom de fichier valide sur les plates-formes (certaines? All?) * Nix mais n'est pas valide sous Windows.

+0

+1 Cela fait vraiment sens. Vous pouvez aussi filtrer les caractères sur un nom de fichier, en utilisant une liste blanche (supprimer sauf si elle est listée) – Lekensteyn

+0

@Lekensteyn Indeed. Peut-être même la même stratégie que celle appliquée lors de la création de titres "URL friendly", voir par ex. http://stackoverflow.com/search?q=php+url+replace – jensgram

0

ne sont pas liés, mais assurez-vous que votre si les déclarations ne sont pas des conditions non utilisées:

if (!is_dir($diretorio)) { 
    mkdir($diretorio); 
} 

Cela permettra également de se débarrasser de cette ligne vide avec un seul terminateur ;, je suis sûr que ce n'est pas correct.

0

Quelques idées:

  • Avez-vous essayé de ne pas utiliser des virgules dans le nom de fichier?
  • Avez-vous vérifié la valeur de retour si fopen et fwrite?

Juste pour essayer d'isoler le problème

vous pouvez également simplifier à:

if (!is_dir($diretorio)) { 
    mkdir($diretorio); 
} 
1

Assurez-vous qu'il n'y a pas de mauvais caractères à la fin des données $. Appelez trim() dessus.

Si ce sont des données provenant d'un fichier, il peut y avoir un '\ r' ou un '\ n' à la fin de celui-ci.

+1

c'est en fait la sortie d'un appel à ce jour ("d.m.Y H: i") –

+1

@Felipe Almeida Alors le ':' est le problème. – jensgram

+0

@jensgram Bon appel,: est illégal sur Windows (mais pas sur Linux). Il est surprenant que fopen() coupe juste votre chemin au caractère illégal au lieu de retourner une erreur. Ou est-ce un PHP-isme? – tchen

Questions connexes