Pendant le développement de PHP, la fonction Touch () est souvent utilisée pour mettre à jour le temps d'accès et le temps de modification d'un fichier, ou pour créer un fichier vide lorsque le fichier n'existe pas. Cependant, de nombreux développeurs peuvent rencontrer le problème de la création accidentel de fichiers vides lors de l'utilisation de Touch () , en particulier lorsque le fichier n'existe pas, Touch () créera automatiquement un nouveau fichier vide. Cela peut causer des problèmes dans certains scénarios, surtout lorsque vous ne voulez pas générer accidentellement de fichiers vides. Cet article explorera comment éviter ce problème et partager quelques conseils pratiques.
Tout d'abord, nous devons comprendre le comportement de base de la fonction Touch () . La fonction Touch () est utilisée pour modifier le temps d'accès et le temps de modification d'un fichier. Le prototype de fonction est le suivant:
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">touch</span></span><span> ( </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$filename</span></span><span> [, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">time</span></span><span>() [, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$atime</span></span><span> = </span><span><span class="hljs-title function_ invoke__">time</span></span><span>() ]] )
</span></span>
$ nom de fichier : le nom du fichier à utiliser.
$ Time : modifiez l'heure, par défaut à l'heure actuelle.
$ Atime : heure d'accès, par défaut à l'heure actuelle.
Si le fichier spécifié n'existe pas et n'a pas l'autorisation de créer un fichier, touch () renvoie false , mais si le fichier spécifié n'existe pas et a la permission de créer un fichier, un fichier vide est créé et vrai est renvoyé.
Pour éviter tactile () de créer un fichier vide lorsque le fichier n'existe pas, les méthodes suivantes peuvent être prises:
Le moyen le plus simple et le plus efficace est de vérifier si le fichier cible existe avant d'utiliser Touch () . Vous pouvez utiliser les fonctions file_exists () ou is_file () pour déterminer si le fichier existe déjà. Si le fichier n'existe pas, vous pouvez ignorer l'appel Touch () .
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">touch</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// Le fichier n'existe pas,Effectuer d'autres actions ou journalisation</span></span><span>
}
</span></span>
De cette façon, Touch () ne sera appelé que si le fichier existe déjà, évitant ainsi de créer des fichiers vides.
Parfois, le chemin cible peut être un répertoire plutôt qu'un fichier, ce qui peut également conduire à un comportement incorrect. Utilisation d'Is_file () pour s'assurer que la cible est un fichier plutôt qu'un répertoire, évitant davantage la création de fichiers vides inutiles.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">is_file</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">touch</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// Le traitement des fichiers n'est pas des fichiers réguliers</span></span><span>
}
</span></span>
Si vous souhaitez créer un fichier lorsque le fichier n'existe pas, envisagez de créer le répertoire où le fichier est situé à l'avance et de définir les autorisations de fichiers appropriées pour éviter que les fichiers vides soient créés. Si le répertoire cible n'existe pas, vous pouvez d'abord créer le répertoire, puis utiliser Touch () .
<span><span><span class="hljs-variable">$dir</span></span><span> = </span><span><span class="hljs-title function_ invoke__">dirname</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">is_dir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">mkdir</span></span><span>(</span><span><span class="hljs-variable">$dir</span></span><span>, </span><span><span class="hljs-number">0777</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>); </span><span><span class="hljs-comment">// Créer un répertoire et définir les autorisations</span></span><span>
}
</span><span><span class="hljs-title function_ invoke__">touch</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>);
</span></span>
Bien que l'utilisation de l'erreur Supressor @ ne soit pas une meilleure pratique recommandée, si vous vous souciez seulement de son exécution avec succès et non des détails spécifiques de l'erreur, vous pouvez utiliser @ avant tactile () pour supprimer l'erreur.
<span><span>@</span><span><span class="hljs-title function_ invoke__">touch</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>);
</span></span>
De cette façon, même si le fichier n'existe pas, il n'y aura pas de message d'avertissement. Cependant, notez que cela ne résout pas le problème de la création de fichiers vides, donc l'utiliser en combinaison avec d'autres stratégies peut être plus efficace.
Si vous souhaitez contrôler le processus de création de fichiers de manière plus granulaire, vous pouvez personnaliser la logique de fonctionnement du fichier en fonction de vos besoins. Par exemple, dans certains cas, il peut être souhaitable de créer un fichier avec un contenu spécifique, plutôt qu'un fichier vide. Pour le moment, vous pouvez d'abord vérifier si le fichier existe. S'il n'existe pas, créez le fichier et écrivez un contenu d'initialisation.
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-string">"Initial content"</span></span><span>);
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-title function_ invoke__">touch</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>);
}
</span></span>
Cela évite de créer des fichiers complètement vierges tout en fournissant un contenu par défaut.
Si vous avez besoin d'opérations de création de fichiers et de modification plus flexibles, vous pouvez utiliser File_put_contents () ou fopen () pour contrôler la création et l'écriture de fichiers. Ces méthodes vous permettent d'écrire des données en même temps que le fichier est créé, en évitant la génération de fichiers vides.
<span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">file_exists</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>)) {
</span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-string">"Initial content"</span></span><span>);
}
</span></span>
Ou utilisez fopen () , et créez et écrivez du contenu si le fichier n'existe pas:
<span><span><span class="hljs-variable">$handle</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fopen</span></span><span>(</span><span><span class="hljs-variable">$filename</span></span><span>, </span><span><span class="hljs-string">"w"</span></span><span>); </span><span><span class="hljs-comment">// 'w' Le mode crée des fichiers et efface le contenu du fichier</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$handle</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>, </span><span><span class="hljs-string">"Initial content"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$handle</span></span><span>);
}
</span></span>
Lorsque vous utilisez la fonction Touch () , la clé pour éviter de créer accidentellement un fichier vide est de juger si le fichier existe à l'avance, ou de prendre d'autres méthodes pour éviter la génération de fichiers vides. En combinant des fonctions telles que file_exists () , is_file () , mkdir () , etc., vous pouvez éviter efficacement la création de fichiers vides inutile. Chaque méthode a ses scénarios applicables. Le choix de la stratégie appropriée en fonction des besoins spécifiques peut améliorer la robustesse et la maintenabilité du code.