Avatar billede lsskaarup Nybegynder
14. februar 2007 - 15:38 Der er 27 kommentarer og
1 løsning

Unlink virker ikke på alle filer

Jeg er ved at lave en script der indlæser indholdet af en csv-fil udlæst fra Navision ind i vores intranet-system. Men jeg kan ikke helt får unlink til at virke.

Før at gør det lidt lettere har jeg besluttet jeg får at flytte filen til en anden mappe efter indlæsning.

Det virker fint med copy(), men når jeg skal unlinke, så har jeg ikke lov til det (permission denied). Det mærkelige er at det ikke er alle filer jeg får fejlen på. Først der fjerner jeg dem der ikke indeholder noget, altså har en størrelse på 0 byte, og det kan jeg godt, men når det så drejer sig om filer der indeholder lidt, så må jeg ikke.

Jeg har prøvet at give Apache fuldt adgang til mappen, men det hjælp heller ikke, og der ser ikke ud til at være nogle sikkerhedsmæssige forskelle på filerne.

Nogle der kan hjælpe med det?
Avatar billede michael_stim Ekspert
14. februar 2007 - 15:42 #1
Du skla chmod'e den til 777
Avatar billede intenz Novice
14. februar 2007 - 15:43 #2
Avatar billede lsskaarup Nybegynder
14. februar 2007 - 15:44 #3
Det sker der ikke noget ved.

Jeg har prøvet chmod($fil, 0777);

hvor $fil er stien, men jeg har stadig ikke adgang.

Glemte at sige, det køre på en Windows server. Betyder det noget for chmod, den er vel mest til linux, ikke?
Avatar billede lsskaarup Nybegynder
14. februar 2007 - 15:45 #4
chmod er vel også mest via ftp?
Avatar billede michael_stim Ekspert
14. februar 2007 - 15:45 #5
er $fil både stien og filnavnet?
Avatar billede michael_stim Ekspert
14. februar 2007 - 15:46 #6
Nej chmod er rettigheder. Så er det ligemeget om det er FTP eller hvad det er.
Avatar billede michael_stim Ekspert
14. februar 2007 - 15:47 #7
Efter du har kopieret kører du en chmod.
chmod('sti/filnavn', 0777);
Avatar billede lsskaarup Nybegynder
14. februar 2007 - 15:48 #8
Ja, $fil er både sti og navn.

Det ser indtil videre sådan ud:

$nyindlasetfil = $nydir.$file;
copy($fil, $nyindlaestfil);
unlink($fil);
}

Filen bliver godt nok kopieret til den nye mappe, det fungere fint nok.
Avatar billede lsskaarup Nybegynder
14. februar 2007 - 15:50 #9
Jeg ville lige tjekke om chmod returnere true eller false, den kommer godt nok med true.
$nyindlasetfil = $nydir.$file;
copy($fil, $nyindlaestfil);
if (chmod($fil, 0777){
    echo "dsfdg dg drf gdfg df";
}
unlink($fil);
}
Avatar billede michael_stim Ekspert
14. februar 2007 - 15:52 #10
Men $fil er jo den gamle fil. Er det den du vil have slettet?
Avatar billede lsskaarup Nybegynder
14. februar 2007 - 15:58 #11
Ja.

Jeg har en mappe -> Navi-TOSS

Her i bliver de udlæst filer lagt.

Først skræller jeg de filer fra, som ikke høre hjemme i dette system. Kopier dem til en mappe Navi-TOSS og slette originalen. Hvilket jeg godt kan når de er på 0 byte. ?-0

