Kann Datei nicht löschen
Urmel
- php
0 Sven Rautenberg0 Urmel
0 Urmel
Ich weiss dieses thema wurde hier und überrall sonst schon zu hauf diskutiert. und ihr könnte mir glauben ich habe jetzt bestimmt schon seit 3 stunden im inet gesurft und bin zu keiner wirklichen einsicht gekommen.
dazu musst vorab gesagt werden, dass ich ein totaler php neuling bin.
also es geht um vollgendes problem:
Ich erstelle mit einem phpscript ein verzeichnis, in dieses verzeichnis schreibe ich mit php eine html datei, zusätzlich wird optional ein bild ebenfalls in dieses verzeichnis kopiert.
und zuguterletzt wird noch ein datei im ascii format (*.txt) in diesem verzeichnis geschrieben.
nun aber zu meinem problem.
Wenn nun eine bestimmte bedingung eintritt so wird das ganze erstelle verzeichnis gelöscht und zwar rekursiv. Dies klappt auch wunderbar, bis ich zur erstellten asciidatei komme, da meckert auf einmal "unlink (...): Permission denied" das seltsame ist nur, dass ich die anderen erstellten files, wie z.B. die htmldatei mit den gleichen rechten erstellt habe wie die asciidatei.
Noch muss dazu gesagt werden, dass ich das verzeichnis, welches ja ebenfalls dynamisch zur laufzeit angelegt wird mit allen benötigten rechten ausgestatt habe. Habe das wie folgt gemacht um mir ganz sicher zu gehen.
*****
umask(0777);
while((!@(mkdir($verzeichnis,0777)))){
...
};
*****
in dieser hinsicht sogar doppelt abgesichert(oder verstehe ich das falsch?) denn einmal durch ein explizites umask die rechte für das verzeichnis gesetzt und dann nochmal als mkdir-argument
soweit so gut,
nun erzeuge ich die htmldatei
*****
umask(0777);
if(!($schreib_html = @(fopen($datei,"w")))) $fehler_arr[]= "\nEs kam zu einem Fehler";
else{
if(flock($schreib_html, 2)){
...
flock($schreib_html, 3)
}
}
soweit so gut, das klappt auch optimal.
nun erzeuge ich haargenau auf dem gleichen wege wie die HTMLdatei erstellt habe, die asciiDatei, und jetzt kommt der clou,
wenn nun die bedingung eintritt welche dafür sorgt das das verzeichnis samt inhalt gelöscht wird und ich vorher die die ascii datei lösche, so löscht er geradewegs alle dateien die sich in dem verzeichnis befinden samt den verzeichnis selbst. genauso wie ich es haben will. Wenn sich nun aber die erstellte asciidatei im verzeichnis befindet, so erhalte ich die schoneinmal gezeigte fehlermeldung "unlink (...): Permission denied".
Bei mir läuft übrigends ein omniHTTPd server mit php 4.3.3
der safemode ist in der php.ini ausgeschaltet.
kennt jemand das problem ??
Wäre dankbar für jeden ratschlag
Danke auch schonmal im vorraus.
Moin!
Noch muss dazu gesagt werden, dass ich das verzeichnis, welches ja ebenfalls dynamisch zur laufzeit angelegt wird mit allen benötigten rechten ausgestatt habe. Habe das wie folgt gemacht um mir ganz sicher zu gehen.
*****
umask(0777);
while((!@(mkdir($verzeichnis,0777)))){
...
};
*****
in dieser hinsicht sogar doppelt abgesichert(oder verstehe ich das falsch?)
Ja, denn du weißt nicht, was umask tut.
umask ist eine LÖSCHMASKE. Alle in umask gesetzten Bits werden bei den Dateirechten GELÖSCHT. Wenn du also umask auf 777 setzt, werden alle Zugriffsrechte GELÖSCHT. Bzw. wird diese Einstellung für neu angelegte Dateien gesetzt. Und das ist nicht das, was du willst.
Im Prinzip mußt du mit umask nicht arbeiten. Gewöhnlicherweise werden neue Dateien so mit Rechten versehen, dass das Skript sie lesen und beschreiben kann.
Die Löscherlaubnis kommt übrigens nicht durch die Dateirechte, sondern durch die Verzeichnisrechte. Du benötigst Schreibrechte für das Verzeichnis, um Dateien löschen und neu anlegen zu können.
Hm, und nochwas: Omnihttpd läuft doch unter Windows, oder? Was machst du dann mit Dateirechten, die für Unix gedacht sind. Kann mir kaum vorstellen, dass du da keine Fehlermeldung erhälst.
- Sven Rautenberg
hmm du scheins natürlich recht zu haben.
also das ganze läuft unter win2000.
Im speziellen habe ich jetzt nochmal extra ein script angelegt welches nur ein verzeichnis erstellt und eine *txt-datei. hierbei
erhalte ich den gleichen fehler.
script schaut wie folgt aus :
<?
mkdir("D:\webserver\Omnicron\HtDocs\cms_archiv\bloed", 0777);
$login_file = fopen("D:\webserver\Omnicron\HtDocs\cms_archiv\bloed\arsch.txt", 'w');
fwrite($login_file,"ich bekomme augenkrebs");
echo "bis hier";
deldir("D:\webserver\Omnicron\HtDocs\cms_archiv\bloed");
function deldir($dir){
$current_dir = opendir($dir);
while($entryname = readdir($current_dir)){
if(is_dir("$dir/$entryname") and ($entryname != "." and $entryname!="..")){
deldir("${dir}/${entryname}");
}elseif($entryname != "." and $entryname!=".."){
unlink("${dir}/${entryname}");
}
}
closedir($current_dir);
rmdir(${dir});
return true;
}
?>
WAS zum teufel läuft hier falsch, abgesehen von diesem wirklich bedusselten windows rechtesystem?????????????????!!
drehe bald wirklich ab, hoffe um schnelle hilfe.
Bin ich den der einzige dem das passiert?
Moin!
script schaut wie folgt aus :
<?
mkdir("D:\webserver\Omnicron\HtDocs\cms_archiv\bloed", 0777);$login_file = fopen("D:\webserver\Omnicron\HtDocs\cms_archiv\bloed\arsch.txt", 'w');
fwrite($login_file,"ich bekomme augenkrebs");
echo "bis hier";deldir("D:\webserver\Omnicron\HtDocs\cms_archiv\bloed");
Du löscht das Verzeichnis, obwohl sich noch eine geöffnete Datei darin befindet. Das ist nicht nett.
- Sven Rautenberg
Och herje, manchmal sieht man den wald vor lauter bäumen nicht mehr.
und so erging es mir, bis ich herausfand dass das dateihandle nicht geschlossen war und somit unlink die datei nicht löschen konnte.
ein einfaches fclose() reichte hierfür aus.
@sven: bedanke mich nochmals herzlich für deine schnelle hilfe. so konnte ich zumindest trotz keiner direkten fehlerlösung trotzdem was lernen ;)