Php-controle op het bestaan van een map. Creëer, wijs toegang toe, verwijder en controleer op het bestaan van mappen in PHP
Beschrijving:
bool file_exists (tekenreeks $bestandsnaam)
Controleert het bestaan van het opgegeven bestand of de opgegeven map.
Lijst met parameters:
Pad naar een bestand of map.
Op Windows-platforms gebruikt u namen als .om te controleren op bestanden op netwerkshares //computernaam/share/bestandsnaam of \\computernaam\share\bestandsnaam.
Retourwaarden:
Retouren WAAR als het bestand of de map gespecificeerd door de bestandsnaam bestaat, anders wordt geretourneerd ONWAAR.
Opmerking:
Deze functie retourneert FALEN E is voor symbolische links die naar niet-bestaande bestanden verwijzen.
Aandacht!
Als bestanden niet beschikbaar zijn vanwege beperkingen opgelegd door de veilige modus, keert deze functie terug ONWAAR. Deze bestanden kunnen echter nog steeds worden opgenomen als ze zich in de map safe_mode_include_dir bevinden.
Opmerking:
Opmerking:
Omdat het integer-type in PHP een geheel getal met teken is en veel platforms 32-bit gehele getallen gebruiken, kunnen sommige bestandssysteemfuncties onverwachte resultaten opleveren voor bestanden die groter zijn dan 2 GB.
Voorbeelden:
Voorbeeld #1 Bestaan van bestand controleren:
$bestandsnaam = '/pad/naar/foo.txt'; if (bestand_exists($bestandsnaam)) ( echo "Bestand $bestandsnaam bestaat"; ) else ( echo "Bestand $bestandsnaam bestaat niet"; )
bestand_bestaat
(PHP3, PHP4, PHP5)
bestand_bestaat— Controleer het bestaan van het opgegeven bestand of de opgegeven map
Beschrijving
bool bestand_bestaat(string bestandsnaam)
Geeft terug of het bestand of de map met de naam die is opgegeven in de bestandsnaamparameter bestaat; anders terug.
Op Windows-platforms gebruikt u namen als of om te controleren op de aanwezigheid van bestanden op netwerkshares.
Voorbeeld 1: Controleren of een bestand bestaat
Opmerking: De resultaten van deze functie worden in de cache opgeslagen. Zie de sectie voor meer informatie clearstatcache().
Aanwijzing: Vanaf PHP 5.0.0 kan deze functie ook worden gebruikt met sommige URL-packers. Lijst met wrappers die worden ondersteund door de functiefamilie stat(), zie Bijlage. M.
Zie ook functiebeschrijvingen is_leesbaar(), is_schrijfbaar(), is_bestand() En bestand().
Zie ook:
Bestand met alle functies
Beschrijving op ru2.php.net
Beschrijving op php.ru
Je hebt de bestandsnaam minimaal tussen aanhalingstekens nodig (als string):
Zorg er ook voor dat het goed is geverifieerd. En dan werkt het alleen als het geactiveerd is in je PHP-configuratie
Probeer dit:
In eerste instantie je hebt nodig begrijpen: hebben je hebt geen bestanden .
Bestand is een object bestandssysteem, maar u doet uw verzoek via het HTTP-protocol, dat geen andere bestanden dan URL's ondersteunt.
U dient dus het ongebruikte bestand op te vragen via uw browser en de responscode te bekijken.
PHP, het controleren van het bestaan/de aanwezigheid van een extern bestand
als het geen 404 is, kun je geen wrappers gebruiken om te zien of het bestand bestaat en moet je je cdn opvragen met een ander protocol zoals FTP
Hier is de eenvoudigste manier om te controleren of een bestand bestaat:
Er is een groot verschil tussen en.
php.net/manual/en/function.is-file.php retourneert true voor (gewone) bestanden:
Retouren WAAR, als de bestandsnaam bestaat en een normaal bestand is, anders ONWAAR .
retourneert true voor zowel bestanden als mappen:
Retouren WAAR, als er een bestand of map is gespecificeerd op bestandsnaam; FALSE binnen anders.
Opmerking.Voor meer informatie over dit probleem kunt u ook deze vraag raadplegen met behulp van.
je kunt cURL gebruiken. Mogelijk krijgt u cURL alleen om u de kopteksten te geven en niet de hoofdtekst, waardoor het sneller zou kunnen worden. Een slecht domein kan altijd even duren, omdat u wacht tot er een time-out voor het verzoek optreedt; u kunt de time-outlengte waarschijnlijk wijzigen met behulp van cURL.
Hier is een voorbeeld:
probeer dit:
leest niet alleen bestanden, maar ook paden. dus als het leeg is, werkt het commando alsof het als volgt is geschreven:
als de map /images/ bestaat, zal de functie nog steeds terugkeren.
Ik schrijf het meestal zo:
Als u curl gebruikt, kunt u het volgende script proberen:
Waarden retourneren
Retourneert als het bestand of de map die door de parameter is opgegeven bestaat, en retourneert anders.
Opmerking:
Deze functie retourneert symbolische koppelingen die naar niet-bestaande bestanden verwijzen.
Hoe controleer ik of een map bestaat in PHP en verwijder ik deze?
Opmerking:
Validatie vindt plaats met behulp van echte UID's/GID's in plaats van effectieve identificatiegegevens.
Opmerking: Omdat het integer-type in PHP een geheel getal met teken is en veel platforms 32-bit gehele getallen gebruiken, kunnen sommige bestandssysteemfuncties onverwachte resultaten opleveren voor bestanden die groter zijn dan 2 GB.
Voorbeelden
Voorbeeld #1 Controleren of een bestand bestaat
Fouten
Als de bewerking mislukt, wordt er een niveaufout gegenereerd.
- is_readable() — Bepaalt of het bestand bestaat en leesbaar is
- is_writable() — Bepaalt of het bestand beschrijfbaar is
- is_file() — Bepaalt of het bestand een normaal bestand is
- file() — Leest de inhoud van een bestand en plaatst het in een array
Keer terug naar: Bestandssysteem
Bestaanscontrole
PHP heeft twee manieren om te controleren of er mappen bestaan. De eerste is om de functie file_exists() te gebruiken. Het principe van de werking ervan werd eerder besproken in het artikel over toegangsrechten. Bedenk dat de functie slechts één stringparameter nodig heeft: het pad in het bestandssysteem. Ondanks het feit dat de naam het woord “bestand” bevat, werkt het prima met mappen.
De tweede methode heeft betrekking op de ingebouwde functie is_dir(). Het accepteert, net als file_exists(), een relatief of absoluut mappad. Naast het controleren op bestaan, bevestigt het echter ook het feit dat het een map is en geen bestand dat zich op dit pad bevindt. Als de string de locatie van een harde of symbolische link beschrijft, zal is_dir() ernaartoe navigeren en het eindpunt van het pad parseren. Als dit lukt, wordt de Booleaanse waarde true geretourneerd, en als dit niet lukt, wordt false geretourneerd.
//maak een nieuwe map aan in de root van de site voor controles $dirName = “($_SERVER[‘DOCUMENT_ROOT’])/directory”; if (!file_exists($dirName)) ( mkdir($dirName); ) var_dump(file_exists($dirName)); // Resultaat: bool(true) var_dump(is_dir($dirName)); // Resultaat: bool (waar)
Opmerking
Functies die verantwoordelijk zijn voor het controleren op bestaan van mappen kunnen false retourneren als er geen toegangsrechten zijn. Dergelijke dingen zijn niet afhankelijk van het PHP-script; dit is het verantwoordelijkheidsniveau van het besturingssysteem.
Een map verwijderen
Om een directory in PHP te verwijderen, gebruik je de rmdir() functie. Als eerste parameter moet deze de locatie van de map doorgeven. Net als in de bovenstaande voorbeelden worden de Booleaanse waarden waar of onwaar geretourneerd.
Het verwijderen van een map lijkt misschien een eenvoudige taak. In de meeste gevallen is dit echter niet het geval. De functie rmdir() werkt alleen met een lege map en retourneert false als deze nog iets anders bevat. In dit geval moet u recursieve verwijdering gebruiken.
//maak een tijdelijke map aan voor demonstratie $dirName = “($_SERVER[‘DOCUMENT_ROOT’])/directory”; if (!file_exists($dirName)) ( mkdir($dirName); ) if (rmdir($dirName)) ( echo ‘De map is succesvol verwijderd’; ) else ( echo ‘De map kon niet worden verwijderd’; )
Recursieve verwijdering
Er is geen gemakkelijke manier om een volledige map te verwijderen.
Hieronder geven we twee voorbeelden van de implementatie van een dergelijk mechanisme. Het kan als een functie worden opgeslagen en in elk deel van de programmacode worden gebruikt.
De eerste manier om een map in PHP te verwijderen is door een recursieve functie te gebruiken. Dat wil zeggen, een functie die zichzelf aanroept zolang aan bepaalde voorwaarden wordt voldaan. Kijk eens naar het onderstaande voorbeeld. Het is vrij eenvoudig te begrijpen.
Het controleren van het bestaan van bestanden in php
We gebruiken de standaard scandir()-functie om de volledige inhoud van een map te doorlopen. Als we een bestand tegenkomen, roepen we de functie unlink() aan, en als we een andere map tegenkomen, gebruiken we de naam ervan om een recursieve aanroep te doen.
//voorbeeld van een functie voor het recursief verwijderen van een bepaalde mapfunctie deleteDirectory($directoryName) ( $files = array_diff(scandir($directoryName), ['.', '..']); foreach ($files as $file) ( if (is_dir (“$directoryName/$file”)) ( deleteDirectory(“$directoryName/$file”); ) else ( unlink(“$directoryName/$file”); ) ) return rmdir($directoryName);
PHP heeft ook twee ingebouwde klassen RecursiveDirectoryIterator en RecursiveIteratorIterator. Ze kunnen worden gebruikt om alle nestniveaus van een opgegeven map te doorlopen. Houd er rekening mee dat we bij het maken van een exemplaar van de klasse RecursiveIteratorIterator de tweede parameter RecursiveIteratorIterator::CHILD_FIRST gebruiken. Het dwingt om alle bestanden en mappen door te lussen, te beginnen bij de meest geneste. Op deze manier kunt u het doen zonder de recursieve functie expliciet aan te roepen.
//een voorbeeld van een functie die geen gebruik maakt van de recursieve aanroepfunctie deleteDirectory($directoryName) ( $iterator = new RecursiveDirectoryIterator($directoryName); $files = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST); foreach ($files as $file) ( if (in_array($file->getFilename(), ['..', '.'])) ( ga verder; ) ($file->isDir()) ? rmdir($file) : unlink( $bestand); rmdir($mapnaam);
Er zijn momenten waarop u moet controleren of een opgegeven bestand al dan niet bestaat, bijvoorbeeld om vervolgens bepaalde acties op het bestand uit te voeren.
Dit probleem kwam ik ook tegen bij het ontwikkelen van de module. En ik vond twee opties om het probleem op te lossen.
Het bestaan van een bestand controleren met behulp van een URL-link
In PHP is er een functie " fopen", die kan worden gebruikt om de opgegeven URL te openen.
Wat zijn we aan het doen? We proberen het bestand te openen en als dat lukt, bestaat het bestand, anders bestaat het bestand niet.
Uitvoering:
Maar wat als we niet één bestand hebben, maar meerdere, om zo te zeggen, een reeks links? Dit is precies de taak die vanaf het begin voor mij stond. En de oplossing voor dit probleem is als volgt:
In dit geval krijgen we een lijst met alleen de bestaande bestanden.
Controleren of er een lokaal bestand bestaat
Het woord “lokaal” betekent dat het script en de bestanden voor verificatie zich op dezelfde server bevinden. Als u een vrij groot aantal links heeft, is deze optie de beste om het probleem op te lossen, omdat we geen verzoek indienen bij een server van derden, maar de opgegeven mappen scannen.
Deze methode gebruikt de functie “file_exists” en vervangt, naar analogie met de vorige optie, eenvoudigweg een deel van het script:
En hetzelfde voor de linkarray:
Wat is het waard Let op? Het feit dat deze methode handig is voor het uitvoeren van bestanden die zich in ons bestandssysteem bevinden. Daarom is het raadzaam om alle links als relatieve links aan te geven.
Trouwens, toen ik een van de bestellingen maakte, kon ik met deze methode in slechts een paar seconden ongeveer 135.000 bestanden scannen.
Het wijdverbreide gebruik van databases heeft het conventionele bestandssysteem niet irrelevant gemaakt. Het schrijven en lezen van bestanden neemt nog steeds een belangrijke plaats in bij het programmeren.
Met algoritmen voor het controleren van de aanwezigheid van een bestand kunt u fouten bij het uitvoeren van code voorkomen. De PHP file_exists functie biedt een eenvoudige oplossing om het bestaan van een bestand of map te controleren.
Syntaxis en gebruik van de functie file_exists
Het resultaat van de functie is waar of onwaar. De enige parameter is de bestandsnaam en het pad ernaartoe. Het functieresultaat wordt in de cache opgeslagen, omdat als PHP file_exists niet werkt, maar het bestand wel bestaat, dit een algoritmefout is.
Door de functie clearstatcache() te gebruiken, kunt u veel valkuilen vermijden bij het onderzoeken van de status van een toegankelijk bestandssysteem. Maar houd er rekening mee dat PHP file_exists bij een niet-bestaand bestand false retourneert totdat het bestand dat u zoekt is gemaakt, en vervolgens true retourneert, zelfs als het al is verwijderd.
Met de juiste combinatie van de functie clearstatcache() en bestandssysteemgerelateerde functies (bijvoorbeeld is_writable(), is_readable(), is_executable(), is_file(), is_dir() en andere) kunt u “verborgen” scriptuitvoering voorkomen fouten.
Caching verbetert de systeemprestaties aanzienlijk, maar kan in sommige gevallen werkelijk onbetrouwbare resultaten opleveren voor belangrijke bestanden en een ernstige, moeilijk te detecteren runtimefout veroorzaken.
PHP-functieparameter file_exists
PHP kan op verschillende computerplatforms worden geïnstalleerd en daarom kunnen het pad en de bestandsnaam verschillen.
In de documentatie staat dat PHP controleert op basis van UID/GID in plaats van effectieve identificaties. Bij het ontwikkelen van een algoritme voor het gebruik van PHP file_exists moet u niet alleen letten op de juiste slashes (vooruit of achteruit), de codering van het pad naar het bestand en de naam van het bestand zelf, maar ook controleren op de aanwezigheid van de vereiste hoofdlettergebruik, correcte karakters, toegangsrechten en andere omstandigheden.
Een negatief resultaat kan worden beïnvloed door de codering van het scriptbestand en vereist mogelijk een conversie van de tekenreeks die uit de database is opgehaald.
Gebruik van de functie in de praktijk
De toepassingsgebieden van PHP-scripts verschillen aanzienlijk. Dit wil niet zeggen dat PHP file_exists uitsluitend wordt gebruikt voor het opslaan van systeeminformatie, gegevensbestanden, objecten of dynamisch gegenereerde afbeeldingen.
Er zijn vaak gevallen waarin gebruik wordt gemaakt van streaming voor het genereren van grote hoeveelheden tijdelijke informatie die niet effectief onmiddellijk in een database worden geplaatst. Informatie van verschillende bezoekers kan naar de site stromen, en pas na voorafgaande verwerking gedurende een bepaalde periode mag de benodigde informatie in databasetabellen worden geplaatst.
Het lezen van systeembestanden kan caching veroorzaken als er meerdere paginavernieuwingen of onjuiste bezoekersacties plaatsvinden. Er zijn in werkelijkheid nogal wat situaties, maar bij correct gebruik kunt u met de functie veilige en betrouwbare code schrijven.
De vereiste parameter voor deze functie is padnaam, die het pad specificeert naar de map die moet worden gemaakt.
mkdir( "nieuwe map");
Als u de map op deze manier opgeeft, wordt deze aangemaakt in dezelfde map van waaruit het PHP-script is gestart. Als u een map op een andere locatie moet maken, kunt u een relatief pad opgeven naar de map die wordt gemaakt, of het volledige pad vanaf de hoofdmap van de site opgeven.
mkdir( "../nieuwe map" ); // een niveau lager
mkdir("/map1/map2/nieuwemap" ); // volledig pad
In het laatste voorbeeld is de voorwaarde het bestaan van de submappen "map1" en "map2". Als ze er niet zijn, kan de functie in dit formulier de map niet maken en wordt er een foutmelding weergegeven:
Waarschuwing: mkdir() : Een dergelijk bestand of map bestaat niet in …
Als dit lukt, retourneert de functie True. Als het pakket niet is gemaakt, wordt False geretourneerd.
if (mkdir("nieuwe map"))
echo "Map succesvol aangemaakt";
anders
echo "Map niet gemaakt";
Maar u moet deze functie niet gebruiken zonder te controleren op de aanwezigheid van een map, aangezien de server nog steeds een foutmelding zal weergeven dat de map niet kan worden gemaakt.
Rechten toekennen bij het aanmaken van een map
De tweede optionele parameter van de mkdir-functie is verantwoordelijk voor het toewijzen van rechten aan de gemaakte map. Standaard worden de maximale rechten toegewezen: 0777.
Machtigingen worden toegewezen als een octale waarde met een verplichte voorloopnul. Afgezien van de eerste nul vertegenwoordigen de cijfers de toegangsniveaus voor de eigenaar, voor de groep van de eigenaar, voor alle anderen.
0 – toegang geweigerd;
1 – leestoegang;
2 – schrijftoegang;
4 – toegang tot uitvoering.
Meestal worden rechten gespecificeerd als een samengesteld bedrag, bijvoorbeeld:
7 – volledige toegang (1+2+4);
5 – lezen en uitvoeren (1+4).
mkdir( "nieuwe map", 0777); // volledige toegang voor iedereen
Meerdere geneste submappen maken
U kunt meerdere submappen tegelijk maken door eenvoudigweg een andere optionele Booleaanse parameter op te geven: recursief.
mkdir("map1/map2/nieuwemap" , 0777, True ); // volledige toegang voor iedereen
Als er in dit geval geen mappen "map1" en "map2" zijn, zal de functie deze mappen en de map "nieuwemap" aanmaken. Als er geen andere problemen optreden, worden er geen foutmeldingen weergegeven en retourneert de functie True.
Een map verwijderen
Een lege map in PHP kan worden verwijderd met behulp van de rmdir-functie. De parameter dirname specificeert ook het volledige of relatieve pad naar de map die moet worden verwijderd:
rmdir( "mijnmap" );
rmdir("map1/map2/mijnmap" );
In elk van deze gevallen wordt alleen de map "mijnmap" verwijderd. Als er geen map is of als het pad verkeerd is opgegeven, wordt er een foutmelding weergegeven:
Waarschuwing: rmdir(mijnmap): Een dergelijk bestand of map bestaat niet in …
Een niet-lege map verwijderen
Het verwijderen van een niet-lege map gebeurt door achtereenvolgens de subbestanden in de map te verwijderen met de unlink-functie, en vervolgens de lege map te verwijderen met de rmdir-functie. Je kunt hiervoor een functie als deze gebruiken:
functie mijn_delete_dir($mijnpad)(
$dir = openmap($mijnpad);
while (($bestand = leesmap($map)))(
if (is_file($mijnpad."/" .$file))
unlink($mijnpad. "/" .$bestand);
elseif (is_dir($mijnpad."/" .$bestand) && ($bestand != "." ) && ($bestand != ".." ))
mijn_delete_dir($mijnpad."/" .$file);
}
geslotenir($dir);
rmdir($mijnpad);
}
mijn_delete_dir("mijnmap" ); // functieaanroep
Het bestaan van een map controleren
Vóór de meeste bewerkingen met mappen is het de moeite waard om te controleren of ze bestaan. Hiervoor wordt de functie file_exists gebruikt.
Bovendien moet u ervoor zorgen dat het opgegeven object een map is en geen bestand: de functie is_dir. De te scannen map wordt gespecificeerd door een relatief of volledig pad.
if (file_exists("mijnmap"))
echo "De opgegeven map bestaat";
anders
echo "De opgegeven map bestaat niet";
if (is_dir("mijnmap"))
echo "Het opgegeven mapobject";
anders
echo "Het opgegeven object is geen map";
Er zijn momenten waarop u moet controleren of een opgegeven bestand al dan niet bestaat, bijvoorbeeld om vervolgens bepaalde acties op het bestand uit te voeren.
Dit probleem kwam ik ook tegen bij het ontwikkelen van de module. En ik vond twee opties om het probleem op te lossen.
Het bestaan van een bestand controleren met behulp van een URL-link
In PHP is er een functie " fopen", die kan worden gebruikt om de opgegeven URL te openen.
Wat zijn we aan het doen? We proberen het bestand te openen en als dat lukt, bestaat het bestand, anders bestaat het bestand niet.
Uitvoering:
Maar wat als we niet één bestand hebben, maar meerdere, om zo te zeggen, een reeks links? Dit is precies de taak die vanaf het begin voor mij stond. En de oplossing voor dit probleem is als volgt:
In dit geval krijgen we een lijst met alleen de bestaande bestanden.
Controleren of er een lokaal bestand bestaat
Het woord “lokaal” betekent dat het script en de bestanden voor verificatie zich op dezelfde server bevinden. Als u een vrij groot aantal links heeft, is deze optie de beste om het probleem op te lossen, omdat we geen verzoek indienen bij een server van derden, maar de opgegeven mappen scannen.
Deze methode gebruikt de functie “file_exists” en vervangt, naar analogie met de vorige optie, eenvoudigweg een deel van het script:
En hetzelfde voor de linkarray:
Wat is het waard Let op? Het feit dat deze methode handig is voor het uitvoeren van bestanden die zich in ons bestandssysteem bevinden. Daarom is het raadzaam om alle links als relatieve links aan te geven.
Trouwens, toen ik een van de bestellingen maakte, kon ik met deze methode in slechts een paar seconden ongeveer 135.000 bestanden scannen.