Hoe een php-bestand te verwijderen. Hoe een bestand in PHP te verwijderen. Een bestand kopiëren in PHP

Vaak is het bij het maken van een programma nodig om bestanden te verwijderen (de redenen kunnen heel verschillend zijn) en in dit geval komt het ontkoppelen van php ons te hulp. Vandaag zullen we leren hoe we bestanden in PHP kunnen verwijderen en enkele voorbeelden bekijken.

Bestanden verwijderen met PHP ontkoppelen

Gebruik de functie unlink() om bestanden te verwijderen. De syntaxis voor deze functie is als volgt:

ontkoppelen (bestandsnaam)

Deze functie is logisch en retourneert daarom TRUE als het bestand succesvol is verwijderd, en FALSE als dit mislukt. Overweeg om te gebruiken ontkoppelen() Bijvoorbeeld:

Houd er rekening mee dat wanneer deze pagina opnieuw wordt geladen, het programma een foutmelding zal genereren. Dit komt doordat de functie de eerste keer werd aangeroepen, het bestand al was verwijderd en de volgende keer niet kon worden gedetecteerd.

Er zijn verschillende manieren om dit probleem op te lossen. U kunt bijvoorbeeld een complexere interne programmaarchitectuur gebruiken door voorwaardelijke if-instructies te gebruiken. Of het is voldoende om het @-symbool voor de functie zelf te plaatsen om eventuele fouten te negeren. In dit geval zal de fout niet optreden, zelfs als het bestand niet wordt gevonden:

Het verwijderen van bestanden in PHP met behulp van ontkoppelen is helemaal niet moeilijk, zoals ze zeggen, breken is niet bouwen. De volgende keer zullen we leren hoe we de status van bestanden kunnen controleren.

We vervolgen de les, die is gewijd aan het onderwerp “ Werken met PHP-bestanden" Als je het vorige nog niet hebt gelezen, raad ik je aan het te lezen, en voor degenen die het wel hebben gelezen, laten we verder gaan. In deze les leert u hoe u een gemaakt of bestaand bestand verwijdert met behulp van PHP, een bestand kopieert of hernoemt en vergrendelt.
Nou, als je er klaar voor bent, ga dan de strijd aan...

Een bestand verwijderen in PHP

Als je een bestand wilt verwijderen, gebruik dan de PHP unlink() functie:

Ontkoppelen(bestandsnaam);

Bestandsnaam – voer hier de naam in van het bestand dat u wilt verwijderen.

Laten we zeggen dat we het bestand “file.txt” moeten verwijderen. Een voorbeeld om in te vullen zou er als volgt uit kunnen zien:

Ontkoppelen("bestand.txt");

Klaar-code:



Als het bestand "file.txt" aanwezig was, heeft het script dit verwijderd.

Een bestand kopiëren in PHP

Als u inhoud van het ene bestand naar het andere bestand wilt kopiëren, gebruikt u de PHP copy()-functie.

Kopiëren("bestand1", "bestand2");

Bestand1 – bestandsnaam van waaruit de tekst wordt gekopieerd
- file2 – bestandsnaam waar de tekst naartoe wordt gekopieerd

Maak bijvoorbeeld een bestand met de naam “file2.txt” op uw lokale server in de map “test-1”. Laat het bestand leeg zijn. Laten we nu deze code plakken kopie("bestand.txt", "bestand2.txt"); in php de code “file.php”:



Wat hebben we gedaan? Een bestand gemaakt met de naam “file.txt” via PHP, een invoer gemaakt in het bestand “file.txt” via PHP “ Ik ben blij je te zien op de blogsite ", gaf het resultaat weer in de browser, kopieerde de tekst uit het bestand "file.txt" en plakte deze in het bestand "file2.txt". Geloof je niet dat dit is gebeurd? Weet je nog dat het bestand “file2.txt” leeg was?! Open het! En wat zie je? Ja dat klopt, de tekst die in het bestand “file.txt” stond:

De naam van een bestand wijzigen in PHP

Om een ​​bestand te hernoemen, gebruik je de PHP rename() functie:

Hernoemen("bestand1", "bestand2");

Bestand1 – de naam van het bestand dat moet worden vervangen ( hernoemen)
- file2 – hier moet u een nieuwe bestandsnaam opgeven

Hier is een voorbeeld om in te vullen:

Hernoemen("bestand2..txt");

Hier is de voltooide code:



Het bestand “file2.txt” is hernoemd naar het bestand “site.txt”.

Dit is waar ik denk dat we onze les moeten beëindigen. Maar dat is nog niet alles, in de volgende les gaan we verder met het werken met bestanden.

8 jaar geleden

Heeft u een groot bestand verwijderd, maar ziet u geen toename van de vrije ruimte of afname van het schijfgebruik? Gebruikt u UNIX of een ander POSIX-besturingssysteem?

De unlink() gaat niet over het verwijderen van een bestand, het gaat over het verwijderen van een bestandsnaam. De manpage zegt: ``unlink - verwijder een naam en mogelijk het bestand waarnaar deze verwijst"".

