php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 11-10-2007, 18:12
gen
 Newbie
Links : Onlinestatus : gen ist offline
Registriert seit: Mar 2006
Beiträge: 36
gen ist zur Zeit noch ein unbeschriebenes Blatt
gen eine Nachricht über ICQ schicken
Standard Script zur Auslesung und Umbenennung von Dokumenten

Hallo Leute,

Hier die Ausgangssituation:
Es liegen eine Reihe von Microsoft Word Dokumenten in einem Ordner und mehreren Unterordnern vor. Alle (99%) der Dokumente enthalten ein Prozentzeichen im Dateinamen, welches durch ein „P“ ersetzt werden soll.

Die Funktion sollte sich eben rekursiv durch die Ordnerstruktur arbeiten und bei Bedarf umbenennen.

Ich habe hier folgende Funktion datanamefix geschrieben:
PHP-Code:
 function datanamefix ($RootFolder) {
    global 
$NumObjectsRenamed;
    
$dir dir($RootFolder);
     while(
$ObjectRoot $dir->read() ) {
          
         
$ObjectSplit split("[.]"$ObjectRoot);
     
         
//MS-Word Datei umbenennen
         
if ($ObjectSplit[1] == "doc" && eregi('%'$ObjectSplit[0])) {
             
$NewObjectName str_replace("%""P"$ObjectSplit[0]);
            if(
rename($ObjectRoot$NewObjectName)) { $NumObjectsRenamed++ ; }
            
         }
         
//Auf Unterordner zugreifen
         
if ($ObjectSplit[0] == $ObjectRoot) {
             
$DocumentSubFolder $DocumentRootFolder."/".$ObjectRoot;
             
datanamefix($DocumentSubFolder);
         }
     }
    return 
NumObjectsRenamed;
 } 
Diese wird per include in eine index.php eingebunden:
PHP-Code:
 include("datanamefix.php");
  
// Konfiguration
 
$DocumentRootFolder "demo-folder"//Stammordner
 
$NumObjectsRenamed 0//Ausgangswert
 

 
echo "Es wurden <b>".datanamefix($DocumentRootFolder)."</b> Dateien umbenannt."
Leider erhalte ich folgende Fehlermeldung beim Aufruf:
Zitat:
Fatal error: Call to a member function on a non-object in datanamefix.php on line 11
Zeile 11 enthält folgenden Code:

PHP-Code:
while($ObjectRoot $dir->read() ) { 
Ich kann mit der Fehlermeldung leider nichts anfangen Kann mir jemand helfen?

Viele Grüße,
gen
Mit Zitat antworten
  #2 (permalink)  
Alt 11-10-2007, 18:25
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Bestimmt falscher Pfad!
__________________
Wir werden alle sterben
Mit Zitat antworten
  #3 (permalink)  
Alt 11-10-2007, 18:50
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Dreh mal das error_reporting hoch. In deinem Fall ist es evtl. auch sinnvoller folgendes zu benutzen:
PHP-Code:
$iterator = new RecursiveIteratorIterator ( new RecursiveDirectoryIterator $directory ) );
foreach ( 
$iterator as $path ) {
...

(siehe PHP Standard Programming Library)
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #4 (permalink)  
Alt 11-10-2007, 18:55
BugBite
 Member
Links : Onlinestatus : BugBite ist offline
Registriert seit: May 2006
Beiträge: 299
BugBite ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Bestimmt falscher Pfad!
Schau dir mal die fehlermeldung an!


dir:
Ein pseudo-objektorientierter Mechanismus zum Lesen eines Verzeichnisses
PHP-Code:
class dir {
dir string $directory )
string path
resource handle
string read 
void )
void rewind void )
void close void )

$dir = dir($RootFolder);

so wie das im manual aussieht, kannste die methode read nur
aufrufen wenn du ein objekt instanzierst.
Und wenn man die Fehlermeldung richtig deutet, sieht man auch
das eine eine methode aufgerufen wird obwohl kein objekt existiert

