Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] ZipArchive: Vorhandene Dateien beim entpacken überschreiben?

Einklappen

Neue Werbung 2019

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

  • [Erledigt] ZipArchive: Vorhandene Dateien beim entpacken überschreiben?

    Moin.

    Arbeite mit meinem Framework an einem PIP (PackageInstallationPlugin), welches die Paketinformationen aus einer package.xml ausliest und das Paket installiert. Funktioniert auch alles soweit.

    Nun soll er auch noch Dateien installieren. Die Dateien werden als files.zip in dem Paket selbst gepackt und vom System auf ../ entpackt (../ ist das Standardverzeichniss vom System, ausgehend aus ./acp).

    Das Entpacken von neuen Dateien aus files.zip funktioniert, wenn er allerdings eine Datei entpacken soll, die bereits existiert, überschreibt er die alte nicht. An den Dateiberechtigungen liegt es nicht; habe per chmod -R 0777 in der Komandozeile alle Dateien global beschreibbar gemacht, trotzdem gleiches Problem

    Fehlermeldungen kommen keine.

    Folgendermaßen wird das Archiv geöffnet:
    PHP-Code:
        public function openArchive() {
            if (
    $this->isOpened) return;

            
    //create new archive object
            
    $this->archive = new ZipArchive();

            
    //open the archive
            
    $this->file $this->archive->open($this->archiveName);

            
    //archive is opened now
            
    $this->isOpened true;
        } 
    Habe btw. auch das setzen von den Flags ZipArchive::CHECKCONS, ZipArchive::OVERWRITE und ZipArchive::EXCL probiert, jedoch ohne Erfolg.

    Hier einige Daten zum System:
    PHP Version: 5.3.0
    System: Ubuntu Netbook Remix 9.10 (läuft auf LAMPP) [Linux darwin 2.6.31-14-generic #48-Ubuntu SMP Fri Oct 16 14:04:26 UTC 2009 i686]
    API: Apache 2.0 Handler
    Registered PHP Streams: https, ftps, compress.zlib, compress.bzip2, php, file, glob, data, http, ftp, phar, zip
    Zip-based phar archives: enabled
    Zip: enabled


    Am System sollte es nicht liegen...

    Gibt es eine Lösung, das vorhandene Dateien beim Entpacken eines ZIP-Archives (per ZipArchive::extractTo()) überschrieben werden?

    Gruß,
    deMaddin

  • #2
    Hast du schon versucht, vor dem speichern der Datei aus dem Archiv eine evtl. alte Datei erst zu löschen?

    Kommentar


    • #3
      Meinst du es so (Anhand eines Beispiels mit ./acp/test.php):
      1. ./acp/test.php auf dem Server (=alte Datei, welche mit der test.php aus dem Archiv überschrieben werden soll) von Hand löschen
      2. files.zip (mit der neueren Version von ./acp/test.php) auf dem Server mit PHP entpacken

      In dem Fall könnte ich es zwar so machen (neue Dateien, welche bisher auf dem Server nicht existieren, lädt er ja auch ohne Probleme beim entpacken hoch), aber damit würde der Sinn des Programmes verfehlt werden... schließlich soll das Paket neue Dateien enthalten, welche die alten überschreiben- und bei der Installation soll man nichts anderes machen müssen, als das Paket (mit der package.xml und den Dateien) auf den Server zu laden und im ACP das Setup zu starten.

      Kommentar


      • #4
        mit per Hand machen meine ich die verwendung von [MAN]unlink[/MAN]

        Du müsstest also eine Liste mit allen im Archiv vorhanden Datein haben, die du im Programm mit dem lokalen Dateisystem vergleichst. Wenn das Script dann feststellt, das es eine Datei schon gibt, die auch im Archiv vorhanden ist, also überschrieben werden musst, kann das Script sie dann vor'm entpacken mit unlink löschen.

        Kommentar


        • #5
          Das habe ich mir auch schon überlegt.
          Die Frage ist: Wie bekomme ich eine Liste der Dateien, die ich per Verwendung von foreach() o.ä. mit den richtigen Unterverzeichnissen einfach auslesen kann?

          Kommentar


          • #6
            lass mich das für dich Googlen
            [COLOR="#F5F5FF"]--[/COLOR]
            [COLOR="Gray"][SIZE="6"][FONT="Georgia"][B]^^ O.O[/B][/FONT] [/SIZE]
            „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
            [URL="http://www.php.de/javascript-ajax-und-mehr/107400-draggable-sorttable-setattribute.html#post788799"][B]Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“[/B][/URL][/COLOR]
            [COLOR="#F5F5FF"]
            --[/COLOR]

            Kommentar


            • #7
              Thx .
              Kannte bereits eine ähnliche Funktion von readdir() (welche auch auf PHP.net bei ZipArchive gezeigt wurde), wusste aber nicht, wie ich die Dateien dann auslesen soll.

              Hier meine Lösung (bzw. die Lösung zusammengefasst in eine Funktion):
              PHP-Code:
                  public function openDir($dir$subdir false) {
                      
              //reset variable- no files have been added to the list yet
                      
              $files = array();

                      
              //add trailing slash
                      
              if ($dir{strlen($dir)-1} != '/') {
                          
              $dir .= '/';
                      }

                      
              //open dir
                      
              if ($handle opendir($dir)) {
                          while ((
              $file readdir($handle)) !== false) {
                              
              //if this file is a dir, open the dir and read the sub files
                              
              if (is_dir($dir.$file)) {
                                  
              //ignore relative directorys "." and ".." (current and parent directory)
                                  
              if ($file != '.' && $file != '..') {
                                      
              //open sub dir
                                      
              foreach ($this->openDir($dir.$filetrue) as $newFile) {
                                          
              //add files from the sub dir with the right path to the file list
                                          
              if (!$subdir) {
                                              
              $files[] = $dir.$file.'/'.$newFile;
                                          }else{
                                              
              $files[] = $newFile;
                                          }
                                      }
                                  }
                              }else{
                                  
              //this is a file- add it to the file list
                                  
              if (!$subdir) {
                                      
              //this is not inserted by a sub file- add the path including the path
                                      
              $files[] = $dir.$file;
                                  }else{
                                      
              //dont add the path, only add the file
                                      
              $files[] = $file;
                                  }
                              }
                          }
                      }

                      
              //return file list with right paths
                      
              return $files;
                  } 

              Kommentar

              Lädt...
              X