Harald: Dateien verschieben mit PHP

Hi!

Wie kann ich eine Datei aus einem ordner per PHP in einen anderen verschieben? (beide Ordner haben bei den Zugriffsrechten 777)

Auf www.php.net fand ich leider nur move_uploaded_file und das passt ja nicht :-(

mfg
Harald

    1. Hallo,

      copy()

      Wohl eher rename.

      Gruß,
      Severin

      --
      They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
      -- Benjamin Franklin
      1. Hallo Severin,

        copy()

        Wohl eher rename.

        Wie kommst du denn darauf?

        Gruss
        Wolke

        1. Hallo Wolke.

          Hallo Severin,

          copy()

          Wohl eher rename.

          Wie kommst du denn darauf?

          Wohl weil es dem OP um das *Verschieben* von Dateien ging, wozu man obige Funktion nutzen kann. (Siehe auch das erste Beispiel.)

          Einen schönen Freitag noch.

          Gruß, Mathias

          --
          sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|
          „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“
          [HTML Design Constraints: Logical Markup]
          1. Hallo Matthias.

            Wohl weil es dem OP um das *Verschieben* von Dateien ging, wozu man obige Funktion nutzen kann. (Siehe auch das erste Beispiel.)

            Man lernt nie aus. War mir gar nicht bewusst, habe beim
            Verschieben immer eine copy/unlink Kombi benutzt.

            Danke für den Zaunpfahl.

            Was mich allerdings jetzt interessieren würde,
            inwieweit das sicher ist, bezüglich Script/Schleifenabruch.

            Oder anders, findet hier wirklich ein Verschieben statt?
            oder ist es technisch eine "Copy/Delete in One" Variante?

            Gruss
            Wolke

            1. Hallo,

              Oder anders, findet hier wirklich ein Verschieben statt?
              oder ist es technisch eine "Copy/Delete in One" Variante?

              Siehe mein Posting: Du änderst nur den "Dateinamen".

              Gruß,
              Severin

              --
              They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
              -- Benjamin Franklin
              1. Hallo,

                Siehe mein Posting: Du änderst nur den "Dateinamen".

                Das ist auch der Grund, warum ein Umbennen (auch ausschneiden und einfügen) auf der selben Partition so schnell geht und ein Kopieren sehr lange dauert.

                Gruß,
                Severin

                --
                They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
                -- Benjamin Franklin
                1. Hallo Severin,

                  Siehe mein Posting: Du änderst nur den "Dateinamen".

                  »»

                  Ja deine Erklärung war sehr gut und verständlich.
                  Kenne mich leider gar nicht mit Betriebssystemen und
                  deren interne Datenspeicherung aus.

                  Dann werde ich jetzt mal einige Scripte umschreiben müssen,
                  danke.

                  Gruss
                  Wolke

                2. Hallo nochmal,
                  ich hätte da doch noch eine Frage.

                  Da ja rename logischerweise beim Verschieben
                  viel mehr Sinn macht als copy(), bemerkte ich
                  die bevorzugte Verwendung von copy, gerade
                  bei Uploads. Beispiel

                  Wenn nicht gerade move_uploaded_file() benutzt wird, was
                  natürlich zu bevorzugen wäre.

                  Also die Frage: Gibt es speziell bei Uploads einen berechtigten
                  Grund "copy()" anstatt "rename()" zu nutzen?

                  1. Moin!

                    Also die Frage: Gibt es speziell bei Uploads einen berechtigten
                    Grund "copy()" anstatt "rename()" zu nutzen?

                    move_uploaded_file() prüft ab, ob die betroffene Datei tatsächlich gerade erst hochgeladen wurde. copy() und rename() arbeiten mit allen existierenden Dateien, könnten also bei manipulierten Dateinamen auch Systemdateien an die falschen Orte verfrachten.

                    - Sven Rautenberg

                    --
                    "Love your nation - respect the others."
                    1. Hi,

                      move_uploaded_file() prüft ab, ob die betroffene Datei tatsächlich gerade erst hochgeladen wurde. copy() und rename() arbeiten mit allen existierenden Dateien, könnten also bei manipulierten Dateinamen auch Systemdateien an die falschen Orte verfrachten.

                      Ja das ist soweit klar aber ich meinte:

                      Wenn nicht gerade move_uploaded_file() benutzt wird, was
                      natürlich zu bevorzugen wäre.

                      Also die Frage: Gibt es speziell bei Uploads einen berechtigten
                      Grund "copy()" anstatt "rename()" zu nutzen?

                      Also warum bevorzugen viele copy() beim Upload gegenüber rename()?
                      Gibt es dafür einen trifftigen Grund, den ich beachten sollte?

                      Gruss
                      Wolke

                      1. echo $begrüßung;

                        Also warum bevorzugen viele copy() beim Upload gegenüber rename()?
                        Gibt es dafür einen trifftigen Grund, den ich beachten sollte?

                        Einfach Unwissen bzw. Unerfahrenheit. Sie kennen nicht das mit dem Upload verbundene Sicherheitsrisiko - sprich: die von Sven angesprochene Dateinamensproblematik.

                        Sie "bevorzugen" auch viele andere Sicherheitsrisiken, wie z.B. SQL-Injection. Programme sicher zu gestalten ist aufwendig und benötigt vor allem jede Menge Kenntnisse über die Missbrauchsmöglichkeiten und wirksame Gegenmaßnahmen.

                        echo "$verabschiedung $name";

            2. Hallo,

              Oder anders, findet hier wirklich ein Verschieben statt?
              oder ist es technisch eine "Copy/Delete in One" Variante?

              Weder/noch. Severin hat's zwar sehr anschaulich dargestellt, aber das trifft die physikalische Wahrheit noch nicht ganz. Tatsächlich ist es so, dass bei einem "move" der Verzeichniseintrag, der zur betroffenen Datei gehört, von einem Verzeichnis in das andere verschoben wird. Die Daten selbst bleiben aber wo sie sind, werden nicht auf der Platte verschoben.

              Ciao,
               Martin

              --
              Programmierer (m), seltener auch ~in (w):
              Irdische, i.a. humanoide Lebensform, die in einem komplizierten biochemischen Prozess Kaffee, Cola und Pizza in maschinenlesbaren Programmcode umwandelt.
              P~ bilden gelegentlich mit ihresgleichen kleine Gruppen, sogenannte Communities, sind aber ansonsten meist scheue Einzelgänger.
              P~ sind vorwiegend nachtaktiv und ohne technische Hilfsmittel nur eingeschränkt lebensfähig.
              1. Hallo,

                Tatsächlich ist es so, dass bei einem "move" der Verzeichniseintrag, der zur betroffenen Datei gehört, von einem Verzeichnis in das andere verschoben wird. Die Daten selbst bleiben aber wo sie sind, werden nicht auf der Platte verschoben.

                Was ist eigentlich ein "Verzeichnis"? Ich habe einmal schnell versucht zu googeln aber die Ergebnisse waren eher bescheiden (von "Wie erstelle ich ein Verzeichnis?" bis zu "Linux Verzeichnisstruktur") und wikipedia hat im Moment technische Schwierigkeiten.

                Ich habe mich damit nie sehr genau beschäftigt, und mich einfach mit meiner Erklärung zufrieden gegeben.

                Gruß,
                Severin

                --
                They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
                -- Benjamin Franklin
                1. Hi,

                  Tatsächlich ist es so, dass bei einem "move" der Verzeichniseintrag, der zur betroffenen Datei gehört, von einem Verzeichnis in das andere verschoben wird. Die Daten selbst bleiben aber wo sie sind, werden nicht auf der Platte verschoben.
                  Was ist eigentlich ein "Verzeichnis"?

                  Gute Frage. ;-)
                  Dazu sollte man sich wohl zunächst mal klarmachen, dass ein "Verzeichnis" und eine "Datei" eigentlich fast dasselbe sind, wenn man es mal auf einer niedrigen Abstraktionsebene betrachtet. Anders ausgedrückt: Verzeichnisse sind Dateien, die nur durch ein Flag (Attribut) eine besondere Bedeutung bekommen. Das Betriebssystem "weiß" nun, dass diese Dateien, die wir Verzeichnisse nennen, eine Liste von Einträgen enthält. Jeder dieser Einträge identifiziert dabei eine Datei (bzw. ein weiteres Verzeichnis).

                  Man kann sich das Ganze auch vorstellen wie ein System von Tabellen: Jeder Tabelleneintrag enthält einen Namen, Zeitstempel, Attribute etc. und verweist auf einen Nutzdatenblock (Datei) oder eine weitere Tabelle (Verzeichnis).

                  Ich habe einmal schnell versucht zu googeln aber die Ergebnisse waren eher bescheiden (von "Wie erstelle ich ein Verzeichnis?" bis zu "Linux Verzeichnisstruktur")

                  Kann ich mir vorstellen. Das liegt wohl nicht zuletzt daran, dass das Thema heutzutage kaum noch jemanden so genau interessiert - höchstens ein paar Low-Level-Programmierer, die einen Treiber für ein bestimmtes Dateisystem entwickeln müssen/wollen. Vor zwanzig Jahren hat man solches Insiderwissen noch in Hülle und Fülle in Computerbüchern gefunden.

                  und wikipedia hat im Moment technische Schwierigkeiten.

                  Oh. Ist mir noch gar nicht aufgefallen. *ausprobier* Yo, stimmt. Da stimmt was nicht. ;-)

                  Schönen Abend noch,
                   Martin

                  --
                  Die meisten Menschen werden früher oder später durch Computer ersetzt.
                  Für manche würde aber auch schon ein einfacher Taschenrechner genügen.
        2. Hallo,

          Wie kommst du denn darauf?

          "Verzeichnisse" sind im Prinzip nur Erweiterungen des Dateinamen, die oft nicht angezeigt werden.
          Die Datei "foo.txt" heißt in Wahrheit zum Beispiel "/home/user/foo.txt". Wenn du den Dateinamen jetzt in "/home/user/verzeichnis/foo.txt" änderst "verschiebt" diese Datei.
          Darum heißt die passende PHP-Funktion zum verschieben rename und das Unix Kommando zum umbennenen von Dateien mv (für move).

          Gruß,
          Severin

          --
          They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety.
          -- Benjamin Franklin