also würde ich meinen dein code sollte so lauten:
PHP-Code:
$dir = new dir($RootFolder); 
sind alles nur vage vermutungen aber probiers doch mal aus
Mit Zitat antworten
  #5 (permalink)  
Alt 11-10-2007, 20:02
gen
 Newbie
Links : Onlinestatus : gen ist offline
Registriert seit: Mar 2006
Beiträge: 36
gen ist zur Zeit noch ein unbeschriebenes Blatt
gen eine Nachricht über ICQ schicken
Standard

Vielen Dank schon einmal für eure Antworten. Der Fehler lag allerdings an etwas völlig anderem (völlig banalem). Beim Aufruf der Rekursion wird ein falscher Pfad mitgegeben, in dem $DocumentRootFolder enthalten sein sollte. Die Variable müsste allerdings $RootFolder heißen und so kam es beim beim 2. Aufrufen der Funktion zur Fehlermeldung auf Grund eines falschen Verzeichnises.

Hier die aktuelle Funktion:
PHP-Code:
 function datanamefix ($RootFolder) {
    global 
$NumObjectsRenamed;
    
$dir dir($RootFolder);
     while(
$ObjectRoot $dir->read() ) {
          
         
$ObjectSplit split("[.]"$ObjectRoot);
     
         
//MS-Word Datei umbenennen
         
if ($ObjectSplit[1] == "txt" && eregi("%"$ObjectSplit[0])) {
             
$NewObjectName str_replace("%""P"$ObjectSplit[0]);
            
$oldDataPath $RootFolder."/".$ObjectRoot;
            
$newDataPath $RootFolder."/".$NewObjectName;
            if(
rename($oldDataPath$newDataPath)) { $NumObjectsRenamed++ ; }
            else { die (
$php_errormsg); }
            
         }
         
//Auf Unterordner zugreifen
         
if ($ObjectSplit[0] == $ObjectRoot) {
             
$DocumentSubFolder $RootFolder."/".$ObjectRoot;
             
datanamefix($DocumentSubFolder);
         }
     }
    return 
$NumObjectsRenamed;
 } 


Edit: Hab die Lösung! Rename muss natürlich die vollständigen Pfade zur Datei haben Funktionierende Funktion ist in diesem Post.

Viele Grüße,
gen

Geändert von gen (11-10-2007 um 20:16 Uhr)
Mit Zitat antworten
  #6 (permalink)  
Alt 11-10-2007, 20:17
Kropff
  Administrator
Links : Onlinestatus : Kropff ist offline
Registriert seit: Mar 2002
Ort: Köln
Beiträge: 11.722
Kropff befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Braucht man best. Rechte um Dateien umzubennen?
ja, ggf.mit mit is_writeable überprüfen und mit chmod sowie umask (0) arbeiten.

gruß
peter
__________________
Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
Meine Seite
Mit Zitat antworten
  #7 (permalink)  
Alt 18-10-2007, 17:00
gen
 Newbie
Links : Onlinestatus : gen ist offline
Registriert seit: Mar 2006
Beiträge: 36
gen ist zur Zeit noch ein unbeschriebenes Blatt
gen eine Nachricht über ICQ schicken
Standard

Hm merke gerade, dass sich das Script nicht wie gewünscht durch die Verzeichnishierarchie arbeitet. Er bennent nur die Dateien im Startverzeichnis um in den Unterordnern passiert nichts.

Leider kann ich keinen Fehler im Quelltext entdeckten, m.M.n. müsste das so funktionieren:
PHP-Code:
 function datanamefix ($RootFolder) {
    global 
$NumObjectsRenamed;
    
$dir dir($RootFolder);
     while(
$ObjectRoot $dir->read() ) {
          
         if(
eregi("."$ObjectRoot)) {
             
$ObjectSplit split("[.]"$ObjectRoot);
             
$endung count($ObjectSplit) - 1;
             
//MS-Word Datei umbenennen
             
if (/*$ObjectSplit[1] == "doc" && */eregi("%"$ObjectSplit[0])) {
                 
$NewObjectName str_replace("%""P"$ObjectSplit[0]);
                
$oldDataPath $RootFolder."/".$ObjectRoot;
                
$newDataPath $RootFolder."/".$NewObjectName.".".$ObjectSplit[$endung];
                if(
rename($oldDataPath$newDataPath)) { $NumObjectsRenamed++ ; }
                else { die (
$php_errormsg); }
            
             }
        }
         
//Auf Unterordner zugreifen
         
elseif(is_dir($RootFolder."/".$ObjectRoot)) {
             
$DocumentSubFolder $RootFolder."/".$ObjectRoot;
             
datanamefix($DocumentSubFolder);
         }
     }
    return 
$NumObjectsRenamed;
 } 