Derefter går jeg så ind og læser i de tilbageblivende og ligger deres info i min DB, laver en kopi af dem i en anden mappe under Navi-TOSS. Til sidste skal de originale her også slette, men det må jeg så pludselig ikke...
Avatar billede michael_stim Ekspert
14. februar 2007 - 16:00 #12
Men de skal chmod'es når de bliver lagt i mappen. Prøv at se hvilken værdi de har.
Avatar billede lsskaarup Nybegynder
14. februar 2007 - 16:04 #13
Hvordan ser jeg det og hvilke filer snakker du om her, kopierne eller originalerne?
Avatar billede michael_stim Ekspert
14. februar 2007 - 16:08 #14
Med et FTP-program eller lign. De filer der skal fjernes.
Avatar billede lsskaarup Nybegynder
14. februar 2007 - 16:11 #15
Den eneste forskel jeg kan se på serveren er ejeren af filerne, men når der er givet fuld rettighed til apache, så burde det da ikke betyde noget.
Avatar billede michael_stim Ekspert
14. februar 2007 - 16:12 #16
Nej, men det er ikke sikkert du får lov til at chmod'e ;o)
Avatar billede lsskaarup Nybegynder
14. februar 2007 - 16:13 #17
Bare så vi ikke snakker helt forbi hinanden, for jeg tror ikke vi helt er på bølgelængde ;-)

Systemet ligger ikke på en webserver, men en lokal terminal-server, som jeg også sidder og udvikler på. Mappen som filerne ligger i, er en anden lokal server, nemlig vores fil/print server.
Avatar billede lsskaarup Nybegynder
14. februar 2007 - 16:14 #18
Hvis jeg ikke får lov til at chmod'e, hvordan kan det så returnere true?
Avatar billede michael_stim Ekspert
14. februar 2007 - 16:14 #19
Derfor skal de chmod'es af en der har tilladelse. Ejeren eller root eller en trdje med rettigheder.
Avatar billede michael_stim Ekspert
14. februar 2007 - 16:17 #20
Og når filerne bliver lagt på fil/print-serveren, kan du så ikke sørge for at de får læse/skrive/modify rettigheder.
Avatar billede lsskaarup Nybegynder
14. februar 2007 - 16:20 #21
Jamen, Apache har fuld rettighed til mappen Navi-TOSS, hvor filerne ligger i, og de nedarver automatisk rettighederne. Derfor er det også kune ejeren der er forskellen.
Avatar billede gentlebug Nybegynder
14. februar 2007 - 17:20 #22
Er du sikker på de nedarver rettighederne automatisk?, min erfaring har vist at rettighederne ikke nedarves.
Avatar billede lsskaarup Nybegynder
15. februar 2007 - 08:26 #23
Øh, kigger jeg på mappen og en af filerne, så viser Windows ingen forskel i sikkerhedsindstillingerne, men jeg kan da godt prøve at fjerne Apache på hovedmappen, og så ligge den på nogle af de enkelte filer.
Avatar billede lsskaarup Nybegynder
15. februar 2007 - 08:28 #24
Nej, der gør heller ingen forskel.
Avatar billede lsskaarup Nybegynder
15. februar 2007 - 13:49 #25
Hold kæft hvor dum kan man være, jeg har nu fundet fejlen, men skal nok have lidt hjælp til at løse den.

Fejlen er fordi, jeg først læser filen og ikke lukker den inden jeg vil slette den.

Problemet er at i filen ligger der et ordrenummer, og det er dette ordrenr. som der skal styre hvad der skal ske med indholdet.

Jeg skitser lige situationen op, og kommer med mig kode bagefter.

Ordreudtræk fra Navision bliver lagt i en semikolonseperaret fil for hver ordre. Dette sker når ordren ændre status i Navision.

Indholdet kan f.eks. ser sådanne ud:
*60000*;*12-02-07*
(ordrenr ; dato for statusændring)

I mit system skal jeg kun have de ordre ind, der har et ordrenr der er 40000 <= nr < 60000.

Det vil sige at alle der ligger uden for dette spektrum skal jeg ikke bruge til noget.
Avatar billede lsskaarup Nybegynder
15. februar 2007 - 14:12 #26
Problemet er lidt hvor skal jeg bruge fclose() og unlink() i forhold til filerne, og uden at systemet bliver langsomt af det.

