Problem mit fwrite();
Sören
- php
Konichi wa,
ich bin dabei mir ein Script in PHP zu schreiben, das mir eine Website in Smarty-Form kopieren soll, unabhaengig von ihrer Groesse.
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<?php
//HTML-Dateien in einem Ordner in den Array $files_convert speichern.
function get_dir($par_dir, $ebene){
$files_convert = array();
if ($handle = opendir($par_dir)){
while (false != ($file = readdir($handle))) {
if($file != '.' && $file != '..') {
$path_parts = pathinfo($file);
if(is_dir($par_dir."/".$file)){
//echo $ebene."<b>".$file."</b><br>\n";
get_dir($par_dir."/".$file , $ebene." ");
}else {
if($path_parts["extension"]=="html"){
$path = $par_dir."/".$file;
//echo $ebene."<a href='".$par_dir."/".$file."'>".$par_dir."/".$file."</a><br>\n";
array_push($files_convert, $path);
}
}
}
}
closedir($handle);
}
//Fuer jedes Element in $files_convert
foreach ($files_convert as $value){
$path = pathinfo($value);
$tmp_dir = substr($path['basename'], 0, -5); //Dateinamen ohne Endung
$file_dir = substr($value, strpos($value, "/")+1, strpos($value, "/", 3)-1); //neuer Speicherort
$new_file_dir = "newtest/".$file_dir;
$dir = $value;
$site = $tmp_dir.'.php'; //Daeiname mit PHP-Endung
// Inhalt von der Seite einlesen
//$array = file($value);
// Den Array von $array in eine String $string umwandeln
//$string = implode("", $array);
$handle = fopen ($value, "rb");
$string = fread ($handle, filesize ($value));
fclose ($handle);
// Offset auf Start setzen
$offset=0;
// Ordner erstellen wenn noch ncih vorhanden
if (! is_dir($new_file_dir)){
mkdir($new_file_dir);
}
//Datei erstellen
fopen($new_file_dir.$site, "w+b");
//Smarty-Infos schreiben
if (is_writable($new_file_dir.$site)) {
fwrite($new_file_dir.$site, '<?php\nrequire_once("smarty/Smarty.class.php"); // Smarty includen\n$index=new Smarty; // Ein neues Smartyobjekt erzeugen');
}
//<title> auslesen und in Datei schreiben
while(strpos($string,'<title>', offset) !==false){
$anfangtitle=strpos($string,'<title>', $offset)+62;
$endtitle=strpos($string,'</title>', $offset)-8;
$title=substr($string, $anfangtitle, $endtitle-$anfangtitle);
if (is_writable($new_file_dir.$site)) {
fwrite($new_file_dir.$site, '$index->assign("$title", $tmp_dir);\n?>');
}
}
// Inhalt auslesen und schreiben
while(strpos($string,'<!--content-->', $offset)!==false){
$anfang=strpos($string,'<!--content-->', $offset)+16;
$ende=strpos($string,'<!--EndeAuslesen!-->',$offset)-70;
$inhalt=substr($string, $anfang, $ende-$anfang);
if (is_writable($new_file_dir.$site)) {
fwrite($new_file_dir.$site, '$index->assign("$content",$inhalt);');
}
}
//Datei schliessen
fclose($new_file_dir.$site);
// Offset auf Ende setzen
$offset=$ende;
//
}
}
get_dir(".", "");
?>
</body>
</html>
Mir wird jedoch folgende Fehlermeldung ausgegeben:
Warning: fwrite(): supplied argument is not a valid stream resource in G:\xampp\htdocs\kfbc\new\test\convert.php on line 63
Warning: fwrite(): supplied argument is not a valid stream resource in G:\xampp\htdocs\kfbc\new\test\convert.php on line 73
Bin inzwischen etwas ratlos da ich net versteh, wieso fwrite net funzt. Was muss ich aendern?
Gruesse aus Japan
Seren-san
Bin inzwischen etwas ratlos da ich net versteh, wieso fwrite net funzt. Was muss ich aendern?
fwrite($new_file_dir.$site, '<?php\nrequire_once("smarty/Smarty.class.php"); // Smarty includen\n$index=new Smarty; // Ein neues Smartyobjekt erzeugen');
Bist du sicher, dass das hier alles richtig escaped ist?
Hello,
fopen($new_file_dir.$site, "w+b");
//Smarty-Infos schreiben
if (is_writable($new_file_dir.$site)) {
fwrite($new_file_dir.$site,
Wolltest Du nun eine Handle-basierte Funktion benutzen oder eine namensbasierte?
Wenn Du fwrite() benutzen wolltest, solltest Du auch ein Handle übergeben und keinen Namen!
Außerdem hat Dein Script noch diverse Macken
Die Rekursion beim einlesen der Verzeichnisse könnte bei einem Link auf ein Verzeihnis zum dauerläufer werden :-)
Du solltest Dir Gedanken über Locking machen. Da gibt es einen guten Artikel von Christian Seiler.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hi,
Wolltest Du nun eine Handle-basierte Funktion benutzen oder eine namensbasierte?
Wenn Du fwrite() benutzen wolltest, solltest Du auch ein Handle übergeben und keinen Namen!
Wo is der unterschied? Arbeite noch net lange mit PHP und hab mir mein script mehr oder weniger ausm Netz zusammen kopiert.
Du solltest Dir Gedanken über Locking machen. Da gibt es einen guten Artikel von Christian Seiler.
Locking is doch nur fuer den IE wenn ich das jetzt richtig im Inet gelesen hab. Ich nutze Firefox und das script wird nur lokal ausgefuerht.
Gruesse aus Japan
Soeren-san
Hello,
Wolltest Du nun eine Handle-basierte Funktion benutzen oder eine namensbasierte?
Wenn Du fwrite() benutzen wolltest, solltest Du auch ein Handle übergeben und keinen Namen!Wo is der unterschied? Arbeite noch net lange mit PHP und hab mir mein script mehr oder weniger ausm Netz zusammen kopiert.
Ein Handle ist ein Index in eine Ressource-Tabelle. Das ist so eine frühe Art von Objektorientierung ;-) In der Ressource-Tabelle stehen alle momentanen Eigenschaften zu dem Objekt vermerkt, also wo gerade der Satzzeiger steht, wie groß die Satzgröße ist, wie die Daten übersetzt werden sollen, wem das Handle gehört, usw.
Alle Filesystemfunktionen arbeiten nun mit dieser Ressourcetabelle und müssen sich deshalb von dort erst ein gültiges Handle anfordern:
$fh = fopen($dateiname, $zugriffsart);
wobei jetzt $fh das Handle ist, $dateiname der qualifizierte Pfad zur Datei im Filessystem und $zugriffsart bestimmt, in welchem Modus Du die Datei öffnen willst. Je nach Betriebssystem und Mechanismus kann man das gleich inclusive Lockingstatus oder (hier bei PHP) nur ohne diese Information tun:
http://de3.php.net/manual/en/function.fopen.php siehe "modes for fopen()"
die Funktionen fread() und fwrite() (und andere) können dann mit dem Handle arbeiten, solange es gültig ist. Du hast aber Deinem fwrite() einen Namen übergeben. Damit kann es nichts anfangen, deshalb die Fehlermeldung.
FALSCH: fopen($new_file_dir.$site, "w+b"); ## hier wirfst Du das begehrte Handle ins Nirwana
fwrite($new_file_dir.$site, ...
RICHTIG: $handle = fopen($new_file_dir.$site, "w+b");
fwrite($handle, ...
Du solltest Dir Gedanken über Locking machen. Da gibt es einen guten Artikel von Christian Seiler.
http://aktuell.de.selfhtml.org/artikel/programmiertechnik/dateisperren/
Locking is doch nur fuer den IE wenn ich das jetzt richtig im Inet gelesen hab. Ich nutze Firefox und das script wird nur lokal ausgefuerht.
PHP läuft im Backend, der Browser im Frontend. Das von mir gemeinte Locking hat nichts mit dem Frontend zu tun, sondern nur mit dem Backend und dort mit dem Filesystem.
Lies dir mal in Ruhe den Artikel durch und dann melde Dich wieder.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
echo $begrüßung;
Ein Handle ist ein Index in eine Ressource-Tabelle. Das ist so eine frühe Art von Objektorientierung ;-)
Wo ist denn da was mit Objektorientierung? Welcher Code ist denn direkt mit dem unter dem Begriff Handle zusammengefassten Datensammlung verbunden? Wenn du das als Objektorientierung ansiehst, wären sämtliche zusammenhängende Daten Objekte.
In der Ressource-Tabelle stehen alle momentanen Eigenschaften zu dem Objekt vermerkt, also wo gerade der Satzzeiger steht, wie groß die Satzgröße ist, wie die Daten übersetzt werden sollen, wem das Handle gehört, usw.
Alle Filesystemfunktionen arbeiten nun mit dieser Ressourcetabelle und müssen sich deshalb von dort erst ein gültiges Handle anfordern:
Alle? Der zweite Halbsatz bezieht sich doch wohl nur auf fopen() und ähnliche Initialisierungsfunktionen.
die Funktionen fread() und fwrite() (und andere) können dann mit dem Handle arbeiten, solange es gültig ist.
Dazu müssen sie es aber explizit übergeben bekommen. Ist ja schließlich nicht objektorientiert (auch nicht im Frühstadium).
echo "$verabschiedung $name";
Hello,
Ein Handle ist ein Index in eine Ressource-Tabelle. Das ist so eine frühe Art von Objektorientierung ;-)
Wo ist denn da was mit Objektorientierung?
Wie würdest Du es denn bezeichnen? Das Handle bezeichnet ein Filesystemobjekt, auf das die Methoden (handelbasierten Filesystemfunktionen) angewendet werden können, keine anderen!
In der Ressource-Tabelle stehen alle momentanen Eigenschaften zu dem Objekt vermerkt, also wo gerade der Satzzeiger steht, wie groß die Satzgröße ist, wie die Daten übersetzt werden sollen, wem das Handle gehört, usw.
Alle Filesystemfunktionen arbeiten nun mit dieser Ressourcetabelle und müssen sich deshalb von dort erst ein gültiges Handle anfordern:
Alle?
Nein, natürlich nur die handlebasierten. Sorry, ich hätte das gebetsmühlenartig nochmal wiederholen müssen. Sehe ich ein.
Der zweite Halbsatz bezieht sich doch wohl nur auf fopen() und ähnliche Initialisierungsfunktionen.
... und müssen ein gültiges Handle daraus benutzen, das vorher mit fopen() angefordert werden kann/muss.
die Funktionen fread() und fwrite() (und andere) können dann mit dem Handle arbeiten, solange es gültig ist.
Dazu müssen sie es aber explizit übergeben bekommen. Ist ja schließlich nicht objektorientiert (auch nicht im Frühstadium).
Das sehe ich anders!
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
echo $begrüßung;
» > Ein Handle ist ein Index in eine Ressource-Tabelle. Das ist so eine frühe Art von Objektorientierung ;-)
» Wo ist denn da was mit Objektorientierung?
Wie würdest Du es denn bezeichnen?
Eine ganz normale Datenstruktur oder ein Datentyp, je nachdem, ob man von innen oder von außen draufschaut.
Das Handle bezeichnet ein Filesystemobjekt, auf das die Methoden (handelbasierten Filesystemfunktionen) angewendet werden können, keine anderen!
Du kannst es als Objekt nach allgemeiner Lesart bezeichnen, so wie du ein Radio oder einen Bleistift als Objekt bezeichnen kannst, nicht aber als ein Objekt im OOP-Kontext. Ein Handle ist nichts weiter als eine Datenansammlung irgendwo im Speicher. Darauf kann man mit herkömmlicher Programmierung mit allen Konstrukten zugreifen, die Speicher im jeweiligen Gültigkeitsbereich lesen können. Nichts verhindert das. Ob es sinnvoll ist, diesen Speicherbereich zum Beispiel der Funktion zur Sinusberechnung zu übergeben, steht auf einem anderen Blatt. Möglich ist das aber. Bei OOP sorgt Compiler oder Laufzeitumgebung dafür, dass Eigenschaften eines Objekts nur von den Mitglieder des Objekts selbst verwaltet werden, solange sie nicht der Öffentlichkeit zugänglich gemacht werden.
» > die Funktionen fread() und fwrite() (und andere) können dann mit dem Handle arbeiten, solange es gültig ist.
» Dazu müssen sie es aber explizit übergeben bekommen. Ist ja schließlich nicht objektorientiert (auch nicht im Frühstadium).
Das sehe ich anders!
Du siehst sowieso manche Sachen komisch.
echo "$verabschiedung $name";
Hello,
Du siehst sowieso manche Sachen komisch.
Dann lach doch endlich.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Hallo,
»» Ein Handle ist ein Index in eine Ressource-Tabelle. Das ist so eine frühe Art von Objektorientierung ;-)
Wo ist denn da was mit Objektorientierung?
<gebetsmühle>Objektorientierung ist eine Denkweise und findet in den Köpfen der Programmierer statt. Es ist völlig unerheblich, ob diese Denkweise durch Eigenschaften des Compilers oder der Programmiersprache begünstigt wird; selbst in Assembler kann man objektorientiert programmieren.</gebetsmühle>
Welcher Code ist denn direkt mit dem unter dem Begriff Handle zusammengefassten Datensammlung verbunden? Wenn du das als Objektorientierung ansiehst, wären sämtliche zusammenhängende Daten Objekte.
Richtig, so ist es - in Kombination mit Funktionen (OO-Anhänger nennen sie auch gern "Methoden"), die dafür vorgesehen sind, mit genau diesen Daten zu arbeiten.
»» Alle Filesystemfunktionen arbeiten nun mit dieser Ressourcetabelle und müssen sich deshalb von dort erst ein gültiges Handle anfordern:
"... und müssen ein gültiges Handle bekommen" träfe es wohl besser.
Dazu müssen sie es aber explizit übergeben bekommen. Ist ja schließlich nicht objektorientiert (auch nicht im Frühstadium).
Doch, es ist objektorientiert, weil alle (oder zumindest alle notwendigen) Daten zu einer Struktur (einem "Objekt") zusammengefasst sind und dazu Funktionen existieren, die nur in Verbindung mit einer solchen Struktur sinnvoll arbeiten können.
Und wenn ich ein Codemodul programmiere, das einen bestimmten in sich abgeschlossenen und sinnvollen Funktionsumfang implementiert, nach außen (eine) klar definierte Aufrufschnittstelle(n) und Datentypen zur Verfügung stellt, ist das schon objektorientiert: Der Programmierer, der dieses Modul später wiederverwendet, muss nicht wissen, wie es intern realisiert ist (Kapselung), er kann es direkt gegen ein andersartiges mit gleicher Schnittstelle und nach außen hin gleicher Funktion austauschen (Polymorphie), und er kann ein eigenes Modul definieren, dessen Schnittstelle eine Obermenge ist und das weitergehende Möglichkeiten bietet (Vererbung). Damit wären die drei klassischen Paradigmen der OOP erfüllt.
So long,
Martin
echo $begrüßung;
<gebetsmühle>Objektorientierung ist eine Denkweise und findet in den Köpfen der Programmierer statt. Es ist völlig unerheblich, ob diese Denkweise durch Eigenschaften des Compilers oder der Programmiersprache begünstigt wird; selbst in Assembler kann man objektorientiert programmieren.</gebetsmühle>
Deine Gebetsmühle mach die Aussage auch nicht richtiger. Selbstverständlich erkenne ich an, das man eine an die OOP angelehnte Denkweise auch auf Assembler-Niveau umzusetzen versuchen kann. Es fehlt jedoch letztlich die direkte Bindung zwischen Daten und Methoden. Die von dir und Tom gewünschte Verbindung beruht nur auf Sinnhaftigkeit. Funktionen und Daten bleiben getrennte Dinge. Bei dem, was landläufig als OOP bezeichnet wird, ist die Bindung jedoch durch die Programmiersprache und deren Compiler/Interpreter sichergestellt. Eigenschaften und Methoden bilden eine Einheit, _ein_ Objekt.
» Welcher Code ist denn direkt mit dem unter dem Begriff Handle zusammengefassten Datensammlung verbunden? Wenn du das als Objektorientierung ansiehst, wären sämtliche zusammenhängende Daten Objekte.
Richtig, so ist es - in Kombination mit Funktionen (OO-Anhänger nennen sie auch gern "Methoden"), die dafür vorgesehen sind, mit genau diesen Daten zu arbeiten.
Es wird kein Objekt daraus, nur weil bestimmte Vorgehensweisen für bestimmte Daten vorgesehen sind, sie aber letzlich keine Einheit bilden.
Doch, es ist objektorientiert, weil alle (oder zumindest alle notwendigen) Daten zu einer Struktur (einem "Objekt") zusammengefasst sind und dazu Funktionen existieren, die nur in Verbindung mit einer solchen Struktur sinnvoll arbeiten können.
Daten/Eigenschaften allein sind kein Objekt. Die für bestimmte Daten vorgesehenen Funktionen könnte man vielleicht vewendungszweckorientiert nennen.
Und wenn ich ein Codemodul programmiere, das einen bestimmten in sich abgeschlossenen und sinnvollen Funktionsumfang implementiert, nach außen (eine) klar definierte Aufrufschnittstelle(n) und Datentypen zur Verfügung stellt, ist das schon objektorientiert: Der Programmierer, der dieses Modul später wiederverwendet, muss nicht wissen, wie es intern realisiert ist (Kapselung), er kann es direkt gegen ein andersartiges mit gleicher Schnittstelle und nach außen hin gleicher Funktion austauschen (Polymorphie), und er kann ein eigenes Modul definieren, dessen Schnittstelle eine Obermenge ist und das weitergehende Möglichkeiten bietet (Vererbung). Damit wären die drei klassischen Paradigmen der OOP erfüllt.
Die Datenbindung als wesentliche Eigenschaft fehlt. Somit bleibt es nur VZOP.
echo "$verabschiedung $name";
Hallo,
Selbstverständlich erkenne ich an, das man eine an die OOP angelehnte Denkweise auch auf Assembler-Niveau umzusetzen versuchen kann.
nein, bereits die Betrachtungsweise qualifiziert den Ansatz als OOP.
Es fehlt jedoch letztlich die direkte Bindung zwischen Daten und Methoden.
In meinem abstrakteren Fall geschieht sie durch meine Festlegung als Programmierer, du legst aber anscheinend Wert darauf, dass sie auch durch Kontrollmechanismen des Compilers überwacht wird. Denn mehr ist es nicht: Durch die Deklaration einer Klasse teile ich dem Compiler mit, dass ein bestimmter Datensatz und eine Menge von Funktionen zusammengehören sollen. Am Code ändert das im Prinzip nichts.
Ich kann meiner Datenstruktur sogar noch Zeiger auf die zugeordneten Funktionen unterbringen, wenn ich Vererbung und virtuelle, überschreibbare Methoden von vornherein vorsehen möchte. Dann entspricht der so erzeugte C-Code beinahe exakt dem, was ein C++-Compiler aus einer vergleichbaren Klassendeklaration macht.
Die von dir und Tom gewünschte Verbindung beruht nur auf Sinnhaftigkeit.
Nein, auf Disziplin. Auf der Disziplin des Programmierers, die Funktionen wirklich nur für den Zweck und mit den Daten zu nutzen, für die sie gedacht sind.
Funktionen und Daten bleiben getrennte Dinge.
Das sind sie in der "echten" OOP auch. Die Verbindung wird dort nur durch die VMT (Virtual Method Table) des Objekts hergestellt - und statische Methoden sind darin nicht einmal enthalten; die werden ausschließlich durch den Compiler zugeordnet, der ihren Aufruf in einem falschen Kontext nicht erlaubt.
Bei dem, was landläufig als OOP bezeichnet wird, ist die Bindung jedoch durch die Programmiersprache und deren Compiler/Interpreter sichergestellt. Eigenschaften und Methoden bilden eine Einheit, _ein_ Objekt.
Sicher - das sind aber nur Erleichterungen bzw. Überwachungen des Compilers während der Übersetzung des Codes. OOP ist aber, wie gesagt, auch ohne diese Überwachungen möglich, wenn man selbst dafür sorgt, dass die Regeln eingehalten werden.
Es wird kein Objekt daraus, nur weil bestimmte Vorgehensweisen für bestimmte Daten vorgesehen sind, sie aber letzlich keine Einheit bilden.
Nein, sondern es wird ein Objekt daraus, indem der Programmierer sagt: "So sei es."
Schönen Abend noch,
Martin
Hello,
<gebetsmühle>Objektorientierung ist eine Denkweise und findet in den Köpfen der Programmierer statt. Es ist völlig unerheblich, ob diese Denkweise durch Eigenschaften des Compilers oder der Programmiersprache begünstigt wird; selbst in Assembler kann man objektorientiert programmieren.</gebetsmühle>
Deine Gebetsmühle mach die Aussage auch nicht richtiger. Selbstverständlich erkenne ich an, das man eine an die OOP angelehnte Denkweise auch auf Assembler-Niveau umzusetzen versuchen kann.
Du fängst am falschen Ende an.
Erst war diskrete Programmierung
Dann kam ByteCode + Inlinedaten
Dann kam ein Tool: Assembler mit (1.) merkbaren Abkürzungen für verfügbare Befehle und (2.) mit der Unterstützung des Tools für die Auflösung von Adressen
Dann kam der Makroassembler: Wiederkehrende Assemblersequenzen und deren Abwandlungen konnten parametriesierbar als Module verwendet werden.
Und dann kamen die frühen Ideen der Objektorientierung auf.
Bei Aufruf eines Makros (natürlich inzwischen reentranzfähig!) wurden Stammvariablen udn Stammfunktionen des Moduls initialisiert und die Funktionen entweder mit der Adresse zu einem Rücksprung belegt oder aber mit der Adresse zu einem Funktionsaufruf belegt.
Dabei wurde dann i.d.R. auch ein Zeiger auf einen Parameter-Übergabe-Bereich übergeben.
Nur weil die Technik noch nicht weit genug entwickelt war (Speicher, Geschwindgkeit, Protected Mode), waren das doch die Anfänge der Objektorientierten Programmierung.
Versuche doch einmal, ohne die passende IDE ein OPP-Programm zu erstellen. Dann wirst Du vielleicht selber doch noch herausfinden, dass OOP aus den Programmiertechniken in Assembler, einem weit entwicklenten Hilfsprogramm zu dren Erzeugung und der passenden Systemarchitektur besteht. Auf die Systemarchitektur kann man nach der Theorie der OOP sogar noch verzichten auf Kosten der Sicherheit (M$ hat das jahrelang zugunsten der Rückwärtskompatibilität getan), aber ohne Hilfsprogramm möchte ich die OOP-Strukturen nicht mehr gerne erzeugen müssen.
Dabei sind diejenigen in (Turbo-)Pascal und Nachfolgern erzeugten sogar noch sehr viel leichter per Hand erzeugbar, als diejenigen in C und C++ erzeugten. Und das steht witzigerweise der Sicherheit des entstehenden Codes entgegen. Pascals Nachfahren sind lange nicht so fehlerträchtig wie C's Nachfahren.
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg
Konnichi wa,
anscheinend lag es an der while-Schleife, weswegen das Script nicht gefunzt hat. Nachdem ich die while-Schleife herausgenommen habe, funktioniert das Script jetzt im Prinzip.
Jetzt haben sich aber 3 neue Probleme aufgetan.
1. Die japanischen Zeichen werden mir nicht korrekt in die Datei geschrieben. Wenn ich jedoch mit echo ausgeben lasse, was er mir reinschreiben soll, wird es mir korrekt angezeigt.
2. Der japanische Teil der Website wird zum Teil gar nicht oder nur zum Teil in die Datei geschrieben.
3. Zwischen den einzelnen Teilen des Quelcodes, in der neuen Datei, haette ich gerne einen Zeilenumbruch. Wenn ich es mit '\r\n' oder nur '\n' versuche wird mir das einfach mit in den Quelcode geschrieben.
Der Code sieht folgendermassen jetzt aus:
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
[code lang=php]<?php
//HTML-Dateien in einem Ordner in den Array $files_convert speichern.
function get_dir($par_dir, $ebene){
$files_convert = array();
if ($handle = opendir($par_dir)){
while (false != ($file = readdir($handle))) {
if($file != '.' && $file != '..') {
$path_parts = pathinfo($file);
if(is_dir($par_dir."/".$file)){
//echo $ebene."<b>".$file."</b><br>\n";
get_dir($par_dir."/".$file , $ebene." ");
}else {
if($path_parts["extension"]=="html"){
$path = $par_dir."/".$file;
//echo $ebene."<a href='".$par_dir."/".$file."'>".$par_dir."/".$file."</a><br>\n";
array_push($files_convert, $path);
}
}
}
}
closedir($handle);
}
//Fuer jedes Element in $files_convert
foreach ($files_convert as $value){
$path = pathinfo($value);
$tmp_dir = substr($path['basename'], 0, -5); //Dateinamen ohne Endung
$file_dir = substr($value, strpos($value, "/")+1, strpos($value, "/", 3)-1); //neuer Speicherort
$new_file_dir = "newtest/".$file_dir;
$dir = $value;
$site = $tmp_dir.'.php'; //Daeiname mit PHP-Endung
// Inhalt von der Seite einlesen
//$array = file($value);
// Den Array von $array in eine String $string umwandeln
//$string = implode("", $array);
$handle = fopen ($value, "rb");
$string = fread ($handle, utf8_encode(filesize ($value)));
fclose ($handle);
// Offset auf Start setzen
$offset=0;
//$handle_dir = fopen($new_file_dir, "w+b");
$handle_filedir = fopen($new_file_dir.$site, "w+b");
// Ordner erstellen wenn noch ncih vorhanden
if (! is_dir($new_file_dir)){
mkdir($new_file_dir, 0777, true);
}
//<title> auslesen und in Datei schreiben
//while(strpos($string,'<title>', offset) !==false){
$anfangtitle=strpos($string,'<title>', $offset)+62;
$endtitle=strpos($string,'</title>', $offset)-8;
$tmp_title=substr($string, $anfangtitle, $endtitle-$anfangtitle);
/*if (is_writable($handle_filedir)) {
fwrite($handle_filedir, '$index->assign("$title", $tmp_dir);\n?>');
}*/
//}
$title = '$index->assign("$title", \''.$tmp_title.'\');';
// Inhalt auslesen und schreiben
//while(strpos($string,'<!--content-->', $offset)!==false){
$anfang=strpos($string,'<!--content-->', $offset)+16;
$ende=strpos($string,'<!--EndeAuslesen!-->',$offset)-70;
$tmp_inhalt=substr($string, $anfang, $ende-$anfang);
/*if (is_writable($handle_filedir)) {
fwrite($handle_filedir, '$index->assign("$content",$inhalt);');
}*/
//}
$inhalt = '$index->assign("$content", \''.$tmp_inhalt.');\'';
$beginn = '<?php
require_once("smarty/Smarty.class.php"); // Smarty includen
$index=new Smarty; // Ein neues Smartyobjekt erzeugen
';
fwrite($handle_filedir, utf8_encode($beginn.$title.$inhalt));
//Datei schliessen
fclose($handle_filedir);
// Offset auf Ende setzen
$offset=$ende;
//
}
}
get_dir(".", "");
?>
</body>
</html>[/code]
Gruesse aus Japan
Soeren-san
Hi,
- Die japanischen Zeichen werden mir nicht korrekt in die Datei geschrieben. Wenn ich jedoch mit echo ausgeben lasse, was er mir reinschreiben soll, wird es mir korrekt angezeigt.
Dann hast du ein Problem mit der Zeichenkodierung - ggf. lediglich mit dem erkennen dieser, wenn du die Datei im Editor öffnest.
- Der japanische Teil der Website wird zum Teil gar nicht oder nur zum Teil in die Datei geschrieben.
Das klingt zwar nicht wie Japanisch, enthält für mich aber in etwa ebenso viel verwertbare Informationen, als wenn du es mir auf Japanisch sagen würdest.
- Zwischen den einzelnen Teilen des Quelcodes, in der neuen Datei, haette ich gerne einen Zeilenumbruch. Wenn ich es mit '\r\n' oder nur '\n' versuche wird mir das einfach mit in den Quelcode geschrieben.
Lerne mit Strings in PHP umgehen.
Das diese Sonderzeichennotation innerhalb einfacher Hochkommata nicht ausgewertet wird, ist absolutes Basiswissen.
MfG ChrisB