Jó napot, kedves olvasók. Ma egy könyvtár törléséről szeretnék beszélni PHP-ben. Úgy tűnik, hogy a művelet nem bonyolult, de van néhány árnyalat. Nézzük meg ennek módjait.
A PHP-nek van erre egy funkciója. rmdir(). Argumentumként használja a törölni kívánt könyvtár elérési útját. Azonban, a könyvtárnak üresnek kell lennie a fő feltétel (kivéve, hogy a webszervert futtató felhasználónak írási hozzáféréssel kell rendelkeznie a címtárhoz). Ha fájlok kerülnek a könyvtárba, hibaüzenetet kapunk a függvény meghívásakor. Ennek megfelelően arra a következtetésre jutunk, hogy a függvény használata előtt a könyvtár rmdir() először meg kell tisztítani.
A neten ajánlatos egy függvényt írni, amely argumentumként átadja annak a könyvtárnak az elérési útját, amelyet törölnünk kell. A függvény törzsében meg kell szervezni egy listát a könyvtár tartalmáról, amelyen belül ellenőrizni kell, hogy a fájl könyvtár-e. Ha a fájl egy könyvtár, akkor ezzel a feltétellel a függvény meghívja magát. Ez a beágyazott könyvtárak megtisztításához szükséges, és a beágyazás minden szintjén működik. Ellenkező esetben a funkció a fájlra kerül alkalmazásra unlink()- egy fájl törlésére szolgál. Az ellenőrzésen kívül az utolsó lépés a könyvtár eltávolítása.
Megvalósítási példa:
Függvény recursiveRemoveDir($dir) ( $includes = glob($dir."/*"); foreach ($includes as $include) ( if(is_dir($include)) ( recursiveRemoveDir($include); ) else ( unlink( $include); ) ) rmdir($dir); ) //A tmp könyvtár eltávolítása az aktuális könyvtárból recursiveRemoveDir("tmp");
Mik a problémák ezzel a kóddal?
Egyszerű esetekben az összes mellékletet tartalmazó könyvtár törlődik. De tegyük fel, hogy van egy rejtett fájl a könyvtárunkban, amely ponttal kezdődik, például .htaccess. Funkció glob() egy UNIX glob helyettesítő, amely alapértelmezés szerint nem tartalmaz rejtett fájlokat (DOTFILES). Például, ha egy nix terminálhoz lépünk és bash-t használunk, akkor ugyanazzal a problémával fogunk találkozni (a globon belüli rejtett fájlokról beszélünk). A probléma megoldására a bash-ban van egy parancs shopt -s dotglob- lehetővé teszi a glob helyettesítését rejtett fájlok. PHP-ben ez egy további paraméter hozzáadásával megoldható GLOB_BRACE Mert glob()és a minta kiterjesztése a függvény első paraméteréből.
$includes = glob("tmp/(,.)*", GLOB_BRACE);
És van itt egy probléma is - egy végtelen hurokkal fogunk találkozni, mivel a tömb értékeket fog tartalmazni. és.. - amely rendszerszinten az aktuális és a szülőkönyvtár. Egy végtelen ciklushoz fogunk jutni (és nem az összes szülőkönyvtár törléséhez), mert. a rendezés keretein belül alapértelmezés szerint a generált tömbben lesz az első .. - azaz minden alkalommal ugyanabba a könyvtárba fogunk hozzáférni. A probléma megoldásához alkossunk egy tömböt ezekből a rendszerkönyvtárakból, és ciklusban töröljük ki az indexeiket a főtömbből. Felmerül a szimbolikus kapcsolatok kérdése is. Tegyük fel, hogy a törölni kívánt könyvtár egy másik könyvtárra mutató hivatkozást tartalmaz, amelynek tartalmának törlése egyáltalán nem érdekel bennünket. A probléma megoldásához a rekurzió létrehozása előtt meg kell szervezni annak ellenőrzését, hogy az entitás nem hivatkozás.
Ennek eredményeként a függvény a következő formát ölti:
Függvény recursiveRemoveDir($dir) ( $includes = glob($dir."/(,.)*", GLOB_BRACE); $systemDots = preg_grep("/\.+$/", $includes); foreach ($systemDots as $index => $pont) ( unset($includes[$index]); ) foreach ($includes as $include) ( if(is_dir($include) && !is_link($include)) ( recursiveRemoveDir($include); ) else ( unlink($include); ) ) rmdir($dir); ) //A tmp könyvtár eltávolítása az aktuális könyvtárból recursiveRemoveDir("tmp");
A kód működik, de valójában egyszerűbbé is lehetett volna tenni. A PHP-ben van egy FilesystemIterator osztály, amely alapértelmezés szerint már rendelkezik a szükséges beállításokkal. Annak a könyvtárnak az elérési útja, amelynek listázására szükségünk van, átadjuk a konstruktornak. Csak egy objektumot kell létrehoznunk.
Függvény recursiveRemoveDir($dir) ( $includes = new FilesystemIterator($dir); foreach ($includes as $include) ( if(is_dir($include) && !is_link($include)) ( recursiveRemoveDir($include); ) else ( unlink($include); ) ) rmdir($dir); ) //A tmp könyvtár eltávolítása az aktuális könyvtárból recursiveRemoveDir("tmp");
Befejezésül még egyet szeretnék kiemelni gyors út. Használatának helyessége nagyon kétséges - küldjön egy parancsot, amelyet SHELL-ben kell végrehajtani.
System("rm -rf tmp");
Felhívom a figyelmet a magas memóriafogyasztásra és arra, hogy a rendszergazdák biztonsági okokból gyakran megtiltják az ilyen funkciók használatát a szerveren.
Címkék: php, rmdir, glob, recursion
Az ajánlások segítenek törölje a mappát teljesen a parancssoron keresztül. A cikkben a DEL parancsot használták, amelyet kifejezetten fájlokhoz terveztek. Mappák esetén az RD vagy RMDIR parancsok érvényesek.
A cél eléréséhez,. Írja be az RD /? és röviden ismerkedjen meg a parancs jellemzőivel és paramétereivel. Itt csak 2 lehetőség látható:
BAN BEN Általános nézet a szerkezet így néz ki:
RD vagy RMDIR /s/q „a mappa teljes elérési útja”
Megjegyzés: a terv alkalmazásakor a katalógus és annak tartalma teljesen törlődik a számítógépről, és nem találja a kukában. A biztonság kedvéért csináld biztonsági mentés mappákat.
A számítógépemen létrehoztam egy "cmd" nevű könyvtárat, és bemásoltam néhány objektumot. Ezután írja be a következő parancsot a parancssorba:
RD /s "c:\cmd"
Ezután megnyomtam az Entert és az Y billentyűt, mivel a cmd a törlés megerősítését kérte.
A C meghajtót ellenőrizve nem találtam a könyvtárat. Ezután létrehoztam egy "delete" nevű mappát, és 5 fájlt is másoltam, de amikor beírtam a parancsot, eltávolítottam a / s előtagot. Így alakult:
RMDIR "c:\delete"
Az Enter megnyomása után a törlés nem történt meg, hanem be parancs sor Kaptam egy üzenetet, hogy a mappa nem üres. Következtetés, a /s opció nélkül csak egy üres mappát törölhet, ezért ennek az előtagnak a használata gyakorlatilag haszontalan.
Ha túl lusta beírni a megerősítő betűt (Y vagy N), akkor a következő konstrukció az Ön számára készült. A /q előtagot fentebb említettük, ő az, aki eltávolítja a bosszantó betűbevitelt (a bizonyítékot lásd a képernyőn).
Csapat RMDIR szinonimája van RDés a fájl könyvtárainak törlésére szolgál Windows rendszerek.Parancssori formátum:
RMDIR [meghajtó:]útvonal
RD [meghajtó:] elérési út
Parancssori lehetőségek:
/S- Egy könyvtárfa törlése, azaz nem csak a megadott könyvtár, hanem az abban található összes fájl és alkönyvtár törlése is.
/Q- Kapcsolja ki a megerősítést kérő üzenetet, ha egy kulcs segítségével töröl egy címtárfát /S.
Parancshasználati példák RD (RMDIR)
Csapat RD nem támogatja a fájl- és alkönyvtár-elnevezési mintákat. Tehát például megpróbálja végrehajtani a parancsot R C:\Felhasználók\*.*, hibaüzenettel végződik a könyvtár nevében. Azonban több könyvtárút is megadható paraméterként:
RD C:\Mydocs C:\Myprogs- törölje a C:\Mydocs és C:\Myprogs mappák tartalmát.
RD C:\docs- törölje a C:\docs mappát. Ha a paraméter /S nincs beállítva, akkor a törölni kívánt mappa C:\docsüresnek kell lennie.
RD /S /Q C:\Docs- a C:\Docs mappa és az összes almappája törlése megerősítés kérése nélkül.
Az RD parancs megvalósítási jellemzője paraméterrel /S nem csak az alkönyvtárak törlődnek, hanem maga a C:\Docs könyvtár, még akkor is, ha fájlok vannak, és nem almappák. Ezért, ha csak a könyvtár tartalmát szeretné törölni (amikor a könyvtárat üressé szeretné tenni, és nem teljesen törölni), használhatja a következő trükköt - tegye aktuálissá a törölni kívánt könyvtárat, és futtassa a parancsot RD tartalmával kapcsolatban:
CD "My Folder"
RD /s/q "Saját mappám"
A szóközöket tartalmazó könyvtárnév a következő dupla idézőjelek. Mivel a CD parancs a törlendő könyvtárat tette aktuálissá, törlése nem történik meg, és a kulcs /S törli a "My Folder" könyvtár összes alkönyvtárát és fájlját
Az alábbiakban a batch file törli az üres mappákat az érték által megadott ideiglenes fájlok könyvtárában környezeti változó TEMP. A törölt mappák listája a c:\tempfoldersempty.txt fájlba kerül
FOR /D %%i in (*) do (
RMDIR /Q %%~i && visszhang %%~i >> c:\tempfoldersempty.txt
Csapat MKDIR-ra használják hozzon létre egy könyvtárat vagy alkönyvtárat. A parancs szintaxisa a következő: MKDIR[meghajtó:]útvonal. Amint a parancs szintaxisából látható, a "path" paraméter szükséges. Ez a paraméter adja meg a létrehozandó könyvtár nevét.
Például hozzunk létre egy „MyFolder” mappát a „C” meghajtón: mkdir MyFolder
Most vessen egy pillantást a "C" meghajtóra. Ha mindent helyesen csinált, a "MyFolder" mappa megjelenik a gyökérkönyvtárban. BAN BEN ez az eset létrehoztunk egy mappát az aktuális könyvtárban. Most hozzunk létre egy "MyFolder1" mappát a "D" meghajtón: mkdir d:\MyFolder
Most a "D" meghajtón van egy "MyFolder1" mappa
Ha szükséges egy alkönyvtár létrehozása, akkor ugyanazokat a parancsokat használja, megadva az összes alkönyvtárat.
Például hozzunk létre egy "world" mappát, amely a "hello" mappában található, ami viszont a "C" meghajtón található: mkdir hello\world
Ha most a "C" meghajtóra lépsz, ott a "hello" mappát fogod látni, ebben pedig a "világ" mappát. Ily módon alkönyvtárakat hozhat létre, amelyek egymásba ágyazási szintjét csak a merevlemez-terület korlátozza.
Az MKDIR parancs nem fog működni, ha olyan könyvtárat próbál létrehozni, amely már létezik a kiválasztott könyvtárban.
Például hozzunk létre egy másik mappát a „D” meghajtón „MyFolder1” néven.
Csapat RMDIR könyvtárat vagy alkönyvtárat töröl. Parancs szintaxisa: RMDIR[Q][meghajtó:]útvonal.
Például töröljük a korábban létrehozott "MyFolder1" mappát a "D" meghajtóról: rmdir d:\MyFolder1
Az RMDIR parancs meghiúsul, ha a törlendő könyvtár más könyvtárakat vagy fájlokat is tartalmaz.
Például töröljük a "hello" mappát a "C" meghajtóról (ha emlékszel, ez a mappa egy másik "világ" mappát tartalmaz): rmdir hello
Egy könyvtár törléséhez az összes alkönyvtárral és fájllal együtt használja kulcsok vagy /Q
A /S kapcsoló használatakor az RMDIR parancs eltávolítja a könyvtárat annak teljes tartalmával együtt. Törléskor a törlést megerősítő üzenet jelenik meg a képernyőn. rmdir /S hello
Egy üzenet jelenik meg a képernyőn. Ha megnyomja az "y" gombot, a "hello" mappa az összes tartalommal együtt törlődik.
A /Q opció letiltja a nem üres könyvtár törlésére vonatkozó felszólítást: rmdir /S /Q hello
Kérjük, vegye figyelembe, hogy ebben az esetben 2 billentyűt használunk egyszerre egy parancsban. A /S kapcsoló lehetővé teszi a könyvtár és annak teljes tartalmának törlését, a /Q kapcsoló pedig letiltja a törlés megerősítését kérő üzenetet.
Az MKDIR parancs MD-ként írható. Mindkét parancs hasonló egymáshoz, és az angol nyelvből származó rövidítések. "make directory" - hozzon létre egy könyvtárat.
Az RMDIR parancs RD-ként írható. Mindkét parancs hasonló egymáshoz, és az angol nyelvből származó rövidítések. "könyvtár eltávolítása" - könyvtár eltávolítása.
Fájlok törlése Linux alatt- olyan feladat, amely nem okoz nehézséget tapasztalt felhasználók. Cikkünk inkább a kezdőkre összpontosít. Ebben láthatja, hogyan törölhet fájlokat a terminálon keresztül, és milyen parancsokat a legjobb használni ehhez.
Miért jobb a konzolról törölni a fájlokat? Az a tény, hogy ez számos előnnyel és nagyobb rugalmassággal jár. Például egy speciális paranccsal egyszerűen és teljesen törölhet egy fájlt merevlemez a gyógyulás lehetősége nélkül. Vagy egyetlen paranccsal és bizonyos karakterek, feltételek vagy reguláris kifejezések használatával törölhet több száz felesleges fájlt egy bizonyos feltételeknek megfelelő könyvtárból vagy alkönyvtárakból.
A Linux rendelkezik egy szabványos rm segédprogrammal a fájlok törlésére. Ahogy az lenni szokott szabványos közművek, van egy bizonyos gondolat az rm névben. Esetünkben az angol Remove - delete szó rövidítéséről beszélünk.
Tehát egyetlen fájl törléséhez az rm parancsot használjuk, amelyet a fájlunk neve követ:
Ha a fájlunk nem az aktuális munkakönyvtárban található, meg kell adnunk a hely elérési útját:
Rm /home/user/filename
Előfordul, hogy a fájl írásvédett. Ezután meg kell erősítenünk a parancsot. Egy fájl törléséhez ebben a helyzetben egyszerűen írja be yés nyomja meg az Entert.
rm: eltávolítja az írásvédett normál üres fájlt "fájlnév"?
Ha Linuxban egyszerre több fájlt szeretnénk törölni, akkor ez sem probléma: az rm parancsot használjuk, majd szóközzel elválasztva a fájljaink nevét:
rm fájlnév1 fájlnév2 fájlnév3
Egy másik lehetőség a helyettesítő karakter * és a reguláris kifejezések használata bizonyos fájlokhoz. Például a következő paranccsal könnyen törölhetjük az összes .txt kiterjesztésű fájlt Linuxon:
Az egyes fájlok törlés előtti megerősítéséhez használja a -i kapcsolót:
rm -i fájlnév(ek)
De ha sok fájl van, és határozottan biztos abban, hogy a parancs helyes, és nem akar minden alkalommal válaszolni a rendszer kérdésére, használja az ellenkező -f opciót. Minden fájl feltétel nélkül, azaz további kérdések nélkül törlődik:
rm -f fájlnév(ek)
Ha egy üres könyvtárat szeretne eltávolítani, használja a -d kapcsolót.
Ha törölni szeretnénk egy nem üres könyvtárat és a benne lévő összes fájlt, akkor a következőképpen járjunk el:
Az írásvédelem esetében ismét Linux rendszer megkérdezi a felhasználót, hogy végrehajtja-e a törlést. Ha minden további nélkül el szeretnénk távolítani a fájlokat és a nem üres könyvtárakat, akkor ezt tegyük:
Ha egyszerre több könyvtárat szeretnénk eltávolítani, akkor az rm parancsot használjuk, majd a könyvtárneveket szóközzel elválasztva:
rm -r könyvtárnév1 könyvtárnév2 könyvtárnév3
Egyébként itt használhatjuk a helyettesítő karaktert (*) és reguláris kifejezések A több könyvtárnak megfelelő.
Amint látja, egy fájl törlése Linuxban a terminálon keresztül egyáltalán nem nehéz, így mindenki képes kezelni ezt a műveletet. Ennek során nemcsak meg kell értenie, hogyan kell megfelelően használni az rm parancsot Linuxon, hanem azt is tudnia kell, hogyan kell biztonságosan csinálni.