Hoffe jemand kann mir helfen.

Viele Grüße,
gen
Mit Zitat antworten
  #8 (permalink)  
Alt 18-10-2007, 17:51
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Da bekommt man ja Pickel von.....

Aus meiner Wühlkiste:
PHP-Code:
<?php
error_reporting
(E_ALL);
ini_set('display_errors'TRUE); // evtl. hilfreich

function rename_recursive($dir,$ersetzungen,$endung)
{
  foreach(
glob($dir.'/*'.$endung) as $file)
    if(
is_file($file))
    {
      
$temp strtr($file,$ersetzungen);
      if(
$file !== $temprename($file,$temp);
    }
  foreach(
glob($dir.'/*',GLOB_ONLYDIR) as $dir)
    
rename_recursive($dir,$ersetzungen,$endung);
}

// testcode
$ersetzungen        = array();
$ersetzungen['%']   = 'P'// extra für dich eingebaut
$ersetzungen['m_']  = 'M_';
$ersetzungen['i_']  = 'I_';

rename_recursive('./testdaten',$ersetzungen,'.txt')



?>
__________________
Wir werden alle sterben
Mit Zitat antworten
  #9 (permalink)  
Alt 18-10-2007, 22:08
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

PHP-Code:
$replace = array ( '%' => 'P''m_' => 'M_''i_' => 'I_' );
foreach ( new 
RecursiveIteratorIterator (
 new 
RecursiveDirectoryIterator $directory ) ); as $path ) {
   
$temp strtr $path$replace );
   if ( 
$path !== $temp ) {
      
rename $path$temp );
   }

__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #10 (permalink)  
Alt 18-10-2007, 23:12
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

Leider nicht!
Ausserdem tuts das mit PHP4 nicht mehr...

PHP-Code:
<?php
error_reporting
(E_ALL);
ini_set('display_errors'TRUE); // evtl. hilfreich

$replace = array ( '%' => 'P''m_' => 'M_''i_' => 'I_' );

$dir = new RecursiveIteratorIterator
       
(
          new 
RecursiveDirectoryIterator('./testdaten'),
          
RecursiveIteratorIterator::CHILD_FIRST
       
);

foreach (
$dir as $file)
{
   
$path $file->getPathname();
   
$temp strtr($path,$replace);
   if(
$path !== $temprename($path,$temp);
}


?>
__________________
Wir werden alle sterben

Geändert von combie (18-10-2007 um 23:28 Uhr)
Mit Zitat antworten
  #11 (permalink)  
Alt 19-10-2007, 01:31
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Leider nicht! Ausserdem tuts das mit PHP4 nicht mehr...
Bla bla ... - war ja nur ein Beispiel um zu zeigen wie einfach es theoretisch ist. PHP 4 wird bald sowieso nicht mehr supportet von daher interessiert das eigentlich auch keinen
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #12 (permalink)  
Alt 19-10-2007, 09:44
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von tontechniker
Bla bla ... - war ja nur ein Beispiel um zu zeigen wie einfach es theoretisch ist. PHP 4 wird bald sowieso nicht mehr supportet von daher interessiert das eigentlich auch keinen
PHP 4 gehört meiner Meinung nach nur noch auf 5 hoch migriert! Unterstützung von 4 in Projekten halte ich für überflüssig, da Version 5 doch schon einiges mitgebracht hat!
Mit Zitat antworten
  #13 (permalink)  
Alt 19-10-2007, 10:53
combie
 PHP Expert
Links : Onlinestatus : combie ist offline
Registriert seit: May 2006
Beiträge: 3.296
combie wird schon bald berühmt werden
Standard

1. Ich habe keine Ahnung womit ihr euer Geld verdient..
Aber ich wühle viel in alten und uralten Geschichten. Und das Zeug läuft teilweise auf genauso alten Systemen.

2. Wenn Tontechniker schon meint hochmodernen PHP5 Code präsentieren zu müssen, dann soll er wenigstens KORREKTEN Code vorstellen. Code der Parseerrors wirft taugt nix.. Damit verschreckt man Anfänger. Die haben keine Chance, siehe Punkt 3.

3. Die offizielle SPL Doku auf PHP.net ist so beschissen, das ich SPL für kaum einsetzbar halte.

4. Reduziert man mein erstes Beispiel auf nur ein Glob, machts also ebenso primitiv wie Tontechnikers Ansatz. Dann wird man feststellen, dass die Glob Variante auf Linux Rechnern um Größenordnungen fixer ist. Unter Win ist der Unterschied nicht so deutlich.


Mein Resumee:
Wenn es mehrere Lösungen gibt, dann nehme und empfehle ich die Beste.
(Nach meinen Kriterien die Beste!!!)

Glob tuts problemlos mit PHP4 und PHP5
Glob tuts auch noch mit PHP6!! (getestet)
Glob ist performanter (meist).

SPL ist in diesem Fall langsamer.
SPL ist bescheiden dokumentiert.
SPL steht nicht überall zur verfügung.

Macht ihr doch was ihr wollt, verwendet das moderne Zeugs doch. Aber es zu empfehlen, nur weils das gibt und dann noch in dem Wissen, dass bessere Lösungen existieren... naja....
Und wenn hier einer kaputten Code abliefert, muß er sich auch Mecker von mir anhören!!

Ein "bla bla" kann mich dann auch richtig auf die Palme bringen.
Grrr....
__________________
Wir werden alle sterben

Geändert von combie (19-10-2007 um 10:58 Uhr)
Mit Zitat antworten
  #14 (permalink)  
Alt 19-10-2007, 13:02
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Zitat:
Original geschrieben von PHP-Desaster
PHP 4 gehört meiner Meinung nach nur noch auf 5 hoch migriert! Unterstützung von 4 in Projekten halte ich für überflüssig, da Version 5 doch schon einiges mitgebracht hat!
ist ungleich "Nimm SPL"
Mit Zitat antworten
  #15 (permalink)  
Alt 19-10-2007, 14:07
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

1. Noch muss ich kein Geld verdienen, bisher hab ich mich aber auch immer mit einer Lösung für PHP 4 beschäftigt sollte das nötig sein. In diesem wollte ich nur noch einmal ein Alternative aufzeigen.

2. Ok, ich hab getFilename vergessen, deiner Lösung war in diesem Fall auch nicht umbedingt ein Vorbild, ein glob hätte in diesem Fall gereicht.

3. Die offizielle Dokumentation ist im Prinzip nur eine Auflistung von Funktionen, die Dokumentation von helly hilft aber in den meisten Fällen weiter.
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

Top-Side Guestbook

Gästebuch auf Textbasis (kein MySQL nötig) mit Smilies, Ip Sperre (Zeit selbst einstellbar), Spamschutz, Captcha (Code-Eingabe), BB-Code, Hitcounter, Löschfunktion, Editierfunktion, Kommentarfunktion, Kürzung langer Wörter, Seiten- bzw. Blätterfunktion, V

22.10.2018 webmaster10 | Kategorie: PHP/ Gaestebuch
ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script ansehen ebiz-trader 6.0 - Das professionelle PHP Marktplatz Script

Mit unserer Lösungen können Sie nahezu jeden B2B / B2C Marktplatz betreiben den Sie sich vorstellen können. Ganz egal ob Sie einen Automarktplatz, Immobilenportal oder einfach einen Anzeigenmarkt betreiben möchten. Mit ebiz-trader können Sie Ihre Anforder

11.10.2018 Berni | Kategorie: PHP/ Anzeigenmarkt
PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:47 Uhr.