
Pfadangabe, Trennung von Verzeichnis und Dateiname
Hi,
ich glaub ich hab da nur ein Denkfehler oder die falsche Funktion. Ich
habe eine Pfadangabe und möchte diese Trennen in Verzeichnis und Dateinamen:
$path = "Verzeichnis/Dateiname.Endung";
....
$directory = "Verzeichnis";
$filename = "Dateiname.Endung";
Bisher nehme ich dafür die Funktion "basename()" für den Dateinamen und
"str_replace()" um aus dem Pfad den Verzeichnissnamen zu bekommen:
$filename = basename($path);
$directory = str_replace('/' . $filename, '', $path);
Allerdings werde ich damit Probleme haben, wenn der Dateiname irgendwo
gleichzeit ein Verzeichnissname im Pfad ist:
$path = "Verzeichnis/Dateiname.Endung/Dateiname.Endung";
Wüsstet Ihr da eine sichere Methode, um die beiden Angaben zu trennen?
Vielleicht noch die Stelle suchen von rechts beginnend und mit
"substr()" dann auftrennen würde mir noch einfallen. Regex wüsste ich
jetzt nicht, ob das hier geeignet für wäre.
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Christoph Herrmann schrieb:
> $path = "Verzeichnis/Dateiname.Endung";
> Bisher nehme ich dafür die Funktion "basename()" für den Dateinamen und
> "str_replace()" um aus dem Pfad den Verzeichnissnamen zu bekommen:
>
> $filename = basename($path);
> $directory = str_replace('/' . $filename, '', $path);
Du suchst dirname(). Das schneidet immer den letzten Teil des Pfads ab.
--
"Faulheit ist die Wurzel allen Fortschritts!"
(Inhalt eines Knallbonbons, 2002)
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Thomas Hamacher schrieb:
> Du suchst dirname(). Das schneidet immer den letzten Teil des Pfads ab.
Genau das hab ich gesucht und vorher beim durchforsten anscheinend
übersehen. :) Danke.
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Christoph Herrmann schrieb:
> Thomas Hamacher schrieb:
>> Du suchst dirname(). Das schneidet immer den letzten Teil des Pfads ab=
=2E
>
> Genau das hab ich gesucht und vorher beim durchforsten anscheinend
> übersehen. :) Danke.
Kann aber auch sein, dass du pathinfo() suchst:
http://de.php.net/manual/en/function.pathinfo.php
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Niels Braczek schrieb:
> Kann aber auch sein, dass du pathinfo() suchst:
> http://de.php.net/manual/en/function.pathinfo.php
Bei mir gibts drei Arten den Konstruktor meiner Dateiklasse zu benutzen:
$filehelper = new FileHelper('Verzeichnis/Dateiname.Endung');
$filehelper = new FileHelper('Verzeichnis', 'Dateiname.Endung');
$filehelper = new FileHelper('Verzeichnis', 'Dateiname', 'Endung');
Intern wird das ganze dann aufgetrennt auf die letzte Version, also
intern habe ich Verzeichnis, Dateiname und Endung getrennt. Wenn ich nur
erste und letzte Möglichkeit hätte wäre Pathinfo das richtige, aber
ansonsten bringt mir das nicht sehr viel.
Meine Lösung (vielleicht braucht es jemand oder hat noch Vorschläge):
public function __construct($directory, $filename = null, $extension =
null)
{
/*
* Wenn der Dateiname nicht uebergeben wurde, dann steht in der
* Variable "$directory" der komplette Pfad mit Dateiname und Endung
*/
if(isset($filename) == false)
{
$filename = basename($directory);
$directory = dirname($directory);
}
/*
* Wenn die Dateiendung nicht mitgegeben wurde, dann steht in der
* Variable "$filename" der Dateiname mit der angehaengten Endung
*/
if(isset($extension) == false)
{
list($filename, $extension) = explode('.', $filename);
}
/*
* Die uebergebenen bzw. zusammen geschnittenen Angaben zur Datei in
* den Membervariablen speichern zur Verarbeitung der Datei
*/
$this->setDirectory($directory);
$this->setFilename($filename);
$this->setExtension($extension);
}
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
On Tue, 15 Jan 2008 14:30:35 +0100 Christoph Herrmann wrote:
> public function __construct($directory, $filename = null, $extension = null)
Weil wir es gerade erst hatten: ein sehr sinnvolles Beispiel fuer
die Vorbelegung von Parametern mit NULL :-)
> if(isset($filename) == false) {
Dass Du gerne "== false" statt "!" verwendest, ist mir bewusst. Aber
warum nuetzt Du hier nicht das IMHO einfacher lesbare
| if (is_null($filename)) {
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Monieren wo noch nie ein Mensch gewesen - Stefan, so geklaut wie die Sehnsucht!
(Sloganizer)
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Stefan Froehlich schrieb:
> On Tue, 15 Jan 2008 14:30:35 +0100 Christoph Herrmann wrote:
>> public function __construct($directory, $filename = null, $extension = null)
>
> Weil wir es gerade erst hatten: ein sehr sinnvolles Beispiel fuer
> die Vorbelegung von Parametern mit NULL :-)
Stimmt. Wobei Überladung hier schöner wäre, weil man dann auch
semantisch korrekte Parameternamen verwenden könnte. Wenn ich nur ein
Parameter übergebe steht da ja nicht mehr das Verzeichnis ($directory)
drin, sondern der komplette Dateipfad.
Aber ansonsten finde ich es recht sinnvoll, da man die Variablen für den
Dateipfad mal getrennt hat, mal komplett zusammen und man mit der Klasse
dann einfach alle Varianten nutzen kann.
>> if(isset($filename) == false) {
>
> Dass Du gerne "== false" statt "!" verwendest, ist mir bewusst. Aber
> warum nuetzt Du hier nicht das IMHO einfacher lesbare
>
> | if (is_null($filename)) {
noch nie bewusst gesehen, dass es dafür auch eine Funktion gibt. Aber
jetzt wo ich es weiß würde ich es trotzdem mit "isset()" machen, einfach
weil es gewohnter ist (zumindest für mich) und weil es (auch zumindest
für mich) logischer erscheint, da ich manchmal etwas machen muss wenn
der Parameter übergeben wurde "if(isset(...))" und manchmal, wie hier
für das Setzen von fehlenden Werten, wenn er nicht übergeben wurde
"if(isset(...) == false)" und ich lieber zwei mal "isset()" nehme statt
zwei verschiedene Funktionen.
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
On Tue, 15 Jan 2008 15:35:30 +0100 Christoph Herrmann wrote:
> >> if(isset($filename) == false) {
[vs.]
> > | if (is_null($filename)) {
> noch nie bewusst gesehen, dass es dafür auch eine Funktion gibt.
Das ist wohl typisch fuer PHP. Ich wundere mich auch immer wieder,
was es nicht noch alles irgendwo gibt.
> Aber jetzt wo ich es weiß würde ich es trotzdem mit "isset()" machen,
> einfach weil es gewohnter ist (zumindest für mich) und weil es (auch
> zumindest für mich) logischer erscheint,
Die Gewohnheit ist sicherlich das staerkste Argument - untrennbar
verbunden damit, dass der bestehende Code ein bestimmtes Schema
aufweist, welches man ja auch nicht ohne Not komplett abaendern
moechte.
Von der Eleganz her spricht fuer is_null() in meinen Augen der
Zusammenhang zwischen dem Wert NULL in der Funktionsdeklaration
und dem Namen der Funktion is_null(). Ich verwende sogar im umgekehrten
Fall eher !is_null() statt isset(), wenn es um Funktionsparameter geht.
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Stück für Stück - ein Meisterstück - Stefan: tratschen, welch mieses Begehren!
(Sloganizer)
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Stefan Froehlich schrieb:
> Das ist wohl typisch fuer PHP. Ich wundere mich auch immer wieder,
> was es nicht noch alles irgendwo gibt.
Ich wunder mich immer wieder, was bei PHP alles fehlt. ^^ Gerade heute
wieder eine Funktion gesucht wie "implode" aber die auch die Schlüssel
berücksichtigt. Gibts scheinbar nicht, daher selbst geschrieben.
Daher von:
$array = array('a' => 'b', 'c' => 'd');
über:
$string = implodeArray($array, ' = ', '; ');
bekommt man:
'a = b; c = d'
Natürlich (auch wenn ich es nirgends brauche) auch das passende Explode
dazu. Aber vielleicht gibts sowas ja in den tieferen Regionen von PHP
schon mal. :)
> Die Gewohnheit ist sicherlich das staerkste Argument - untrennbar
> verbunden damit, dass der bestehende Code ein bestimmtes Schema
> aufweist, welches man ja auch nicht ohne Not komplett abaendern
> moechte.
Das ist bei mir das kleinste Problem. Solang ich noch rein in der
Entwicklung bin läuft öfters mal ein Search/Replace auf alle Dateien. :)
> Von der Eleganz her spricht fuer is_null() in meinen Augen der
> Zusammenhang zwischen dem Wert NULL in der Funktionsdeklaration
> und dem Namen der Funktion is_null(). Ich verwende sogar im umgekehrten
> Fall eher !is_null() statt isset(), wenn es um Funktionsparameter geht.
Stimmt, das würde dafür sprechen. Ich verwende ungern mehrere
verschiedene Funktionen für den selben Zweck. Und da ich spätestens bei
$_GET/$_POST auf "isset()" angewiesen bin (man könnte auch "empty()"
nehmen ich weiß, aber ich nutze lieber die positive Richtung *g*),
erscheint es mir logischer. Ist ja wie vieles in PHP Geschmackssache. :)
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Christoph Herrmann schrieb:
> /*
> * Wenn die Dateiendung nicht mitgegeben wurde, dann steht in der
> * Variable "$filename" der Dateiname mit der angehaengten Endung
> */
> if(isset($extension) == false)
> {
> list($filename, $extension) = explode('.', $filename);
> }
Was passiert, wenn ich
$filehelper = new FileHelper('Verzeichnis', 'foobar.tar.gz');
übergebe .. ;)
MfG Benny
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
benjamin radtke schrieb:
> Was passiert, wenn ich
> $filehelper = new FileHelper('Verzeichnis', 'foobar.tar.gz');
> übergebe .. ;)
Mach es einfach nicht ^^. Aber stimmt, den Fall hab ich nicht bedacht.
Dann sollte ich doch besser die alte Variante nehmen, wo ich mir den
ersten Punkt von rechts suche und die Strings zurechtschneide. :)
Oder mal schauen was "pathinfo()" so hergibt für diesen Fall.
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Christoph Herrmann schrieb:
> Ich wunder mich immer wieder, was bei PHP alles fehlt.
:-(
Wie kommst Du darauf das es eine Sprache gibt die Funktionen für alle
Belange mit sich bringt? Ich kenn keine. PHP zählt eher zu den Sprachen
mit enorm groß ausgebauten Kernfunktionalitäten.
> wieder eine Funktion gesucht wie "implode" aber die auch die Schlüssel
> berücksichtigt. Gibts scheinbar nicht, daher selbst geschrieben.
selbst wenn Da 100 leute nen paar Jahre versuchen würden irgend einen
Bereich "vollständig" mit Funktionen abzudecken würde noch einer daher
kommen und sich beschweren das seine Funktion nicht existiert.
> über:
> $string = implodeArray($array, ' = ', '; ');
>
> bekommt man:
> 'a = b; c = d'
Da kannste ja froh sein das PHP schon so viele array_funktionen mit
bringt die Deine Funktion im Aufbau einfach gestalten.
http_build_query() erzeugt ja was ähnliches, vieleicht gefällt Dir das
bereits
Ansonsten stehen ähnliche Dinge wie immer in den UCN's von implode()
MfG, Ulf
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Ulf Kadner schrieb:
> :-(
>
> Wie kommst Du darauf das es eine Sprache gibt die Funktionen für alle
> Belange mit sich bringt? Ich kenn keine. PHP zählt eher zu den Sprachen
> mit enorm groß ausgebauten Kernfunktionalitäten.
Vor allem da PHP auf die Webanwendung spezialisiert ist, wird man vor
allem in der Sparte auch großflächig unterstützt. Man muss es sich nur
noch so nehmen und verpacken wie man es gerade braucht oder haben will.
> selbst wenn Da 100 leute nen paar Jahre versuchen würden irgend einen
> Bereich "vollständig" mit Funktionen abzudecken würde noch einer daher
> kommen und sich beschweren das seine Funktion nicht existiert.
War ja nicht negativ gemeint die Aussage. ;) Man könnte bestimmt viel
unterstützen, aber in der Regel geht das dann auf Kosten der
Benutzbarkeit oder Flexibilität. Daher lieber etwas weniger unterstützen
und sich den Rest durch einfache Verwendung mehrere Funktionen
zusammenbauen.
> Da kannste ja froh sein das PHP schon so viele array_funktionen mit
> bringt die Deine Funktion im Aufbau einfach gestalten.
Stimmt. Und allein die Tatsache, dass es egal ist ob man ein numerisches
oder assoziatives Array benutzt gefällt mir.
> http_build_query() erzeugt ja was ähnliches, vieleicht gefällt Dir das
> bereits
gefallen ist Geschmackssache. Derzeit brauch ich es nur für die Ausgabe
meines Logsystems, daher im Browser 'a = b
c = d' und für
Logdateien 'a = b\nc = d' und schon da wäre eine solch strenge Ausgabe
sehr ungeschickt. :)
> Ansonsten stehen ähnliche Dinge wie immer in den UCN's von implode()
War ja schnell geschrieben und fällt unter die Kategorie nützlich aber
nicht unbedingt notwendig.
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Christoph Herrmann schrieb:
> benjamin radtke schrieb:
>> Was passiert, wenn ich
>> $filehelper =3D new FileHelper('Verzeichnis', 'foobar.tar.gz');
>> übergebe .. ;)
>
> Mach es einfach nicht ^^. Aber stimmt, den Fall hab ich nicht bedacht. =
> Dann sollte ich doch besser die alte Variante nehmen, wo ich mir den
> ersten Punkt von rechts suche und die Strings zurechtschneide. :)
foobar-1.2.0-stable.tar.gz
Die Position des Punktes sagt genau gar nichts über die "Dateiendung"
aus. Die erkennt man nur, weil man sie kennt.
> Oder mal schauen was "pathinfo()" so hergibt für diesen Fall.
Das wird wahrscheinlich auch nicht anders arbeiten, als du selbst
angedacht hast (rechts vom letzten Punkt).
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Niels Braczek schrieb:
> foobar-1.2.0-stable.tar.gz
>
> Die Position des Punktes sagt genau gar nichts über die "Dateiendung"
> aus. Die erkennt man nur, weil man sie kennt.
>
>> Oder mal schauen was "pathinfo()" so hergibt für diesen Fall.
>
> Das wird wahrscheinlich auch nicht anders arbeiten, als du selbst
> angedacht hast (rechts vom letzten Punkt).
dann wird sich wohl hier keine perfekte Lösung ergeben. Aber was wäre
die optimalste Lösung bzw. die hilfreichste?
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Christoph Herrmann schrieb:
> Niels Braczek schrieb:
>> Das wird wahrscheinlich auch nicht anders arbeiten, als du selbst
>> angedacht hast (rechts vom letzten Punkt).
>
> dann wird sich wohl hier keine perfekte Lösung ergeben. Aber was wä=
re
> die optimalste Lösung bzw. die hilfreichste?
Unterscheide nur zwischen Pfad und Dateinamen. Wenn die Endung mal
relevant sein sollte, weißt du in der Regel auch genau, um welche es
geht und den Dateinamen auf '~.*\.'.preg_quote($ext).'$~' prüfen.
MfG
Niels
--
| http://www.kolleg.de =B7 Das Portal der Kollegs in Deutschland |
| http://www.bsds.de =B7 BSDS Braczek Software- und DatenSysteme |
| Webdesign =B7 Webhosting =B7 e-Commerce =B7 Joomla! Content Management =
|
------------------------------------------------------------ ------
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Niels Braczek schrieb:
> Unterscheide nur zwischen Pfad und Dateinamen. Wenn die Endung mal
> relevant sein sollte, weißt du in der Regel auch genau, um welche es
> geht und den Dateinamen auf '~.*\.'.preg_quote($ext).'$~' prüfen.
da ich nicht so gut mit Regulären Ausdrücken umgehen kann hab ich mir
eine alternative Lösung gemacht:
public function isExtension($extension)
{
return substr($this->getFilename(), strlen($extension) * -1) ==
$extension;
}
Aber die Idee finde ich gut. Ich wüsste derzeit keinen Anwendungsfall
bei welchem man die Dateiendung benötigt in PHP. Von daher hab ich das
mal so umgesetzt. Lieber erstmal gar nicht, als falsch. :)
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
On Tue, 15 Jan 2008 18:02:30 +0100 Christoph Herrmann wrote:
> allein die Tatsache, dass es egal ist ob man ein numerisches
> oder assoziatives Array benutzt gefällt mir.
Manchmal mehr, manchmal weniger. Ich habe da noch einen Fall in
Erinnerung, wo ich ein assoziatives Array durch wiederholtes
array_merge um zusaetzliche Werte erweitert habe. Nachdem ganz
woanders im Code dann einmal der Schluessel auf rein numerische
Werte umgestellt worden ist, ging ploetzlich gar nichts mehr - hat
einige Zeit gedauert, das zu finden, zu fluchen und (in Form einer
eigenen Version von array_merge) zu beheben.
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Stefan - Liebe, die nimmerdar grübelt.
(Sloganizer)
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
Stefan Froehlich schrieb:
> Manchmal mehr, manchmal weniger. Ich habe da noch einen Fall in
> Erinnerung, wo ich ein assoziatives Array durch wiederholtes
> array_merge um zusaetzliche Werte erweitert habe. Nachdem ganz
> woanders im Code dann einmal der Schluessel auf rein numerische
> Werte umgestellt worden ist, ging ploetzlich gar nichts mehr - hat
> einige Zeit gedauert, das zu finden, zu fluchen und (in Form einer
> eigenen Version von array_merge) zu beheben.
Der Feind jedes Entwicklers ist doch die Änderung. :)
In Java würdest überall Compilerfehler bekommen, wenn eine Variable von
Vector auf Hashtable änderst. In PHP ist beides das gleiche von der
Verwendung her und somit muss man selbst an den Stellen, wo man eine
Variable verwendet aufpassen.
Bei einem großzügigen Gebrauch von Datenkapselung lässt sich aber eine
solche Änderung meist lokal handhaben solang man die öffentlichen
Methoden darauf anpasst und deren Schnittstellen nicht änderst.
--
Mit freundlichen Grüßen,
Christoph Herrmann
http://dragonprojects.de/
Re: Pfadangabe, Trennung von Verzeichnis und Dateiname
On Wed, 16 Jan 2008 18:59:13 +0100 Christoph Herrmann wrote:
> > [...] wo ich ein assoziatives Array durch wiederholtes
> > array_merge um zusaetzliche Werte erweitert habe. Nachdem ganz
> > woanders im Code dann einmal der Schluessel auf rein numerische
> > Werte umgestellt worden ist [...]
> In Java würdest überall Compilerfehler bekommen, wenn eine
> Variable von Vector auf Hashtable änderst. In PHP ist beides das
> gleiche von der Verwendung her und somit muss man selbst an den
> Stellen, wo man eine Variable verwendet aufpassen.
Das tueckische daran ist ja, dass ich eigentlich gar nichts
umgestellt hatte, jedenfalls von der Idee her. Aber Hashes mit
ausschliesslich numerischen Keys sind halt nicht vorgesehen.
Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich
Das ist doch mal ein geiziger Gedanke: Stefan!
(Sloganizer)