Meestal heeft een bestand slechts één naam; als u deze verwijdert, wordt ook de hoofdtekst van het bestand verwijderd (met één waarschuwing, zie hieronder). Dat is het eenvoudige, gebruikelijke geval.

Echter, het "is prima dat een bestand meerdere namen heeft (zie de link() functie), in dezelfde of verschillende mappen. Alle namen zullen verwijzen naar de hoofdtekst van het bestand en 'het in leven houden', om zo te zeggen. Pas als alle namen zijn verwijderd, wordt de hoofdtekst van het bestand daadwerkelijk vrijgegeven.

Het voorbehoud:
De hoofdtekst van een bestand kan *ook* ‘in leven worden gehouden’ (nog steeds met gebruik van schijfruimte) door een proces dat het bestand openhoudt. De hoofdtekst wordt niet ongedaan gemaakt (er wordt geen schijfruimte vrijgemaakt) zolang het proces deze openhoudt. In feite is er een mooie manier om een ​​bestand weer tot leven te wekken dat door een fout is verwijderd, maar nog steeds open wordt gehouden door een proces...

10 jaar geleden

Ik heb aan een kleine proef gewerkt waarbij een back-upbestand werd gemaakt voordat het hoofdtekstbestand werd gewijzigd. Wanneer er vervolgens een fout optreedt, wordt het hoofdbestand verwijderd (ontkoppeld) en wordt in plaats daarvan het back-upbestand geretourneerd.

Hoewel ik al ongeveer een uur mijn hoofd heb gebroken over waarom ik mijn toestemming niet goed kon krijgen om het hoofdbestand te ontkoppelen.

Eindelijk wist ik wat er mis was: omdat ik aan het bestand werkte en het bestand nog niet had gesloten, was het nog steeds in gebruik en kon het natuurlijk niet worden verwijderd :)

Dus ik dacht erover om dit hier te vermelden, om te voorkomen dat anderen dezelfde fout maken:

// Sluit eerst het bestand
fsluiten($fp);

// Ontkoppel vervolgens :)
ontkoppelen ($somefile);
?>

14 jaar geleden

Om alle bestanden met een bepaalde extensie te verwijderen, of eigenlijk allemaal met een jokerteken, is een veel eenvoudige manier het gebruik van de glob-functie. Stel dat ik alle jpg's wilde verwijderen.......

Foreach (glob ("*.jpg") als $bestandsnaam ) (
echo "$bestandsnaamgrootte". bestandsgrootte ($bestandsnaam) . "\N" ;
ontkoppelen ($bestandsnaam);
}

?>

10 jaar geleden

Voor iedereen die een probleem heeft gehad met de fout 'Permissies geweigerd': deze wordt soms veroorzaakt wanneer u probeert een bestand te verwijderen dat zich in een map hoger in de hiërarchie van uw werkmap bevindt (dat wil zeggen wanneer u probeert een pad te verwijderen dat begint met "../").

Om dit probleem te omzeilen, kunt u chdir() gebruiken om de werkmap te wijzigen in de map waarin het bestand dat u wilt ontkoppelen zich bevindt.

$oud = getcwd(); // Sla de huidige map op
chdir($pad_naar_bestand);
ontkoppelen ($bestandsnaam);
chdir ($oud); // Herstel de oude werkmap
?>

4 jaar geleden

Op OSX, als je vecht tegen de foutmelding "Permission Denied", zorg er dan voor dat de map SCHRIJF-rechten heeft voor de uitvoerende php-gebruiker.

Bovendien, als u afhankelijk bent van ACL's en een bestand of een symbolische link wilt verwijderen, moet de map die deze bevat de machtiging "delete_child" hebben om de zaken daarin te ontkoppelen. Als u alleen "verwijderen" toekent aan de map, kunt u de containermap zelf verwijderen, maar niet de objecten daarin.

4 jaar geleden

Dit lijkt misschien voor de hand liggend, maar ik rukte me de haren uit het hoofd met dit probleem: zorg ervoor dat het bestand dat je probeert te verwijderen momenteel niet in gebruik is. Ik had een script dat een tekstbestand aan het parseren was en dat ik het moest verwijderen nadat het voltooid was, maar ik kreeg steeds de foutmelding 'Toestemming geweigerd' omdat ik het bestand niet expliciet had gesloten. Daarom werd het technisch gezien nog steeds "gebruikt", ook al was het parseren niet mogelijk. compleet.

11 jaar geleden

Het bovenstaande bericht van Ggarciaa bevat al een kleine fout, closedir moet worden gebruikt, zelfs als $DeleteMe false is











}

Gesloten map($dh);
if ($Verwijder mij)(
@rmdir($map);
}
}

?>

9 maanden geleden

Afhandeling van de fout 'Resource Unavailable' door unlink() als uitzondering met behulp van try catch

Zelfs is_file() of file_exists() zal controleren of het bestand bestaat of niet. Er zijn kansen dat het bestand door sommige toepassingen wordt gebruikt, waardoor verwijdering wordt voorkomen, en unlink() geeft de foutmelding "Resource Unavailable" weer.

