Versteckte Dateien beim Auslesen von Verzeichnissen ausblenden (PHP)
gepostet vor 17 Jahre, 3 Monate von DrakeL
Bisher lese ich Verzeichnisse mit Hilfe der "dir" Funktionen aus:
$dir = opendir('.');
while($element = readdir($dir))
{
print $element . '
';
}
closedir($dir);
?>
Leider habe ich hier das Problem, dass die versteckte Verzeichnisstruktur von TortoiseSVN mit ausgelesen wird (in jedem Verzeichnis befindet sich ein versteckter ".svn" Ordner).
Von daher suche ich eine Möglichkeit, beim Auslesen von Verzeichnissen versteckte Dateien auslassen zu können, weiß da jemand was?
gepostet vor 17 Jahre, 3 Monate von neit
Guck halt einfach ob die Datei mit einem "." beginnt. Wenn ja, auslassen ...
gepostet vor 17 Jahre, 3 Monate von DrakeL
Ich mach halt gerne alles Allgemein gültig. Und allgemein beginnen nicht alle versteckten Dateien mit einem Punkt
Aber als Lösung für dieses Problem würde es dann sogar funktionieren.
gepostet vor 17 Jahre, 3 Monate von Klaus
Original von DrakeL
Ich mach halt gerne alles Allgemein gültig. Und allgemein beginnen nicht alle versteckten Dateien mit einem Punkt
Auf Linux-Dateisystemen eigentlich schon...
gepostet vor 17 Jahre, 3 Monate von knalli
Auf quasi allen Unixsystem fangen versteckte Dateien mit einem Punkt an - auch auf einem Mac
Wenn du "Support" für Windows-PHP aussen vorläßt, wäre das sicher die einfachste Lösung. Wobei, selbst da sind versteckte Dateien mit einem Punkt beginnend, oder?
gepostet vor 17 Jahre, 3 Monate von Kampfhoernchen
Müssen nicht, können.
gepostet vor 17 Jahre, 3 Monate von Klaus
Unter Windows kollidiert das aber mit der Dateikonvention, wenn eine Datei anscheinend keinen Namen sondern nur eine Erweiterung trägt.
Das Attribut "versteckt" wird irgendwo anders gespeichert, möglicherweise im Header der Datei.
gepostet vor 17 Jahre, 3 Monate von TheUndeadable
> möglicherweise im Header der Datei.
Nein, im dazugehörigen Verzeichniseintrag.
gepostet vor 17 Jahre, 3 Monate von knalli
Original von Kampfhoernchen
Müssen nicht, können.
Ich meinte das anders: Versteckte Dateien selber sind unter Windows immer mit dem zugehörigen Dateieintrag verbunden (Flag Hidden, oder wie auch immer). Aber einige Programme (wie auch svn) nutzen dann doch im Namen selbst die "Pre-Punkt"-Notation (wie nennt das man das eigentlich?); unter Windows wird dann wohl zusätzlich noch "hidden" aktiviert.
Eigentlich müsste Microsoft nur jene "Pre-Punkt"-Dateien systemweit unterstützen (ggf. offiziell unterstützen, inoffiziell gehts ja eh) und diese Dateien ausblenden. Müsste.
gepostet vor 17 Jahre, 3 Monate von TheUndeadable
> Eigentlich müsste Microsoft nur jene "Pre-Punkt"-Dateien systemweit unterstützen
Wäre halt eine Einschränkung. Wieso dürfen Dateien nicht sichtbar sein und einen Prä-Punkt haben (oder umgekehrt)? Diese Prä-Notation sieht für mich wie eine Notlösung aus, weil das Dateisystem selbst keine versteckten Dateien unterstützt.
Dann lieber ein richtiger Flag.
gepostet vor 17 Jahre, 3 Monate von Drezil
ein flag in der inode wäre sicher auch kein problem ...
nur prä-punkt hat eben auch was für sich - da weiss man sofort bescheid und muss nicht erst in irgendwelchen kryptischen seaten schauen ..
unter dos gabs bei dir ne arwhx-spalte, wenn ich mich nicht irre .. (archive, read, write, hidden, execute) geht auch. ist aber in jedem falle geschmacksache
gepostet vor 17 Jahre, 3 Monate von TheUndeadable
> arwhx
FAT: ARHS (Archive, Readonly, Hidden, System)
NTFS: ARHSEC (Archive, Readonly, Hidden, System, Encrypted, Compressed)
Aber wie du schon sagtest: Alles eine Frage der Philosophie. [SIZE=8][Oder soll ich lieber laut gegen UNIX flamen?][/SIZE]
gepostet vor 17 Jahre, 3 Monate von DrakeL
Und wie stehts mit dem eigentlichen Problem dieses Threads? ^^
gepostet vor 17 Jahre, 3 Monate von TheUndeadable
$szResult = exec ( 'attrib ' . $Dateiname );
return $szResult [ 5 ] == 'H';
;-)
Aber ansonsten habe ich keinen Befehl in der PHP-Doku gefunden.
Nachtrag:
Seit Vista gibt es noch 'I': Indiziert.
gepostet vor 17 Jahre, 3 Monate von Agmemon
Original von DrakeL
Und wie stehts mit dem eigentlichen Problem dieses Threads? ^^
Ohne das Du angibst, um welches Betreibsystem es sich handelt, ist das schwer zu beantworten. Willst Du eine Funkion für *NIX Systeme, guckst Du nach dem führenden Punkt. Unter Windows musst Du es so machen, wie Undeadable geschrieben hat. Was allgemein gültiges gibt es nicht.
gepostet vor 17 Jahre, 3 Monate von DrakeL
Kann ich das Betriebssystem in PHP abfragen? In der $_SERVER Variable hab ich zumindest mal nichts gefunden.
Wenn es abhängig vom Betriebssystem eindeutig geht und man dieses Abfragen kann, dann kann man es ja Allgemein gültig machen, das wär ja genau das was ich will.
gepostet vor 17 Jahre, 3 Monate von TheUndeadable
www.depon.net/phpinfo.php _SERVER["SERVER_SOFTWARE"] = Microsoft-IIS/6.0
evtl darüber. Weiß leider nicht, was der Apache unter Win ausgibt.
gepostet vor 17 Jahre, 3 Monate von planetenkiller
und was ist mit:
echo $_ENV["OS"];
?>
gepostet vor 17 Jahre, 3 Monate von DrakeL
Diese Variable kenne ich noch gar nicht. Wird diese irgendwo beschrieben? Aber das würde das Problem natürlich lösen, wenn man irgendwo eine Beschreibung findet, was man bei den verschiedenen Betriebssystemen zurück bekommt.
gepostet vor 17 Jahre, 3 Monate von planetenkiller
Original von DrakeL
wenn man irgendwo eine Beschreibung findet, was man bei den verschiedenen Betriebssystemen zurück bekommt.
Genau das ist das Problem, schau die mal ein paar phpinfo()'s per google an. Entweder ist das $_ENV['OS'] nicht vorhanden oder hat einen anderen namen zb. ostype.
Wie wäre es wenn du das _SERVER["DOCUMENT_ROOT"] prüfst, ob es mit einem Buchstaben oder einem / beginnt. Dann weisst du ja schon ob win oder *nix ist, oder?
gepostet vor 17 Jahre, 3 Monate von Fatal_Error
beim bloßen googlen nach dieser variable hab ich ne andere interessante lösung gefunden:
When you need to get the OS, do not use $_SERVER['OS'] or $_ENV['OS'], better use PHP_OS constant !
if (substr(PHP_OS,0,3)=='WIN') {
// [...]
}
?>
You also have other values such as CYGWIN_NT-5.0, Linux, ... this is the best way to get system's os (anyone on linux can do an "export OS=windows")
gepostet vor 17 Jahre, 3 Monate von knalli
Original von TheUndeadable
> Eigentlich müsste Microsoft nur jene "Pre-Punkt"-Dateien systemweit unterstützen
Wäre halt eine Einschränkung. Wieso dürfen Dateien nicht sichtbar sein und einen Prä-Punkt haben (oder umgekehrt)? Diese Prä-Notation sieht für mich wie eine Notlösung aus, weil das Dateisystem selbst keine versteckten Dateien unterstützt.
Dann lieber ein richtiger Flag.
Im Sinne der Portabilität schon. Ein Dateiname wird beim Kopieren (anderer Dateisystem), beim archivieren (zippen p.ä.) mitübernommen, Flags mitunter nicht.
Alles andere ist Philosophie, Tatsache
gepostet vor 17 Jahre, 3 Monate von Todi42
Und es gibt ja auch noch andere OSs als Unix und Windows :-). Auf OpenVMS gibt es so ein Flag gar nicht.
gepostet vor 17 Jahre, 3 Monate von DrakeL
Soo, für alle die auch eine Lösung suchen, aber keine Lust haben komplett
durchzulesen (Pech für alle, die hier ankommen und alles durchgelesen haben um ne Lösung zu finden ^^) hier mein Bugtrackereintrag zu diesem Problem, korrigiert mich, wenn etwas davon falsch ist :
Da die Möglichkeit eine Datei als versteckt zu markieren Betriebssystemspezifisch ist, muss eine Möglichkeit verwendet werden, das Betriebssystem auszulesen. Hierfür muss die Konstante "PHP_OS" ausgelesen und ausgewertet werden (ich beschränke mich hier auf Unterscheidung Windows und Rest):
if(substr(PHP_OS,0,3)=='WIN')
{
//Windows
} else
{
//Unix System
}
Bei Windows kann dann folgendes verwendet werden:
$szResult = exec ('attrib ' . $Dateiname);
if($szResult [ 5 ] == 'H')
{
//Datei ist versteckt markiert
} else
{
//Datei ist nicht versteckt
}
Bei Unix Systemen benötigt man folgendes Konstrukt:
if(substr($element, 0, 1) == '.')
{
//Datei ist versteckt markiert
} else
{
//Datei ist nicht versteckt
}
gepostet vor 17 Jahre, 3 Monate von TheUndeadable
> exec ('attrib ' . $Dateiname);
Achte evtl darauf, dass $Dateiname nicht 'böse' ist. Also lieber in Anführungszeichen und unter Win können Dateinamen kein Anführungszeichen besitzen.