<?php

  // Lars Sørensen, www.larsskaarup.dk, Januar 2007
  // We need to load data from Navision exported to a plain csv-file
  // This data will be put in the database accordingly to it's order-number.
    //require('system/global_defs.php');
    //include('system/date.php'); 

  function indlaes() {

    $dir = "//srv-fil1/DS Spærsalg/Navi-TOSS/test/";
    $nydir = "//srv-fil1/DS Spærsalg/Navi-TOSS/test/indlaeste/";
    $nytomdir = "//srv-fil1/DS Spærsalg/Navi-TOSS/test/tomme/";

    if ($handle = opendir($dir)) {
//          echo "Directory handle: $handle<br>";
  //         echo "Files:<br>";

          /* Dette er den korrekte metode til at gå igennem en mappe */
          while (false !== ($file = readdir($handle))) {
              if ($file != "." && $file != ".." && $file != "indlaeste" && $file != "backup" && $file != "tomme") {
                //For at komme af med tomme filer flytter vi dem til mappe tomme
                $fil = $dir . $file;
                if (filesize($fil) < 1) {
                    $nytomfil = $nytomdir.$file;
                    copy($fil, $nytomfil);
                    unlink($fil);
                }

                //Vi fjerner lige dem der ikke står noget i
                if (filesize($fil) > 0) {
                          //echo $file ."<br> ";
                    $indlaes = fopen($fil, 'w');

                    while (!feof($indlaes)) {
                        $filen = fgetcsv($indlaes, 50, ";");
                        $filen[0]." ". $filen[1]."<br>";

                        //Første forekomst af *
                        $pos1 = strpos($filen[0], '*');
                        //echo"<br>";
                        //Sidste forekomst af *
                        $pos2 = strrpos($filen[0], '*');

                        //Første forekomst af *
                        $pos3 = strpos($filen[1], '*');
                        //Sidste forekomst af *
                        $pos4 = strrpos($filen[1], '*');

                        $ordre = substr($filen[0], $pos1+1, $pos2-1);
                        $leveret = substr($filen[1], $pos3+1, $pos4-1);

                        //Fjerner sager der ikke hører til i TOSS, vi hardcoder lige grænserne ind her
                        if ($ordre < 40000){//Enten gamle sager eller Flexhals sager, første spærsalgs sag er 40000
                            $nytomfil = $nytomdir.$file;
echo $nytomfil;
//fclose($indlaes);
                            copy($fil, $nytomfil);
//                            unlink($fil);//den sletter ikke?
                        }
/*
                        if ($ordre > 59999){//Entreprise sager, første Entreprise sag er 60000
                            $nytomfil = $nytomdir.$file;
//fclose($indlaes);
                            copy($fil, $nytomfil);
                            unlink($fil);
                        }
*/
/*
                        if ($leveret != ""){
                            //Er ikke sikret for år 2100 problemet, men det går nu nok... ;-)
                            $aarstal = strrpos($leveret, '-');
                            $nyaar = "20".substr($leveret, $aarstal+1, 2);
                            $leveret = substr($leveret, 0, $aarstal)."-".$nyaar;
                            //echo "<br>";
                        }

*/

                        if ($ordre > 40000 || $ordre < 59999) {
                            echo "dgdf";
                        /*
                            $query = "SELECT id, MAX(rev) AS rev FROM ordre
                                WHERE ordre = '".$ordre."' GROUP BY ordre";

                            $sql = mysql_query($query) or die(mysql_error());
                            $sql = mysql_fetch_array($sql);

                            echo mysql_query('UPDATE ordre5 SET r549 = 1, r549a = '.$leveret.' WHERE tilbudsnummer='.$sql[id].'') or die(mysql_error());                           
                        */
/*                            $nyindlaestfil = $nydir.$file;

                            copy($fil, $nyindlaestfil);

                            //unlink($fil);
*/                        }
echo "<br>";

                    }
                    fclose($indlaes);
                    unlink($fil);
                }
                  }
          }
          closedir($handle);
    }
}
?>
Avatar billede lsskaarup Nybegynder
15. februar 2007 - 15:35 #27
Nå, jeg har nu selv løst problemet med fclose og unlink
Avatar billede lsskaarup Nybegynder
16. februar 2007 - 13:28 #28
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester