Script zur Auslesung und Umbenennung von Dokumenten

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • 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:
    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

  • #2
    Bestimmt falscher Pfad!
    Wir werden alle sterben

    Kommentar


    • #3
      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 | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

      Kommentar


      • #4
        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

        Kommentar


        • #5
          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;
           } 


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

          Viele Grüße,
          gen
          Zuletzt geändert von gen; 11.10.2007, 19:16.

          Kommentar


          • #6
            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

            Kommentar


            • #7
              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

              Kommentar


              • #8
                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

                Kommentar


                • #9
                  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 | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                  Kommentar


                  • #10
                    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);
                    }


                    ?>
                    Zuletzt geändert von combie; 18.10.2007, 22:28.
                    Wir werden alle sterben

                    Kommentar


                    • #11
                      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 | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                      Kommentar


                      • #12
                        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!

                        Kommentar


                        • #13
                          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....
                          Zuletzt geändert von combie; 19.10.2007, 09:58.
                          Wir werden alle sterben

                          Kommentar


                          • #14
                            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"

                            Kommentar


                            • #15
                              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 | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                              Kommentar

                              Lädt...
                              X