Während der PHP -Entwicklung wird die Funktion der Touch () häufig verwendet, um die Zugriffszeit und Änderungszeit einer Datei zu aktualisieren oder eine leere Datei zu erstellen, wenn die Datei nicht vorhanden ist. Viele Entwickler können jedoch auf das Problem stoßen, bei der Verwendung von Touch () versehentlich leere Dateien zu erstellen, insbesondere wenn die Datei nicht vorhanden ist, erstellt Touch () automatisch eine neue leere Datei. Dies kann in einigen Szenarien zu Problemen führen, insbesondere wenn Sie nicht versehentlich leere Dateien generieren möchten. In diesem Artikel wird untersucht, wie dieses Problem vermieden und einige praktische Tipps weitergegeben werden können.
Zunächst müssen wir das grundlegende Verhalten der Touch () -Funktion verstehen. Die Funktion "Touch () wird verwendet, um die Zugriffszeit und Änderungszeit einer Datei zu ändern. Der Funktionsprototyp lautet wie folgt:
<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>
$ Dateiname : Der Dateiname, auf dem man betrieben werden soll.
$ TIME : Ändern Sie die Zeit, standardmäßig zur aktuellen Zeit.
$ atime : Zugriffszeit, Standard für die aktuelle Zeit.
Wenn die angegebene Datei nicht vorhanden ist und keine Berechtigung zum Erstellen einer Datei hat, gibt Touch () false zurück. Wenn die angegebene Datei jedoch nicht vorhanden ist und eine Datei erstellt hat, wird eine leere Datei erstellt und True zurückgegeben.
Um zu vermeiden, dass Touch () eine leere Datei erstellen, wenn die Datei nicht vorhanden ist, können die folgenden Methoden verwendet werden:
Am einfachsten und effektivsten besteht darin, zu überprüfen, ob die Zieldatei vor der Verwendung von Touch () vorhanden ist. Sie können die Funktionen File_Exists () oder IS_FILE () verwenden, um festzustellen, ob die Datei bereits vorhanden ist. Wenn die Datei nicht vorhanden ist, können Sie den Touch () -Anruf überspringen.
<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">// Die Datei existiert nicht,Andere Aktionen oder Protokollierung durchführen</span></span><span>
}
</span></span>
Auf diese Weise wird Touch () nur aufgerufen, wenn die Datei bereits vorhanden ist, wodurch leere Dateien erstellt werden.
Manchmal kann der Zielpfad eher ein Verzeichnis als eine Datei sein, die auch zu falschem Verhalten führen kann. Verwenden Sie is_file (), um sicherzustellen, dass das Ziel eher eine Datei als ein Verzeichnis ist, wodurch unnötige leere Dateierstellung vermieden wird.
<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">// Verarbeitungsdateien sind keine regulären Dateien</span></span><span>
}
</span></span>
Wenn Sie eine Datei erstellen möchten, wenn die Datei nicht vorhanden ist, sollten Sie das Verzeichnis erstellen, in dem sich die Datei im Voraus befindet, und die entsprechenden Dateiberechtigungen festlegen, um zu vermeiden, dass leere Dateien erstellt werden. Wenn das Zielverzeichnis nicht vorhanden ist, können Sie zuerst das Verzeichnis erstellen und dann Touch () verwenden.
<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">// Erstellen Sie ein Verzeichnis und setzen Sie Berechtigungen</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>
Während die Verwendung des Fehlersuppressors @ keine empfohlene bewährte Praxis ist, können Sie @ vor Touch () den Fehler unterdrücken, wenn Sie sich nur darum kümmern, ob er erfolgreich ausgeführt wird und nicht die spezifischen Details des Fehlers.
<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>
Auf diese Weise gibt es keine Warnmeldung, auch wenn die Datei nicht vorhanden ist. Beachten Sie jedoch, dass dies nicht das Problem des Erstellens leerer Dateien löst. Die Verwendung in Kombination mit anderen Strategien kann daher effektiver sein.
Wenn Sie den Dateierstellungsprozess körniger steuern möchten, können Sie die Logik der Dateioperation entsprechend Ihren Anforderungen anpassen. In einigen Fällen kann es beispielsweise wünschenswert sein, eine Datei mit einem bestimmten Inhalt zu erstellen und nicht eine leere Datei. Zu diesem Zeitpunkt können Sie zunächst überprüfen, ob die Datei vorhanden ist. Wenn es nicht vorhanden ist, erstellen Sie die Datei und schreiben Sie einen Initialisierungsinhalt.
<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>
Dadurch wird vermieden, vollständig leere Dateien zu erstellen und gleichzeitig einen Standardinhalt bereitzustellen.
Wenn Sie flexiblere Operationen für die Erstellung und Änderung von Dateien benötigen, können Sie Datei_put_Contents () oder fopen () verwenden, um die Erstellung und das Schreiben von Dateien zu steuern. Mit diesen Methoden können Sie Daten gleichzeitig mit der Erstellung der Datei schreiben und die Erzeugung leerer Dateien vermeiden.
<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>
Oder verwenden Sie fopen () und erstellen und schreiben Inhalte, wenn die Datei nicht vorhanden ist:
<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' Der Modus erstellt Dateien und löscht den Inhalt der Datei</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>
Bei Verwendung der Funktion "touch ()) ist der Schlüssel zum Vermeiden, dass es versehentlich eine leere Datei erstellt hat, ob die Datei im Voraus existiert, oder andere Methoden zur Vermeidung der Erzeugung leerer Dateien. Durch Kombination von Funktionen wie Datei_Exists () , is_file () , mkdir () usw. können Sie unnötige leere Dateierstellung effektiv vermeiden. Jede Methode hat ihre anwendbaren Szenarien. Durch die Auswahl der geeigneten Strategie nach bestimmten Bedürfnissen kann die Robustheit und Wartbarkeit des Codes verbessert werden.