Windows.  Virus.  Bärbara datorer.  Internet.  Kontor.  Verktyg.  Förare

God dag kära läsare. Idag skulle jag vilja prata om att ta bort en katalog i PHP. Det verkar som att operationen inte är komplicerad, men det finns några nyanser. Låt oss titta på sätt att göra detta.

PHP har en funktion för detta rmdir(). Som ett argument tar den sökvägen till katalogen du vill ta bort. Dock, katalogen måste vara tom- detta är huvudvillkoret (förutom det faktum att användaren från vilken webbservern körs måste ha skrivrättigheter för katalogen). Om filer placeras i katalogen får vi ett felmeddelande när vi anropar funktionen. Följaktligen kommer vi till slutsatsen att katalogen innan du använder funktionen rmdir() måste rengöras först.

Online rekommenderar de att du skriver en funktion som kommer att passera som ett argument vägen till katalogen som vi behöver ta bort. I huvuddelen av funktionen är det nödvändigt att organisera en lista över innehållet i katalogen, inom ramen för vilken en kontroll görs för att avgöra om filen är en katalog. Om filen är en katalog, anropar funktionen sig själv baserat på detta villkor. Detta är nödvändigt för att rensa ut kapslade kataloger, och det kommer att fungera på alla kapslingsnivåer. Annars tillämpas funktionen på filen ta bort länk ()- den är utformad för att radera en fil. Utanför denna kontroll tar vi bort katalogen i det sista steget.

Exempel på implementering:

Funktion recursiveRemoveDir($dir) ( $includes = glob($dir."/*"); foreach ($includes som $include) ( if(is_dir($include)) ( recursiveRemoveDir($include); ) else ( unlink( $include); ) rmdir($dir ) //Ta bort katalogen tmp från den aktuella katalogen recursiveRemoveDir("tmp");
Vilka problem har den här koden?

I enkla fall kommer katalogen med alla bilagor att raderas. Men anta att det i vår katalog finns en dold fil som börjar med en punkt, till exempel, .htaccess. Fungera glob()är en UNIX-globersättning som inte inkluderar dolda filer (DOTFILES) som standard. Till exempel, om vi går till nix-terminalen och använder bash kommer vi att stöta på samma problem (vi pratar om dolda filer inom globs). Det finns ett kommando i bash för att lösa det här problemet: shopt -s dotglob- det tillåter glob-ersättning dolda filer. I PHP kan detta lösas genom att lägga till en extra parameter GLOB_BRACE För glob() och utöka mönstret från den första parametern i funktionen.

$includes = glob("tmp/(,.)*", GLOB_BRACE);
Och här finns det också ett problem - vi kommer att stöta på en oändlig loop, eftersom arrayen kommer att innehålla värden. och.. - som är den aktuella och överordnade katalogen på systemnivå. Vi kommer att sluta med en oändlig loop (och inte ta bort alla överordnade kataloger) eftersom. som en del av standardsorteringen kommer den genererade arrayen först.. - det vill säga varje gång vi kommer åt samma katalog. För att lösa problemet kommer vi att bilda en array från dessa systemkataloger och i en slinga ta bort deras index från huvudarrayen. Det finns också problemet med symboliska länkar. Låt oss säga att katalogen som tas bort innehåller en länk till en annan katalog, vars innehåll vi absolut inte är intresserade av att radera. För att lösa problemet, innan du skapar rekursion, är det nödvändigt att kontrollera att enheten inte är en referens.

Som ett resultat tar funktionen följande form:

Funktion recursiveRemoveDir($dir) ( $includes = glob($dir."/(,.)*", GLOB_BRACE); $systemDots = preg_grep("/\.+$/", $includes); foreach ($systemDots as $index => $dot) ( unset($includes[$index]); ) foreach ($includes som $include) (if(is_dir($include) && !is_link($include)) ( recursiveRemoveDir($include); ) else ( unlink($include); ) ) rmdir($dir) //Ta bort tmp-katalogen från den aktuella katalogen recursiveRemoveDir("tmp");
Koden fungerar, men i själva verket kunde den ha gjorts enklare. I PHP finns en klass FilesystemIterator, som som standard redan har de inställningar vi behöver. Sökvägen till katalogen vars lista vi behöver skickas till konstruktorn. Vi behöver bara skapa ett objekt.

Funktion recursiveRemoveDir($dir) ( $includes = new FilesystemIterator($dir); foreach ($includes som $include) ( if(is_dir($include) && !is_link($include)) ( recursiveRemoveDir($include); ) else ( unlink($include); ) ) rmdir($dir) //Ta bort tmp-katalogen från den aktuella katalogen recursiveRemoveDir("tmp");
Avslutningsvis vill jag notera ytterligare en snabbt sätt. Riktigheten av dess användning är mycket tveksam - skicka kommandot för exekvering till SHELL.

System("rm -rf tmp");
Jag uppmärksammar dig hög förbrukning minne och det faktum att administratörer ofta förbjuder användningen av sådana funktioner på servern av säkerhetsskäl.

Taggar: php, rmdir, glob, rekursion

Rekommendationer hjälper dig ta bort en mapp helt via kommandoraden. I artikeln om användes kommandot DEL, som är avsett specifikt för filer. När det gäller mappar är RD- eller RMDIR-kommandona tillämpliga.

För att nå målet,. Ange RD /? och bekanta dig snabbt med funktionerna och parametrarna för kommandot. Här ser du bara 2 parametrar:

  1. /s - när du använder detta prefix kommer mappen att raderas, liksom alla dess kapslade element. Om din katalog inte är tom och du inte har angett den här parametern kommer ingenting att fungera för dig.
  2. /Q - används vid radering utan bekräftelse.

I allmän syn designen ser ut så här:

RD eller RMDIR /s/q " full väg mappar"

Obs: när du använder designen kommer katalogen och dess innehåll att raderas helt från datorn och du kommer inte att hitta den i papperskorgen. För säkerhets skull, gör det säkerhetskopia mappar.

Ta bort en mapp med eller utan bekräftelse

Jag skapade en katalog på min dator som heter "cmd" och kopierade flera objekt till den. Sedan skrev jag in följande kommando i kommandoraden:

RD /s “c:\cmd”

Sedan tryckte jag på Enter och Y-tangenten eftersom cmd uppmanade mig att bekräfta borttagningen.

Jag kollade C-enheten och hittade ingen katalog. Därefter skapade jag en mapp med namnet "delete" och kopierade även 5 filer, men när jag skrev in kommandot tog jag bort prefixet /s. Det blev så här:

RMDIR “c:\delete”

Efter att ha tryckt på Enter skedde inte raderingen, men kommandoraden Ett meddelande visades att mappen inte är tom. Slutsats, utan parametern /s kan du bara ta bort en tom mapp, därför är det praktiskt taget värdelöst att använda den utan detta prefix.

Om du är för lat för att ange bekräftelsebokstaven (Y eller N), så är följande konstruktion för dig. Prefixet /q nämndes ovan det är det som tar bort det irriterande att skriva bokstäver (se skärmdumpen för bevis).

Team RMDIR har en synonym R.D. och är avsedd för att ta bort filkataloger Windows-system.

Kommandoradsformat:

RMDIR [enhet:]sökväg

RD [drive:]sökväg

Kommandoradsalternativ:

/S- Ta bort ett katalogträd, det vill säga inte bara den angivna katalogen, utan även alla filer och underkataloger som finns i den.

/Q- Inaktivera bekräftelseprompt när du tar bort ett katalogträd med en nyckel /S.

Exempel på användning av kommandot R.D. (RMDIR)

Team R.D. stöder inte fil- och underkatalognamnsmönster. Så, till exempel, att försöka utföra kommandot RD C:\Users\*.*, slutar med ett felmeddelande om katalognamnet. Däremot kan flera katalogsökvägar anges som parametrar:

RD C:\Mydocs C:\Myprogs- radera innehållet i mapparna C:\Mydocs och C:\Myprogs.

RD C:\docs- ta bort mappen C:\docs. Om parametern /S inte har angetts, då mappen som ska raderas C:\docs måste vara tom.

RD /S /Q C:\Docs- ta bort mappen C:\Docs och alla dess undermappar utan att be om bekräftelse.

Funktion för implementeringen av RD-kommandot med en parameter /Sär att inte bara underkataloger kommer att raderas, utan även själva katalogen C:\Docs, även om det fanns filer i den och inte undermappar. Därför, för att bara ta bort innehållet i en katalog (när du vill göra katalogen tom och inte ta bort den helt), kan du använda följande teknik - gör katalogen som ska raderas aktuell och kör kommandot R.D. i förhållande till dess innehåll:

CD "Min mapp"

RD /s/q "Min mapp"

Ett katalognamn som innehåller mellanslag är dubbla citattecken. Eftersom CD-kommandot gjorde katalogen som ska raderas aktuell, kommer den inte att raderas, och nyckeln /S kommer att ta bort alla underkataloger och filer i katalogen "Min mapp".

Nedan är batch-fil raderar tomma mappar i katalogen för temporära filer som definieras av värdet miljövariabel TEMP. Listan över raderade mappar skrivs till en fil med namnet c:\tempfoldersempty.txt

FÖR /D %%i i (*) do (

RMDIR /Q %%~i && echo %%~i >> c:\tempfoldersempty.txt

Team MKDIR används för skapa en katalog eller underkatalog. Kommandot har följande syntax: MKDIR[enhet:]sökväg. Som du kan se från kommandosyntaxen krävs parametern "path". Denna parameter anger namnet på den skapade katalogen.

Låt oss till exempel skapa en mapp "MyFolder" på enhet "C": mkdir MyFolder

Titta nu på enhet "C". Om du gjorde allt korrekt kommer mappen "MyFolder" att visas i rotkatalogen. I i detta fall vi skapade en mapp i den aktuella katalogen. Låt oss nu skapa en mapp "MyFolder1" på enheten "D": mkdir d:\MyFolder

Nu på enhet "D" finns det en mapp "MyFolder1"
Om det är nödvändigt att skapa en underkatalog används samma kommandon, vilket anger alla underkataloger.
Låt oss till exempel skapa en "world"-mapp, som finns i "hej"-mappen, som i sin tur finns på "C"-enheten: mkdir hello\world

Nu, om du går till "C"-enheten, kommer du att se en "hej"-mapp där, och i den här mappen finns det en "världs"-mapp. På så sätt kan du skapa underkataloger, vars kapslingsnivå endast begränsas av mängden hårddiskminne.
MKDIR-kommandot kommer inte att fungera om du försöker skapa en katalog som redan finns i den valda katalogen.
Låt oss till exempel skapa en annan mapp på enhet "D" som heter "MyFolder1"

Team RMDIR tar bort en katalog eller underkatalog. Kommandosyntax: RMDIR[Q][enhet:]sökväg.
Låt oss till exempel ta bort den tidigare skapade mappen "MyFolder1" från enheten "D": rmdir d:\MyFolder1

RMDIR-kommandot misslyckas om det finns andra kataloger eller filer i katalogen som raderas.
Låt oss till exempel ta bort mappen "hej" från enhet "C" (om du inte har glömt, innehåller den här mappen en annan "världs"-mapp): rmdir hello
För att ta bort en katalog tillsammans med alla underkataloger och filer, använd nyckel /S eller /Q
När du använder /S-växeln kommer RMDIR-kommandot att radera katalogen tillsammans med allt dess innehåll. När du raderar kommer ett meddelande som bekräftar raderingen att visas på skärmen. rmdir /S hej

Ett meddelande visas på skärmen. När du trycker på "y"-tangenten kommer mappen "hej" att raderas tillsammans med allt dess innehåll.
Alternativet /Q inaktiverar uppmaningen att bekräfta borttagning av en icke-tom katalog: rmdir /S /Q hi

Observera att i detta fall används 2 nycklar i ett kommando. /S-växeln låter dig ta bort en katalog tillsammans med allt dess innehåll, och /Q-växeln inaktiverar begäran om bekräftelse av radering.

MKDIR-kommandot kan skrivas som MD. Båda kommandona liknar varandra och är förkortningar från engelska. "gör katalog" - skapa en katalog.

RMDIR-kommandot kan skrivas som RD. Båda kommandona liknar varandra och är förkortningar från engelska. "ta bort katalog" - ta bort en katalog.

Ta bort filer i Linux- en uppgift som inte orsakar svårigheter för erfarna användare. Vår artikel riktar sig snarare till nybörjare. I den kan du se hur du tar bort filer via terminalen och vilka kommandon som är bäst att använda.

Varför är det bättre att ta bort filer från konsolen? Faktum är att detta ger en rad fördelar och större flexibilitet. Till exempel, med hjälp av ett speciellt kommando, kan du enkelt och helt radera en fil från hårddisk utan möjlighet till återhämtning. Eller, med bara ett kommando och med hjälp av vissa symboler, villkor eller reguljära uttryck, radera hundratals onödiga filer i en katalog eller underkataloger som uppfyller något kriterium.

Ta bort filer i Linux: öva

Linux OS har ett standard rm-verktyg för att radera filer. Som är brukligt med standardverktyg, namnet rm har en viss idé i sig. I vårt fall pratar vi om en förkortning för det engelska ordet Remove - to delete.

Så för att ta bort en fil använder vi kommandot rm, följt av namnet på vår fil:

Om vår fil inte finns i den aktuella arbetskatalogen måste vi ange sökvägen till dess plats:

Rm /home/användare/filnamn

Det händer att filen är skrivskyddad. Då kommer vi att bli ombedda att bekräfta kommandot. För att radera en fil i en sådan situation, skriv bara in y och tryck på Enter.

rm: ta bort skrivskyddad vanlig tom fil "filnamn"?

Om vi ​​vill ta bort flera filer samtidigt i Linux, så är det inte heller ett problem: vi använder kommandot rm, följt av namnen på våra filer separerade med ett mellanslag:

rm filnamn1 filnamn2 filnamn3

Ett annat alternativ är att använda jokertecken * och reguljära uttryck för att matcha specifika filer. Till exempel kan vi enkelt ta bort alla filer i Linux som har filtillägget .txt med följande kommando:

För att bekräfta varje fil innan du tar bort, använd alternativet -i:

rm -i filnamn

Men när det finns många filer och du är helt säker på att ditt kommando är korrekt och inte vill svara på systemfrågan varje gång, använd det motsatta alternativet -f . Alla filer kommer att raderas ovillkorligt, d.v.s. utan några frågor:

rm -f filnamn

Ta bort mappar och kataloger i Linux

Om du vill ta bort en tom katalog, använd alternativet -d.

Om vi ​​vill ta bort en icke-tom katalog och alla filer som finns i den, fortsätter vi enligt följande:

Återigen, om skrivskydd finns, Linux-system kommer att fråga användaren om den ska utföra raderingen. Om vi ​​vill radera filer och icke-tomma kataloger utan några frågor, gör vi så här:

När vi vill ta bort flera kataloger samtidigt använder vi kommandot rm, följt av katalognamnen separerade med ett mellanslag:

rm -r katalognamn1 katalognamn2 katalognamn3

Förresten, här kan vi också använda jokertecknet (*) och reguljära uttryck, vilket ger matchning till flera kataloger.

Slutsatser

Som du kan se är det inte alls svårt att ta bort en fil i Linux via terminalen, så vem som helst kan hantera denna operation. Med det sagt måste du inte bara förstå hur du använder kommandot rm korrekt i Linux, utan också veta hur du gör det säkert.



Om du upptäcker ett fel markerar du ett textstycke och trycker på Ctrl+Enter
DELA: