Jak zkontrolovat existenci php. Jak zkontrolovat, zda soubor existuje v PHP? Beispiel #1 Kontrola, zda soubor existuje

Existují případy, kdy potřebujete zkontrolovat, zda zadaný soubor existuje nebo ne, například za účelem následného provedení některých akcí se souborem.

S tímto problémem jsem se také setkal při vývoji modulu. A našel jsem dvě řešení problému.

Kontrola existence souboru podle URL

V PHP existuje funkce " fopen“, který může otevřít zadanou adresu URL.

Co to děláme? Pokoušíme se otevřít soubor, a pokud uspějeme, pak soubor existuje, jinak soubor neexistuje.

Implementace:

Ale co když nemáme jeden soubor, ale několik, abych tak řekl, řadu odkazů? To je přesně ten úkol, který byl původně přede mnou. A řešení tohoto problému je následující:

V tomto případě získáme seznam pouze těch souborů, které existují.

Kontrola existence místního souboru

Slovo "místní" znamená, že skript a soubory, které mají být zkontrolovány, jsou umístěny na stejném serveru. Pokud máte poměrně velké pole odkazů, je tato možnost nejlepší pro vyřešení problému, protože nepodáváme požadavek na server třetí strany, ale skenujeme zadané adresáře.

Tato metoda používá funkci "file_exists" a analogicky s předchozí verzí jednoduše nahradí část skriptu:

A totéž pro řadu odkazů:

co to stojí Poznámka? Že tato metoda je vhodná pro spouštění souborů, které jsou v našem souborovém systému. Proto je žádoucí uvádět všechny odkazy relativní.

Mimochodem, při jedné z objednávek se mi právě tímto způsobem podařilo naskenovat asi 135 000 souborů za pár sekund.

Rozšířené používání databází nečiní konvenční souborový systém nedůležitým. Zápis a čtení souborů stále zaujímá významné místo v programování.

Algoritmy pro kontrolu existence souboru vám umožní vyhnout se chybám při provádění kódu. Funkce PHP file_exists nabízí jednoduché řešení pro kontrolu existence souboru nebo adresáře.

Syntaxe a použití funkce file_exists

Výsledek funkce je true nebo false. Jediným parametrem je název souboru a cesta k němu. Výsledek funkce je uložen do mezipaměti, protože pokud PHP file_exists nefunguje, ale soubor skutečně existuje, pak je to chyba algoritmu.

Použitím funkce clearstatcache() se lze vyhnout mnoha chybám při zkoumání stavu dostupného souborového systému. Ale mějte na paměti, že u neexistujícího PHP souboru bude file_exists vracet false, dokud nebude daný soubor vytvořen, a poté vrátí true, i když již byl smazán.

Správná kombinace funkce clearstatcache() a funkcí souvisejících se souborovým systémem (například is_writable(), is_readable(), is_executable(), is_file(), is_dir() a další) vám umožní vyhnout se „skrytému“ spuštění skriptu. chyby.

Ukládání do mezipaměti výrazně zlepšuje výkon systému, ale v některých případech může u důležitých souborů vytvořit opravdu nespolehlivý výsledek a způsobit závažnou, těžko zjistitelnou chybu při provádění.

Parametr funkce PHP file_exists

PHP lze nainstalovat na různé počítačové platformy, a proto se cesta a pojmenování souborů mohou lišit.

Dokumentace deklaruje, že PHP kontroluje UID/GID, nikoli účinné identifikátory. Při vývoji algoritmu pro použití PHP file_exists byste měli dávat pozor nejen na správná lomítka (dopředu nebo vzad), kódování cesty k souboru a název samotného souboru, ale také zkontrolovat správná malá a velká písmena, správné znaky , přístupová práva a další okolnosti.

Negativní výsledek může být ovlivněn kódováním souboru skriptu, může být nutné převést řetězec znaků přijatý z databáze.

Aplikace funkce v praxi

Oblasti použití PHP skriptů se výrazně liší. To neznamená, že PHP file_exists se používá výhradně k ukládání systémových informací, datových souborů, objektů nebo dynamických obrázků.

Často se vyskytují případy použití streamingového vytváření velkého množství časových informací, které není efektivní okamžitě vložit do databáze. Na stránku se mohou hrnout informace od různých návštěvníků a pouze po předběžném zpracování po určitou dobu by měly být potřebné informace umístěny do databázových tabulek.

Čtení systémových souborů může způsobit ukládání do mezipaměti kvůli vícenásobnému obnovení stránky nebo nesprávným akcím návštěvníků. Ve skutečnosti existuje spousta situací, ale při správném použití vám funkce umožňuje psát bezpečný a spolehlivý kód.

Požadovaný parametr pro tuto funkci je pathname, který udává cestu k adresáři, který má být vytvořen.

mkdir( "nová složka" );

Pokud zadáte složku tímto způsobem, bude vytvořena ve stejném adresáři, ze kterého byl spuštěn php skript. Pokud potřebujete vytvořit adresář v jiném umístění, můžete zadat relativní cestu k vytvářené složce nebo zadat úplnou cestu z kořenového adresáře webu.

mkdir( "../nová složka" ); // o úroveň níže

mkdir("/složka1/složka2/nová složka"); // celá cesta

V posledním příkladu je předpokladem existence podadresářů "složka1" a "složka2". Pokud tam nejsou, funkce v tomto formuláři nebude moci vytvořit složku a vrátí chybu:

Upozornění: mkdir() : Žádný takový soubor nebo adresář v …

Při úspěchu funkce vrátí hodnotu True. Pokud balíček nebyl vytvořen, vrátí se False.

if (mkdir("nová složka"))
echo "Složka byla úspěšně vytvořena";
jiný
echo "Složka nebyla vytvořena";

Tuto funkci byste však neměli používat bez kontroly přítomnosti složky, protože server bude stále zobrazovat chybu, že složku nelze vytvořit.

Přidělování práv při vytváření složky

Druhý volitelný parametr funkce mkdir je zodpovědný za přiřazení práv k vytvořené složce. Ve výchozím nastavení jsou maximální přidělená oprávnění 0777.

Oprávnění jsou přiřazena jako osmičková hodnota s povinnou nulou na prvním místě. Nepočítáme-li první nulu, čísla označují úrovně přístupu pro vlastníka, pro skupinu vlastníka, pro všechny ostatní.

0 – přístup odepřen;

1 – přístup pro čtení;

2 – přístup pro zápis;

4 – exekuční přístup.

Nejčastěji jsou práva specifikována jako složená částka, například:

7 - plný přístup (1+2+4);

5 - čtení a provádění (1 + 4).

mkdir( "nová složka", 0777); // plný přístup pro každého

Vytváření více vnořených podadresářů

Můžete vytvořit několik podsložek najednou jednoduchým nastavením jednoho dalšího volitelného booleovského parametru – rekurzivního.

mkdir("složka1/složka2/nová složka" , 0777, True); // plný přístup pro každého

V tomto případě, pokud složky "složka1" a "složka2" neexistují, funkce je vytvoří a složku "nová složka". Chybové zprávy, pokud nejsou žádné jiné problémy, se nezobrazí a funkce vrátí hodnotu True.

Odstranění složky

Prázdnou složku v PHP lze odstranit funkcí rmdir. Parametr dirname také určuje úplnou nebo relativní cestu k adresáři, který má být odstraněn:

rmdir( "moje složka");

rmdir("složka1/složka2/mojesložka");

V každém z těchto případů je odstraněna pouze složka "myfolder". Pokud složka neexistuje nebo je nesprávně nastavena cesta, zobrazí se chyba:

Upozornění: rmdir(myfolder): Žádný takový soubor nebo adresář v …

Smazání neprázdné složky

Odstranění neprázdného adresáře se provádí postupným mazáním vnořených souborů ve složce pomocí funkce unlink a poté odstraněním prázdné složky pomocí funkce rmdir. Chcete-li to provést, můžete použít funkci, jako je tato:

funkce my_delete_dir($moje cesta)(
$dir = opendir($moje cesta);
while (($file = readdir($dir)))(
if (je_soubor($moje cesta."/" .$soubor))
unlink($mypath. "/" .$soubor);
elseif (is_dir($moje cesta."/" .$soubor) && ($soubor != "." ) && ($soubor != ".." ))
my_delete_dir ($mypath."/" .$file);
}
closedir($dir);
rmdir($moje cesta);
}

my_delete_dir("myfolder"); // volání funkce

Kontrola, zda adresář existuje

Před většinou operací s adresáři se vyplatí zkontrolovat, zda existují. K tomu slouží funkce file_exists.

Kromě toho se musíte ujistit, že zadaný objekt je složka, nikoli soubor - funkce is_dir. Kontrolovaná složka je určena relativní nebo úplnou cestou.

if (file_exists("myfolder"))
echo "Zadaná složka existuje";
jiný
echo "Zadaná složka neexistuje";

if (is_dir("myfolder"))
echo "Zadaný objekt složky";
jiný
echo "Zadaný objekt není složka";

Popis:

bool file_exists (řetězec $filename)

Zkontroluje existenci zadaného souboru nebo adresáře.

Seznam parametrů:

Cesta k souboru nebo adresáři.

Na platformách Windows pro kontrolu přítomnosti souborů na síťových sdílených položkách použijte názvy jako //název počítače/sdílená_položka/název_souboru nebo \\název_počítače\sdílená_položka\název_souboru.

Návratové hodnoty:

se vrací SKUTEČNÝ pokud soubor nebo adresář určený názvem souboru existuje, jinak vrátí NEPRAVDIVÉ.

Komentář:

Tato funkce se vrací FALS E pro symbolické odkazy směřující na neexistující soubory.

Pozornost!

Pokud jsou soubory nepřístupné kvůli omezením uloženým v nouzovém režimu, tato funkce se vrátí NEPRAVDIVÉ. Tyto soubory však mohou být stále zahrnuty, pokud jsou umístěny v adresáři safe_mode_include_dir.

Komentář:

Komentář:

Protože typ celého čísla PHP je celé číslo se znaménkem a mnoho platforem používá 32bitová celá čísla, některé funkce souborového systému mohou vracet neočekávané výsledky pro soubory větší než 2 GB.

Příklady:

Příklad #1 Kontrola, zda soubor existuje:

$filename = '/cesta/k/foo.txt'; if (file_exists($filename)) ( echo "Soubor $filename existuje"; ) else ( echo "File $filename neexistuje"; )

soubor existuje

(PHP 3, PHP 4, PHP 5)

soubor existuje— Zkontrolujte, zda zadaný soubor nebo adresář existuje

Popis

bool soubor existuje(řetězec názvu souboru)

Vrátí, pokud soubor nebo adresář s názvem určeným názvem souboru existuje; vrátí jinak.

Na platformách Windows pro kontrolu existence souborů na sdílených síťových položkách použijte názvy jako nebo.

Příklad 1: Kontrola, zda soubor existuje

Komentář: Výsledky této funkce se ukládají do mezipaměti. Další informace naleznete v části clearstatcache().

Vodítko: Od PHP 5.0.0 lze tuto funkci použít také s některými obaly adres URL. Seznam packerů podporovaných rodinou funkcí stat(), viz App. M.

Viz také popis funkcí is_readable(), is_writable(), is_file() a soubor().

Viz také:
Soubor všech funkcí
Popis na ru2.php.net
Popis na php.ru

Potřebujete alespoň název souboru v uvozovkách (jako řetězec):

Také se ujistěte, že je správně zkontrolován. A pak to bude fungovat pouze při aktivaci ve vaší konfiguraci PHP

Zkuste to takto:

za prvé potřebuješ rozumět: v nemáte soubory .
Soubor je objekt souborový systém, ale svůj požadavek podáváte pomocí protokolu HTTP, který nepodporuje jiné soubory než adresy URL.

Měli byste si tedy vyžádat nepoužitý soubor pomocí vašeho prohlížeče a podívat se na kód odpovědi.

PHP, kontrola existence/existence vzdáleného souboru

pokud to není 404, nemůžete použít žádné obaly, abyste zjistili, zda soubor existuje, a musíte se zeptat na své cdn pomocí nějakého jiného protokolu, jako je FTP

Zde je nejjednodušší způsob, jak zkontrolovat, zda soubor existuje:

Je velký rozdíl mezi a.

php.net/manual/en/function.is-file.php vrací hodnotu true pro (běžné) soubory:

se vrací skutečný, pokud název souboru existuje a je to běžný soubor, jinak NEPRAVDIVÉ .

vrací true pro soubory i adresáře:

se vrací skutečný, pokud existuje soubor nebo adresář určený názvem souboru; FALSE in v opačném případě.

Poznámka.Pro více informací o tom zkontrolujte také tuto otázku pomocí.

můžete použít cURL. Můžete získat pouze cURL, aby vám dal záhlaví a ne tělo, které by to mohlo zrychlit. Špatná doména může vždy nějakou dobu trvat, protože budete čekat na vypršení časového limitu požadavku; pravděpodobně můžete změnit délku časového limitu pomocí cURL.

Zde je příklad:

Zkus to:

čte nejen soubory, ale i cesty. takže když je prázdný, příkaz bude fungovat, jako by byl napsán takto:

pokud adresář /images/ existuje, funkce se stále vrátí.

Obvykle to píšu takto:

Pokud používáte curl, můžete zkusit následující skript:

Návratové hodnoty

Vrátí, pokud soubor nebo adresář určený parametrem existuje, jinak vrátí.

Komentář:

Tato funkce vrací symbolické odkazy směřující na neexistující soubory.

Jak zkontrolovat, zda adresář v PHP existuje a odstranit jej?

Komentář:

Validace se provádí pomocí skutečných UID/GID, nikoli účinných identifikátorů.

Komentář: Protože typ celého čísla PHP je celé číslo se znaménkem a mnoho platforem používá 32bitová celá čísla, některé funkce souborového systému mohou vracet neočekávané výsledky pro soubory větší než 2 GB.

Příklady

Beispiel #1 Kontrola, zda soubor existuje

Chyby

Pokud se operace nezdaří, vygeneruje se chyba úrovně.

  • is_readable() – Určuje, zda soubor existuje a je čitelný
  • is_writable() - Určuje, zda je soubor zapisovatelný
  • is_file() - Určuje, zda je soubor běžným souborem
  • file() - Přečte obsah souboru a vloží jej do pole

Zpět na: Systém souborů

Test existence

V PHP existují dva způsoby, jak zkontrolovat, zda adresáře existují. První je použít funkci file_exists(). Princip jeho fungování byl rozebrán dříve v článku o přístupových právech. Připomeňme, že funkce přebírá pouze jeden řetězcový parametr – cestu v systému souborů. Navzdory skutečnosti, že název obsahuje slovo „soubor“, funguje s adresáři skvěle.

Druhý způsob souvisí s vestavěnou funkcí is_dir(). Stejně jako file_exists() přijímá relativní nebo absolutní cestu k umístění adresáře. Kromě kontroly existence se ale potvrdí i to, že daná cesta obsahuje adresář a ne soubor. Pokud řetězec popisuje umístění pevného nebo symbolického odkazu, is_dir() k němu přejde a analyzuje koncový bod cesty. Vrátí logickou hodnotu true při úspěchu, false při selhání.

//vytvoří nový adresář v kořenovém adresáři webu pro kontroly $dirName = "($_SERVER['DOCUMENT_ROOT'])/adresář"; if (!file_exists($dirName)) ( mkdir($dirName); ) var_dump(file_exists($dirName)); //Výsledek: bool(true) var_dump(is_dir($dirName)); //Výsledek: bool(true)

Poznámka
Funkce odpovědné za kontrolu existence adresářů mohou vrátit hodnotu false, pokud neexistují žádná přístupová práva. Takové věci nezávisí na PHP skriptu, to je odpovědností operačního systému.

Odebrání adresáře

PHP používá funkci rmdir() k odstranění adresáře. Jako první parametr potřebuje předat umístění adresáře. Analogicky s výše uvedenými příklady budou vráceny booleovské hodnoty true nebo false.

Smazání adresáře se může zdát jako jednoduchý úkol. Ve většině případů tomu tak však není. Funkce rmdir() funguje pouze na prázdném adresáři a vrací false, pokud obsahuje něco jiného. V tomto případě musíte použít rekurzivní mazání.

//vytvoří dočasný adresář pro ukázku $dirName = "($_SERVER['DOCUMENT_ROOT'])/directory"; if (!file_exists($dirName)) ( mkdir($dirName); ) if (rmdir($dirName)) ( echo ‚Adresář byl úspěšně smazán‘; ) else ( echo ‚Nelze smazat adresář‘; )

Rekurzivní mazání

Neexistuje žádný snadný způsob, jak odstranit celý adresář.

Níže uvádíme dva příklady implementace takového mechanismu. Lze jej uložit jako funkci a použít v jakékoli části programového kódu.

První způsob, jak odstranit adresář v PHP, je použít rekurzivní funkci. Tedy funkci, která volá sama sebe při splnění určitých podmínek. Podívejte se na níže uvedený příklad. Je to docela snadné pochopit.

Kontrola, zda soubor v php existuje

K iteraci celého obsahu adresáře používáme standardní funkci scandir(). Pokud narazíme na soubor, zavoláme funkci unlink() a pokud narazíme na jiný adresář, použijeme jeho název pro rekurzivní volání.

//příklad funkce pro rekurzivní smazání dané adresářové funkce deleteDirectory($directoryName) ( $files = array_diff(scandir($directoryName), ['.', '..']); foreach ($files jako $file ) ( if (is_dir ("$název_adresáře/$soubor")) ( deleteDirectory("$název_adresáře/$soubor"); ) else ( unlink("$název_adresáře/$soubor"); ) ) return rmdir($název_adresáře); )

PHP má také dvě vestavěné třídy RecursiveDirectoryIterator a RecursiveIteratorIterator. Lze je použít k iteraci všemi úrovněmi vnoření zadaného adresáře. Všimněte si, že při vytváření instance třídy RecursiveIteratorIterator používáme druhý parametr RecursiveIteratorIterator::CHILD_FIRST. Vynutí procházení všech souborů a adresářů, počínaje těmi nejvíce vnořenými. Můžete se tedy obejít bez explicitního volání rekurzivní funkce.

//příklad funkce, která nepoužívá rekurzivní volání funkce deleteDirectory($directoryName) ( $iterator = new RecursiveDirectoryIterator($directoryName); $files = new RecursiveIteratorIterator($iterator, RecursiveIteratorIterator::CHILD_FIRST); as foreach ($files $file) ( if (in_array($file->getFilename(), ['..', '.'])) (pokračovat; ) ($file->isDir()) ? rmdir($file) : unlink( $file); ) rmdir($directoryName); )

Existují případy, kdy potřebujete zkontrolovat, zda zadaný soubor existuje nebo ne, například za účelem následného provedení některých akcí se souborem.

S tímto problémem jsem se také setkal při vývoji modulu. A našel jsem dvě řešení problému.

Kontrola existence souboru podle URL

V PHP existuje funkce " fopen“, který může otevřít zadanou adresu URL.

Co to děláme? Pokoušíme se otevřít soubor, a pokud uspějeme, pak soubor existuje, jinak soubor neexistuje.

Implementace:

Ale co když nemáme jeden soubor, ale několik, abych tak řekl, řadu odkazů? To je přesně ten úkol, který byl původně přede mnou. A řešení tohoto problému je následující:

V tomto případě získáme seznam pouze těch souborů, které existují.

Kontrola existence místního souboru

Slovo "místní" znamená, že skript a soubory, které mají být zkontrolovány, jsou umístěny na stejném serveru. Pokud máte poměrně velké pole odkazů, je tato možnost nejlepší pro vyřešení problému, protože nepodáváme požadavek na server třetí strany, ale skenujeme zadané adresáře.

Tato metoda používá funkci "file_exists" a analogicky s předchozí verzí jednoduše nahradí část skriptu:

A totéž pro řadu odkazů:

co to stojí Poznámka? Že tato metoda je vhodná pro spouštění souborů, které jsou v našem souborovém systému. Proto je žádoucí uvádět všechny odkazy relativní.

Mimochodem, při jedné z objednávek se mi právě tímto způsobem podařilo naskenovat asi 135 000 souborů za pár sekund.