Dus na vele methoden geprobeerd te hebben, zoals: `is_resource()`, `is_writable()`, `stream_get_meta_data()`...etc, heb ik de enige beste manier bereikt om met fouten om te gaan terwijl je een bestand *"verwijdert"* dat ofwel * *bestaat niet** of **bestaat maar wordt door een bepaalde toepassing gebruikt**

functie verwijder_bestand($pBestandsnaam)
{
if (bestand_bestaat($pBestandsnaam)) (
// Toegevoegd door muhammad.begawala
// "@" geeft de foutmelding "Resource Unavailable" niet meer weer omdat het bestand ergens open is.
// "unlink($pFilename) !== true" controleert of het bestand succesvol is verwijderd.
// Er wordt een uitzondering gegenereerd, zodat we fouten gemakkelijk kunnen afhandelen in plaats van deze aan gebruikers weer te geven.
if(@unlink($pBestandsnaam) !== waar)
throw new Exception("Kon bestand niet verwijderen: " . $pFilename . " Sluit alle toepassingen die er gebruik van maken.");
}
retourneer waar;
}

/* === GEBRUIK === */

poging (
if(delete_file("hello_world.xlsx") === waar)
echo "Bestand verwijderd";
}
vangen (Uitzondering $e) (
echo $e->getMessage(); // zal het hierboven gedefinieerde uitzonderingsbericht afdrukken.
}

11 jaar geleden

Het bovenstaande bericht van Ggarciaa bevat een kleine fout: het negeert de tekenreeksen van bestanden en mappen die als onwaar worden geëvalueerd (dat wil zeggen "0")

Vaste code staat hieronder (false!==)

// ggarciaa op gmail dot com (04-juli-2007 01:57)
// Ik moest een map leegmaken, maar deze behouden
// dus ik heb de bijdrage enigszins aangepast van
// stefano bij takys dot it (28-dec-2005 11:57)
// Een korte maar krachtige recursieve functie
// dat werkt ook als de mappen verborgen bestanden bevatten
// $dir = de doelmap
// $DeleteMe = indien waar, verwijder ook $dir, indien onwaar, laat het met rust

Functie SureRemoveDir ($dir, $DeleteMe) (
if(! $dh = @ opendir ($dir )) return;
while (false !== ($obj = leesmap ($dh ))) (
if($obj == "." || $obj == ".." ) doorgaan;
if (!@ unlink ($dir . "/" . $obj )) SureRemoveDir ($dir . "/" . $obj , true );
}
if ($Verwijder mij)(
geslotenir($dh);
@rmdir($map);
}
}

//SureRemoveDir("EmptyMe", false);
//SureRemoveDir("RemoveMe", waar);

?>

8 jaar geleden

Het ontkoppelen kan mislukken na het gebruik van ODBC-opdrachten voor het bestand (in Windows).

Geen van beidenochdeed de truc.

Alleenheeft het bestand vrijgegeven zodat het daarna verwijderd kon worden ...

In het vorige artikel hadden we het erover, en daar heb ik je kennis laten maken functie rmdir(), waarmee de map wordt verwijderd. Ik zei echter dat je op deze manier alleen een lege map kunt verwijderen, maar hoe een map met bestanden te verwijderen, Je zult het nu ontdekken.

Het principe is heel eenvoudig: om map met bestanden verwijderen, moet u eerst alle bestanden verwijderen, evenals alle submappen. Er kunnen ook bestanden en andere submappen in submappen aanwezig zijn, deze moeten ook worden gewist. Over het algemeen is de moeilijkheid dat de diepte van de mappen erg groot kan zijn. En het is duidelijk dat recursie zichzelf suggereert: een functie in zichzelf aanroepen.

Ondanks de schijnbare complexiteit van het algoritme is de implementatie zeer eenvoudig en transparant:

functie verwijderDirectory($dir) (
if ($objs = glob($dir."/*")) (
foreach($objs als $obj) (
is_dir($obj) ? removeDirectory($obj) : ontkoppelen($obj);
}
}
rmdir($map);
}
?>

Ik zal proberen het algoritme van deze functie in duidelijke taal uit te leggen. Allereerst krijgen we een lijst met alle bestanden in een bepaalde map. Als ze er niet zijn, verwijder ze dan onmiddellijk. Als ze bestaan, beginnen we ze een voor een te doorzoeken. Als het element een bestand is, verwijder het dan eenvoudig ( ontkoppelen($obj)). Als dit een map is, roepen we onze functie opnieuw aan en geven we deze map door. Dit is recursie: de functie roept zichzelf aan. Nadat de functie zichzelf heeft aangeroepen, begint alles opnieuw, maar met een andere map. Alle bestanden worden ook verwijderd en alle mappen worden teruggestuurd naar deze functie. Wanneer alle mappen en bestanden zijn verwijderd, wordt de reeds lege map verwijderd.

Ik zal je dit vertellen: dit algoritme is vanuit praktisch oogpunt niet zo nuttig (het is niet zo vaak nodig). verwijder mappen met bestanden in PHP), hoe nuttig het is voor de ontwikkeling van je denken. Dit is een heel eenvoudig algoritme en het lost een heel, heel complex probleem op. Leer daarom algoritmen samen te stellen - dit is het belangrijkste in elke programmeertaal.