Ev / Oyun konsolları / Php alt klasörlere en son eklenen dosyayı alır. PHP kullanarak dosya ve dizinlerin listesini alma. SPL Yineleyicilerini Kullanma

Php alt klasörlere en son eklenen dosyayı alır. PHP kullanarak dosya ve dizinlerin listesini alma. SPL Yineleyicilerini Kullanma

Bu derste bir PHP projesi üzerinde çalışırken ortaya çıkan tipik bir görevi ele alacağız: dosya ve dizinlerin listesini almak. Her birinin artılarını ve eksilerini listeleyerek birkaç temel ve daha karmaşık yaklaşımı tartışacağız. İlk üç çözüm standart PHP işlevlerini kullanacak ve ardından SPL yineleyicileri kullanarak daha sağlam bir çözüm sunacağız.

Çözümün ve gösterimlerin ayrıntılı olarak tartışılması amacıyla dizin yapısının aşağıdaki gibi olduğunu varsayacağız:

\---yönetici | \---kullanıcı | \---belge.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Temel çözümler

İlk çözüm kümesi, opendir(), readdir() ve closedir() işlevlerinin bir kombinasyonu olan glob() işlevinin ve ayrıca scandir() işlevinin kullanılmasına dayanmaktadır.

Glob()'u kullanma

İlk çözüm, kalıpları kullanarak yolları aramanıza olanak tanıyan glob() işlevinin kullanılmasına dayanmaktadır. Fonksiyonun iki parametresi vardır:

  • $pattern (gerekli): arama modeli
  • $flags (isteğe bağlı): açıklamaları belgelerde bulunabilecek bir veya daha fazla bayrak

Örneklere bakalım. Bir dizinde adları ile biten tüm dosya ve dizinleri aramak için .txt, kodu kullanmalısınız:

$filelist değişkenini görüntülersek şunu elde ederiz:

Dizi (0 => "makale.txt", 1 => "metin.txt")

Adları “te” ile başlayan dosya ve dizinlerin bir listesine ihtiyacınız varsa kod şöyle görünecektir:

Ve çıktı şöyle görünür:

Dizi (0 => "test.dat", 1 => "text.txt")

Yalnızca "ma" içeren adlara sahip dizinlerin listesini almak için şu kodu kullanın:

Son örnek çıktı verecektir:

Dizi (0 => "yönetici")

Son örneğin, işlevin ikinci parametresi olarak GLOB_ONLYDIR bayrağını kullandığını unutmayın. Bu nedenle master.dat dosyası listeden çıkarılır. Glob() fonksiyonunun kullanımı çok kolay olmasına rağmen bazen yeterince esnek olmayabilir. Örneğin, yalnızca kalıpla eşleşen dosyaları (dizin yok) almak için bir bayrak yoktur.

opendir(), readdir() ve closedir() kullanıyoruz.

Dosya ve dizinlerin bir listesini elde etmek için tartışacağımız ikinci yaklaşım, opendir(), readdir() ve closedir() işlevlerini kullanmaktır.

opendir() işlevi bir dizini açar ve bir bağlantı tanıtıcısı döndürür. Tanıtıcı elde edildikten sonra readdir() işlevi kullanılabilir. Her çağrıda bu işlev, açık dizindeki bir sonraki dosyanın veya dizinin adını döndürür. Tüm adlar zaten listelenmişse işlev şunu döndürür: YANLIŞ. tanıtıcıyı kapatmak için closedir() işlevi kullanılır.

Glob() işlevini kullanmaktan farklı olarak bu yaklaşım daha karmaşıktır çünkü döndürülen dosya ve dizin adları listesini filtrelemeye yardımcı olacak parametreleriniz yoktur. İstediğiniz sonuçları elde etmek için filtrelemeyi kendiniz yapmalısınız.

Aşağıdaki örnek, “te” ile başlayan dosya ve dizin adlarının listesini döndürür:

Yukarıdaki kodu çalıştırırken, $entry değişkeni "." gibi eklemeler içerecektir. Ve "..". Bunlar her dizinde bulunan iki sanal dizindir dosya sistemi. Sırasıyla geçerli dizini ve ana dizini temsil ederler.

İkinci örnek yalnızca verilen dizinde bulunan dosyaları görüntüler.

Örnek aşağıdakileri üretecektir:

Dizi (0 => "article.txt", 1 => "master.dat", 2 => "script.php", 3 => "test.dat", 4 => "text.txt")

Scandir()'ı kullanma

Son olarak scandir() fonksiyonunu tanıtalım. Yalnızca tek bir gerekli parametresi vardır: okuma yolu. İşlev, belirtilen yolda bulunan bir dizi dosya ve dizini döndürür. Belirli bir kritere göre dosya ve dizinlerin bir listesini elde etmek için ek filtreleme yapmanız gerekir. Öte yandan çözüm daha kısadır ve tanıtıcı yönetimi gerektirmez.

Bu örnek, adları "te" ile başlayan dosya ve dizinlerin listesinin nasıl alınacağını gösterir:

SPL yineleyicilerini kullanalım

Şimdi SPL yineleyicilerinin kullanımına bakalım. Ancak problemimizi çözmeye başlamadan önce SPL kütüphanesine ve yineleyicilere bir giriş yapalım. SPL kitaplığı, nesne yönelimli veri yapıları, yineleyiciler, dosya tanımlayıcıları ve daha fazlası için bir dizi sınıf sağlar.

Yineleyicilerin faydalarından biri de sınıf olmaları ve kendi ihtiyaçlarınıza uyacak şekilde genişletilebilmeleridir. Diğer bir avantaj ise yineleyicilerin, birçok ortak sorunu çözmek için yararlı olan ve tek bir yerde bulunan kendi yöntemlerine sahip olmasıdır. FilesystemIterator yerine readdir() kullanımının bir örneğine bakın. Her iki yöntem de bir döngü kullanır, ancak readdir() ile yalnızca bir dizeyi işlersiniz; FilesystemIterator ise dosya veya dizin hakkında ek bilgiler (boyut, sahip, izinler vb.) içerebilen bir nesneyle çalışır.

Elbette PHP, dosya boyutu() ve dosya sahibi() gibi işlevleri kullanarak bu tür bilgileri elde etme olanağı sağlar. Ancak PHP5, OOP konseptini kullanmaya dayanmaktadır. Bu nedenle kullanmak daha iyidir modern yöntemler bir programlama diliyle çalışmaktadır. Web sitemizde yineleyicilerle çalışmaya ilişkin dersler bulunmaktadır.

Eğitimin kısa bölümünde de belirtildiği gibi FilesystemIterator, RecursiveDirectoryIterator ve GlobIterator'ın kullanımına bakacağız. İlki DirectoryIterator'dan, geri kalanı ise FilesystemIterator'dan miras alır. Hepsi iki parametre alan aynı kurucuya sahiptir:

  • $yol (gerekli): üzerinde işlemlerin gerçekleştirildiği dosya sistemi girişinin yolu
  • $flags (isteğe bağlı): belgelerde listelenen bir veya daha fazla bayrak

Bu yineleyicilerdeki asıl fark, belirli bir yol boyunca gezinmek için nasıl kullanıldıklarıdır.

Dosya SistemiYineleyici

FilesystemIterator'ı kullanmak çok basittir. Uygulamalı olarak görelim. İki örnek sunuyoruz. İlki, adları “te” ile başlayan tüm dosya ve dizinlerin aranmasını gösterir. İkinci örnekte, adları “t.dat” veya “t.php” ile biten tüm dosya ve dizinleri bulmak için başka bir RegexIterator kullanılıyor. RegexIterator, sonucu düzenli ifadelere göre filtrelemek için kullanılır.

getFilename(), "te") === 0) ( $filelist = $entry->getFilename(); ))

Yukarıdaki kod önceki örneklere benzer bir sonuç üretecektir.

RegexIterator'ı kullanan ikinci örnek:

getDosyaadı(); )

Çıktı verecektir:

Dizi (0 => "script.php", 1 => "test.dat")

RecursiveDirectoryIterator

RecursiveDirectoryIterator, dosya sistemi dizinlerini yinelemeli olarak dolaşmak için bir arayüz sağlar. Geçerli konum bir dizin ise yineleyici döndüren ve geçerli giriş noktasının bir dizin olup olmadığını kontrol eden getChildren() ve hasChildren() gibi birkaç yararlı yöntemi vardır. Aşağıdaki örnek, RecursiveDirectoryIterator ve getChildren() öğelerinin kullanımını gösterir. Sonuç önceki örneklerdeki ile aynı olacaktır.

getChildren(), "/t\.(php|dat)$/"); $dosyalistesi = dizi(); foreach($filter as $giriş) ( $filelist = $giriş->getFilename(); )

GlobYineleyici

GlobIterator, dosya sistemi boyunca glob() işleviyle aynı şekilde yinelenir. İlk parametre ad için bir kalıp içerebilir. Örnek, daha önce olduğu gibi aynı sonuçla GlobIterator'ın kullanımını göstermektedir.

getDosyaadı(); )

Çözüm

Bu ders aynı hedefe ulaşmak için farklı yaklaşımların kullanımını gösterir: dosya ve dizinlerin bir listesini elde etmek. Aşağıdaki önemli noktalar unutulmamalıdır:

  • Glob() işlevi yerleşik bir çözümdür ancak yeterince esnek değildir.
  • opendir(), readdir() ve closedir() tabanlı bir çözüm daha karmaşıktır ve ek filtreleme gerektirir ancak daha esnektir.
  • scandir() işlevi ek filtreleme gerektirir ancak tanıtıcıyı işlemeden çalışır.
  • OOP yaklaşımını kullanıyorsanız SPL kütüphanesini kullanmalısınız. Ek olarak sınıfları kendi işlevselliğinizle genişletebilirsiniz.
  • GlobIterator'ın ön filtreleme özelliği vardır, diğerleri ise RegexIterator'ı kullanır.

Reg.ru: etki alanları ve barındırma

Rusya'nın en büyük kayıt şirketi ve barındırma sağlayıcısı.

2 milyondan fazla alan adı hizmette.

Promosyon, alan adı postası, iş çözümleri.

Dünya çapında 700 binden fazla müşterimiz şimdiden tercihini yaptı.

*Kaydırmayı duraklatmak için farenin üzerine gelin.

Geri İleri

PHP kullanarak klasörlerin listesini alma

PHP kullanarak dizinleri listelemek veya dizinleri listelemek

Dizin listelemeyi, ana dizinin tüm veya bazı dosya ve dizinlerinin bir listesini oluşturan genel bir sorgu olarak adlandıracağız; bu, çoğu web sunucusu tarafından sağlanan dizin sayfasının çalışmasına benzer, ancak O içeriği ve formatı üzerinde daha fazla kontrol.

Bu betiğin bir diğer avantajı da PHP kullanarak dosyalarla belirli eylemleri gerçekleştirme yeteneğidir. Her durumda yapmamız gereken ilk adım dosya sistemini sorgulamak, dosya ve dizinlerin bir listesini döndürmek.

Aşağıda sunulan işlevler, belirli bir dizinden dosya adlarını ve diğer özellikleri çıkarmanıza veya alt kategoriler arasında yinelemeli olarak yineleme yapmanıza olanak tanır.

Yorum: PHP5'in bir işlevi var tarama dizini, "belirli bir yoldaki bir dizindeki dosya ve dizinlerin listesini döndürür", ancak dizinin içindeki dosyalar hakkında herhangi bir ek bilgi görüntülemez.

Bir dizini listeleme

Başlangıç ​​olarak, burada tek bir dizindeki dosyaların, dizinlerin ve bunların özelliklerinin bir listesini döndüren basit bir fonksiyon örneği verilmiştir (bu fonksiyonun daha gelişmiş versiyonlarını bu derste biraz sonra bulacaksınız.)

read())) ( // gizli dosyaları atla if($entry == "."") devam et; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ giriş/", "boyut" => 0, "lastmod" => filemtime("$dir$entry")); ) elseif(is_readable("$dir$entry")) ( $retval = array("name" = > "$dir$entry", "size" => dosya boyutu("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

$geri dönüş;

) ?>

Bu işlevi aşağıdaki gibi kullanabilirsiniz:

Dönüş değeri, dosyanın yol bilgisini, boyutunu ve son değiştirilme tarihini içeren ilişkisel bir dosya dizisidir; dosya bir dizin olmadığı sürece, bu durumda dosya boyutu yerine "(dir)" dizesi görünür.Örnek 1:

",print_r($dizinlistesi),"

Dönüş değeri, dosyanın yol bilgisini, boyutunu ve son değiştirilme tarihini içeren ilişkisel bir dosya dizisidir; dosya bir dizin olmadığı sürece, bu durumda dosya boyutu yerine "(dir)" dizesi görünür."; /* örnek çıktı Array ( => Array ( => resimler/background0.jpg => resim/jpeg => 86920 => 1077461701) => ...) */ ?>

Örnek 2:

"; /* örnek çıktı Array ( => Array ( => ./images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Dosyaları HTML yoluyla listeleme Sayfadaki çıktı sonuçlarını HTML olarak almak için döndürülen dizide döngü yapacağız\n"; yankı "İsimTip Boyut Dosyaları HTML yoluyla listeleme Son Mod. Dosyaları HTML yoluyla listeleme \n"; foreach($dirlist as $dosya) ( echo " Dosyaları HTML yoluyla listeleme ($dosya["isim"]) Dosyaları HTML yoluyla listeleme Dosyaları HTML yoluyla listeleme($dosya["tür"])($dosya["boyut"])

\n"; ) yankı "

  • \n\n"; ?>
  • Bu kodu değiştirmek oldukça kolaydır, örneğin:
  • - listeleme sonuçlarını tablo yerine liste olarak görüntüleyin;
  • - dosya adlarını aktif bağlantılar haline getirin;

- ne tür dosya olduğuna bağlı olarak adları simgelerle değiştirin;

Dosyaları HTML yoluyla listeleme Sayfadaki çıktı sonuçlarını HTML olarak almak için döndürülen dizide döngü yapacağız\n"; yankı "İsimTip vesaire. Dosyaları HTML yoluyla listeleme Son Mod. Dosyaları HTML yoluyla listeleme \n"; foreach($dirlist as $dosya) ( echo " Dosyaları HTML yoluyla listeleme ($dosya["isim"]) Dosyaları HTML yoluyla listeleme Örneğin, yalnızca PNG dosyalarının çıktısını almak için çıktı döngüsüne basit bir koşul ekleyin: Dosyaları HTML yoluyla listeleme($dosya["tür"])($dosya["boyut"])

\n"; foreach($dirlist as $file) ( //dosyanın PNG olup olmadığını kontrol edin if(!preg_match("/\.png$/", $file["name"])) devam et; echo " ",tarih("r", $dosya["sonmod"]),". Ayrıca dosya türüne, boyutuna veya son değiştirilme tarihine göre ek koşullar da uygulayabilirsiniz.

Örneğin, bir küçük resim, daha büyük bir resmin bağlantısını veya hatta bir videoyu görüntülemek istiyorsanız, bu 2 dosyaya aynı adları verin ve yukarıdaki komut dosyasında şunu kullanın: str_değiştir veya bağlantıların içeriğini değiştirmek için benzer bir işlev.

Özyinelemeli dizin listesi

Buraya kadar geldiğimizden beri, özyinelemeli liste ve alt kategori çağırma işlevinde yalnızca küçük değişiklikler olacak. Fonksiyona ikinci bir parametre ekleyerek, önceki tek bir dizini listeleme fonksiyonunu koruyoruz.

read())) ( // gizli dosyaları atla if($entry == "."") devam et; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ giriş/", "boyut" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) ( $retval = array_merge($ retval, getFileList("$dir$entry/", true)) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size " => dosya boyutu("$dir$entry"), "lastmod" => filemtime("$dir$entry")); ) $d->close();

$geri dönüş; ) ?> Yeni işlevin çalışması için bir değer girmeniz gerekir

doğru

(veya 1) ikinci parametre olarak.

Betiği tekrarlamadan önce alt dizinlerin okunabilir olup olmadığını kontrol edin ve erişim hatalarını önlemek için bu dersin son paragrafını da okuyun.

Daha önce olduğu gibi, dönüş değeri bir dizidir, ilişkisel bir dizidir. Aslında tek ekleme, özyinelemeli listeleme için başka bir ek seçenektir.

read())) ( // gizli dosyaları atla if($entry == "."") devam et; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ giriş/", "boyut" => 0, "lastmod" => filemtime("$dir$giriş")); if($recurse && is_readable("$dir$giriş/")) ( if($derinlik == = false) ( $retval = array_merge($retval, getFileList("$dir$giriş/", doğru)); ) elseif($derinlik > 0) ( $retval = array_merge($retval, getFileList("$dir$giriş) /", true, $derinlik-1)); ) ) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size" => dosya boyutu("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

$geri dönüş; ) ?> Daha önce olduğu gibi yalnızca 1 ekledik YANLIŞ yeni parametre

ve birkaç satır kod. Özyineleme derinliğinden sorumlu varsayılan değer belirtilmemişse, şu şekilde ayarlanır:

. Bu, önceki özelliklerin kaldığından ve işlev değiştiğinde sonraki kodun "bozulmayacağından" emin olmamızı sağlar.

Dosyalarla çalışma

Dosyalarla işlem yapma ihtiyacı programcının sıklıkla karşılaştığı bir durumdur. Komut dosyalarınız veritabanları kullanmıyorsa, dosyalar komut dosyası için kabul edilebilir tek depolama aygıtıdır. Dosyaların komut dosyası yürütme bilgilerinin depoları olarak kullanılması, bunların çok çeşitli durumlarda kullanılmasına olanak tanır. Hemen hemen tüm sayaç komut dosyaları, dosyalarla çalışmaya dayalı olarak yazılmıştır. Daha bir sürü örnek vermek de mümkün ama artık doğrudan sözden eyleme geçmenin zamanı geldi.

Dosyayla çalışmanın yetkilendirilmesi gerektiğini hemen söylemek istiyorum. Varsayılan olarak PHP, güvenlik nedeniyle dosya manipülasyonuna izin vermez. CuteFTP FTP yöneticisinde bu yasağı kaldırmak için dosya özelliklerindeki tüm kutuları işaretleyin; diğer yöneticilerin de benzer bir şeye sahip olması gerekir. dosya_var Bir dosya üzerinde işlem yapmadan önce genellikle belirtilen dosyanın mevcut olduğundan emin olmanız gerekir. file_exists fonksiyonunun yaptığı budur. Bu fonksiyon tahmin edebileceğiniz gibi yalnızca iki değer döndürebilir DOĞRU(belirtilen dosya mevcutsa) ve

YANLIŞ

. Genellikle bu işlevin kullanılması şuna benzer:

Lütfen işlevin yalnızca yerel dosyalarda çalıştığını, yani Yandex'in bir robot.txt dosyası alıp almadığını kontrol etmek istiyorsanız çabalarınızın boşuna olacağını unutmayın. Ancak yerel sunucuda bulunan herhangi bir dosyayı, konumunun dizinine bakılmaksızın kontrol etmek mümkündür.

Adından da anlaşılacağı gibi, işlev dosya boyutunu belirler ve onu bayt cinsinden döndürür. Bir dosyayı bilgi içerip içermediğini kontrol etmek istiyorsanız kullanışlıdır (tahmin edebileceğiniz gibi, boş bir dosya 0 bayt içerir) ve belirli bir sınırı aşıp aşmadığını görmek için dosya boyutunu kontrol etmek de mümkündür.

dosya

Bu işlev zaten doğrudan dosyayla çalışıyor. Belirtilen dosyanın içeriğini döndürür ve bunu her öğenin dosyanın bir satırı olduğu bir dizi biçiminde yapar. İşlev, kesişmemesi gereken birkaç farklı değeri tek bir dosyada saklamanız gerektiğinde kullanışlıdır. Daha sonra her değer ayrı bir satırda saklanır ve bir dizi döndüren dosya işlevi tarafından okunur, böylece verilen değişkene, dizi öğesinin değeri, dosyadaki satıra karşılık gelen indeksle okunarak erişilir.

Döndürülen dizinin tüm öğelerini tek bir değişkende yeniden birleştirmek de mümkündür. Bu, diziyi patlat işlevi kullanılarak yapılır.

açık

Önceki işlev bağımsızsa ve genellikle diğer işlevlerle ilişkili değilse, dosyalarla çalışmaya yönelik sonraki işlevler fopen ile birlikte çalışır. Bu işlev belirtilen dosyayı açar ve hizmet amacıyla kullanılan dosya bağlantı tanımlayıcısını döndürür. Bu işlev hiçbir şekilde dosyanın içeriğiyle ilişkili değildir.

Fopen işlevinin bir dosyayla çalışmak için çeşitli modları vardır. Dosya adından sonra belirtilirler ve aşağıdaki gibidirler:

    "R"
    Dosya yalnızca içeriğinin okunması için açılır.

    "r+"
    Bir dosyayı hem okumak hem de yazmak için açmak.

    "w"
    Dosya yazma amacıyla açılmıştır.

    "w+"
    Dosyayı okumak ve yazmak için açın.

    "A"
    Dosya sonuna yazmak (eklemek) için dosya açılır.

    "bir+"
    Daha fazla yazmaya ve okumaya açılır.

fgets

Fopen işlevi tarafından açılan bir dosyayı okuma işlevi. Ancak file'den farklı olarak bu işlev, her yürütüldüğünde dosyanın yalnızca bir satırını döndürür ve dahili dosya işaretçisini, işlevin bir sonraki çağrılışında okuyacağı bir sonraki satıra taşır. Dolayısıyla dosyanın tamamını okumak gerekiyorsa bu fonksiyonu döngü halinde kullanmanız gerekir.

fgets işlevinin, okunacak dosya satırının maksimum uzunluğunu belirten ek bir uzunluk parametresi kullandığını unutmayın. Dizenin boyutu bu sayıyı aşarsa, işlev onu "kesilmiş" uzunluk bayt biçiminde döndürür. Varsayılan olarak bu parametre 1024 bayta veya bir kilobayta ayarlanmıştır. Büyük dosyalar kullanıyorsanız bu parametreye özellikle dikkat edin, çünkü bu tür dosyaları okurken PHP yürütme arabelleği taşabilir (boyutu yapılandırma dosyasında belirtilir), bu da donmaya neden olur.

Okunacak dosyanın dosya adı değil, fopen işlevi tarafından döndürülen dosya bağlantısı tanımlayıcısı (örneğimizde $file değişkeninin değeri) olduğunu unutmayın.

fput'lar

Bir dosyaya bilgi yazma fonksiyonudur ve bunu fgets fonksiyonunun çalışma prensibine göre yapar yani dahili dosya işaretçisinin konumundan yazmaya başlar. Genel olarak, bu işlev birçok yönden yukarıdakine benzer: aynı zamanda isteğe bağlı olan yazma veri uzunluğu parametresini de kullanır.

fclose

Tahmin edebileceğiniz gibi bu fonksiyon belirtilen dosyayı kapatır. Aslında, betiğin tamamlanmasının ardından PHP tüm açık dosyaları kendisi kapatır, ancak bunu manuel olarak yapmak yine de daha iyidir. İşlev parametresi olarak dosya bağlantısı tanımlayıcısını belirtmeniz gerekir.

Yukarıdaki işlevlerin kombinasyonunu göstermek için basit bir ziyaret sayacı oluşturma örneği vereceğiz.

$dosya = fopen("counter.txt", "r");
$c = fgets($dosya, 150);
fclose($dosya);
$c++;
$dosya = fopen("counter.txt", "w");
fputs($dosya, $c);
fclose($dosya);
yankı $c;
?>

Dizinlerle çalışma

Dosyalar üzerindeki eylemlerle yakından ilgili olan, dizinlerdeki işlemlerdir. Onlarla çalışmanın algoritması, dosyalar üzerindeki işlemlere benzer: önce dizini açmanız, bazı eylemler gerçekleştirmeniz ve son olarak onu kapatmanız gerekir.

açık dizin

Bu işlev belirtilen dizini açar ve dizin bağlantısının hizmet tanımlayıcısını döndürür. Dizin yolları aşağıdaki gibi belirtilmelidir:

Nokta geçerli dizini açmak anlamına gelir

. /dosyalar/

Bir klasörü açma dosyalar geçerli dizinde bulunur

Geçerli olandan bir seviye daha yüksek bir klasörün açılması

okumadir

İşlev opendir tarafından açılan dizini okur. Her geçişte, belirtilen dizinde bulunan dosya veya klasörün adını döndürür ve dahili işaretçiyi bir sonraki dizin nesnesine taşır. Bu nedenle dizinin tamamını okumak için bir döngüde kullanılması gerekir.

Bu işlevin klasör hizmeti nesnelerini döndürdüğüne de dikkat edilmelidir. . Ve .. IF ifadesi tarafından çıktı alındığında kesilebilen.

kapat

Klasör bağlantı tanımlayıcısını argüman olarak belirterek dizini kapatıyoruz.

Bazen dizin işlevlerini kullanmak hayatı çok daha kolaylaştırır. Örneğin Özellikler bölümünde özelliklerin alfabetik sıraya göre listesini görebilirsiniz. Bu listenin tamamını bağlantılarla birlikte ve hatta alfabetik sıraya göre manuel olarak yazmanın ne kadar zaman alacağını hayal edebiliyor musunuz? Dizinlerle çalışma fonksiyonlarının bana yardımcı olduğu yer burasıdır. Her işlev, herhangi bir uzantı olmadan, işlevin adına karşılık gelen bir adla ayrı bir dosyaya yerleştirildi.

Böylece sayfayı her ziyaret ettiğinizde yeni oluşturulmuş bir işlevler listesiyle karşılaşırsınız.

Hepsi bu. Bir sonraki derste görüşürüz.

Dizin listeleme, belirli bir ana dizin için dizinler ve dosyalar hakkında bilgi edinmenin yanı sıra çıktıyı düzeltmek için bu verilere çeşitli filtreler uygulama yeteneğidir.

Bu örnekte hemen hemen her uygulamada karşımıza çıkan tipik bir görevle baş etmeye çalışacağız. PHP proje - dizinlerin ve/veya dosyaların bir listesinin alınması. Örnekte, her tekniğin artılarını ve eksilerini özetleyen birkaç temel ve daha karmaşık yaklaşım kullanılmaktadır. İlk üç çözüm standart PHP işlevlerini kullanır. PHP SPL yineleyicilerini kullanan en yeni ve daha güvenilir çözüm.


Daha görsel bir gösterim için şuna benzeyen bir dizin yapısı kullanıyoruz:


\-Uygulama | \-Kullanıcı | \-data.apk | \-style.css | \-test.txt |-benioku.txt |-script.php |-serial.txt |-test.html |-test.js

Temel çözümler
İlk örnek grubu işlevleri kullanır küre() ve fonksiyon kombinasyonları açıkdir(), okumadir(), kapat dizin(), ayrıca işlevi taramadir().

Glob()'u kullanma

Kullanım örneği php fonksiyonları küre() bir desen kullanarak yol aramanıza olanak tanır.
İşlev küre( $desen,$bayraklar) iki argümanla çalışır:
  • $desen(gerekli): arama modeli dizesi
  • $bayraklar
    • GLOB_MARK- Döndürülen her dizine bir eğik çizgi ekler.
    • GLOB_NOSORT- Dosyaları dizinde bulundukları biçimde (sıralamadan) döndürür. Bu bayrak belirtilmezse adlar alfabetik olarak sıralanır.
    • GLOB_NOCHECK- Kullanılarak hiçbir dosya bulunamazsa bir arama modeli döndürür.
    • GLOB_NOESCAPE- Ters eğik çizgiler meta karakterlerden kaçmaz.
    • GLOB_BRACE- (a,b,c)'yi "a", "b" veya "c" ile eşleşecek şekilde genişletir.
    • GLOB_ONLYDIR- Yalnızca kalıpla eşleşen dizinleri döndürür.
    • GLOB_ERR- Okuma hatalarında durur (örneğin, okuma izni olmayan dizinler), varsayılan olarak hatalar göz ardı edilir.
Bir dizinde adları .txt ile biten tüm dosya ve dizinleri aramak için aşağıdaki kodu kullanın:Çıktıda şu sonucu elde ederiz: array(2) ( => string(10) "readme.txt" => string(10) "serial.txt" ) Adları aynı olan dosya ve dizinlerin bir listesini almanız gerekiyorsa "te" ile başlayın:Çıktıda şu sonucu elde ederiz: array(2) ( => string(9) "test.html" => string(7) "test.js" ) Listede yalnızca "er" içeren adlara sahip dizinleri alma:Çıktıda şu sonucu elde ederiz: array(1) ( => string(4) "User" )

Son örnek bayrağı kullanıyor GLOB_ONLYDIR işlevin ikinci argümanı olarak. Bu nedenle listede yalnızca “er” içeren isimdeki “Kullanıcı” dizini yer aldı. Glob() işlevinin kullanımı çok kolaydır ancak bazen yeterince esnek olmayabilir. Yalnızca kalıpla eşleşen dosyaları (dizin yok) almak için bayrak yoktur.

opendir(), readdir() ve closedir()'i kullanma.

Dosya ve dizinlerin listesini almanın bir sonraki yöntemi PHP işlevlerini kullanmaktır. açıkdir(), okumadir() Ve kapat dizin().

İşlev açıkdir() açık dizine bir tanıtıcı döndürür. Tutamaç alındıktan sonra işlevi kullanabilirsiniz. okumadir(). Bir tanıtıcıya erişirken, işlev okumadir() sonraki dosya veya dizinin adını görüntüler. Tanımlayıcının içerdiği tüm öğeler zaten numaralandırılmışsa, işlev okumadir() geri dönecek YANLIŞ. Tanımlayıcıyı kapatmak için işlevi kullanırız kapat dizin().


Php işlevini kullanmanın aksine , bu yaklaşım biraz daha karmaşıktır. Döndürülen dosya ve dizin adlarının bir listesinin oluşturulmasına yardımcı olacak filtreleme parametrelerini önceden ayarlamak mümkün değildir. Gerekli dosya ve dizin listesini elde etmek için filtrelemenin bağımsız olarak yapılması gerekir.


Aşağıdaki örnek, "Biz" ile başlayan dosya ve dizin adlarının bir listesini döndürür:Çıktı şu şekilde olacaktır: array(1) ( => string(4) "User" ) Aşağıdaki örnek yalnızca verilen dizinde bulunan dosyaların çıktısını alacaktır.Çıktıda şu sonucu elde ederiz: array(5) ( => string(10) "script.php" => string(7) "test.js" => string(9) "test.html" => string (10) "serial.txt" => string(10) "benioku.txt")

Scandir()'ı kullanma.

Bitirmek için, bir php işlevi kullanma örneğine bakalım taramadir(). Gerekli olan tek bir özelliği vardır; okuma dizininin yolu. İşlevin sonucu, bağımsız değişkende belirtilen yol boyunca yer alan bir dizi dosya ve dizindir. Önceki örnekte olduğu gibi, filtrelenmiş bir dosya ve dizin listesi elde etmek için onu kendiniz çalıştırmalısınız. Görsel olarak çözüm daha kısadır ve tanımlayıcı yönetimine gerek yoktur.


Örnek, adları "te" ile başlayan dosya ve dizinlerin listesinin nasıl alınacağını gösterir:Çıktıda şu sonucu elde ederiz: array(2) ( => string(9) "test.html" => string(7) "test.js" )

PHP SPL kullanan gelişmiş çözüm
SPL yineleyicilerini kullanan daha güvenilir çözüm Dosya SistemiYineleyici, RecursiveDirectoryIterator Ve GlobYineleyici.

SPL yineleyicilerini kullanma.

SPL yineleyicilerini kullanmaya bakalım. Sorunu çözmeye başlamadan önce PHP SPL kütüphanesi ve yineleyicileri hakkında biraz bilgi sahibi olalım. SPL kitaplığı, nesne yönelimli veri yapıları, yineleyiciler, dosya tanımlayıcıları ve daha fazlası için özel sınıf kümeleri sağlar.


Yineleyicilerin temel avantajı sınıf olmaları ve standart bir mekanizma kullanılarak genişletilebilmeleridir. php mirası sınıflar. Diğer bir artı, yineleyicilerin ortak sorunları çözmek için yararlı olabilecek kendi yöntemlerine sahip olmaları ve hepsinin tek bir yerde bulunmasıdır. Bir kullanım örneğine bakalım Dosya SistemiYineleyici ve şununla karşılaştır: okumadir(). Her iki yöntem de bir döngü kullanır, ancak okumadir() yalnızca dizeyi işlemek mümkün olacak, ancak Dosya SistemiYineleyici bir nesneyle çalışabilir. Dosya veya dizin hakkında sahip, boyut, erişim hakları vb. gibi ek bilgiler içerebilir.


Elbette PHP'nin bu bilgiyi işlevleri kullanarak elde etme yeteneği vardır, dosya boyutu(), dosya sahibi() ve diğerleri. Ancak PHP, herhangi bir programlama dili gibi değişme yeteneğine sahiptir. PHP5'te OOP kavramlarını kullanma isteği giderek artıyor. Bu nedenle, bir programlama diliyle modern çalışma yöntemlerini kullanmak daha iyidir.


Kullanmayı düşünün Dosya SistemiYineleyici, RecursiveDirectoryIterator Ve GlobYineleyici. İlk yineleyici aşağıdakilerden miras alır: DizinYineleyici ve geri kalanı Dosya SistemiYineleyici. Hepsi iki argüman alan aynı kurucuya sahiptir:

  • $yol(zorunlu): üzerinde işlemlerin gerçekleştirildiği dosya sistemi öğesinin yolu
  • $bayraklar(isteğe bağlı): bir veya daha fazla bayrak
    • FilesystemIterator::CURRENT_AS_PATHNAME FilesystemIterator::current() yönteminin bir yol döndürmesine neden olur.
    • FilesystemIterator::CURRENT_AS_FILEINFO FilesystemIterator::current() yönteminin SplFileInfo örneğini döndürmesine neden olur.
    • FilesystemIterator::CURRENT_AS_SELF FilesystemIterator::current() yönteminin $this (FilesystemIterator) döndürmesine neden olur.
    • Dosya SistemiYineleyici::CURRENT_MODE_MASK Maskeler FilesystemIterator::current()
    • Dosya SistemiYineleyici::KEY_AS_PATHNAME FilesystemIterator::key() yönteminin bir yol döndürmesine neden olur.
    • FilesystemIterator::KEY_AS_FILENAME FilesystemIterator::key() yönteminin dosya adını döndürmesine neden olur.
    • FilesystemIterator::FOLLOW_SYMLINKS RecursiveDirectoryIterator::hasChildren() yöntemini sembolik bağları izlemeye zorlar.
    • Dosya SistemiYineleyici::KEY_MODE_MASK Maskeler FilesystemIterator::key()
    • FilesystemIterator::NEW_CURRENT_AND_KEY FilesystemIterator::KEY_AS_FILENAME ile aynı | FilesystemIterator::CURRENT_AS_FILEINFO.
    • FilesystemIterator::SKIP_DOTS Nokta dosyalarını (. ve ..) atlar.
    • FilesystemIterator::UNIX_PATHS Sistem varsayılan ayarlarından bağımsız olarak tüm yolları Unix tarzı ters eğik çizgiler kullanmaya zorlar.

Bu yineleyicilerin farkı, belirli bir yol boyunca gezinmek için nasıl kullanıldıklarıdır.

Dosya SistemiYineleyici

Kullanmak Dosya SistemiYineleyiciçok basit.
Örnekte, adları "te" ile başlayan tüm dosya ve dizinlerin aranması gösterilmektedir.

getFilename(),"te")===0): $arFileList = $obFile->getFilename();

endif; uçtan uca; //Sonucu göster var_dump($arFileList); ?> Çıktıda şu sonucu elde ederiz: array(2) ( => string(7) "test.js" => string(9) "test.html" ) Başka bir yineleyici kullanma örneği RegexYineleyici Başka bir yineleyici kullanma örneği adları "t.js" veya "t.php" ile biten tüm dosya ve dizinleri aramak için. Yineleyici

sonucu filtrelemek için kullanılır ve düzenli ifade motoru kullanır.

RecursiveDirectoryIterator

getDosyaadı(); uçtan uca; //Sonucu göster var_dump($arFileList); ?> Çıktıda şu sonucu elde ederiz: array(2) ( => string(10) "script.php" => string(7) "test.js" ) RecursiveDirectoryIterator Yineleyici dosya sistemi dizinlerini yinelemeli olarak dolaşmak için bir arayüz sağlar. Gibi çeşitli yararlı yöntemlere sahiptir. Ve getChildren()Çocukları var()


RecursiveDirectoryIterator Ve dosya sistemi dizinlerini yinelemeli olarak dolaşmak için bir arayüz sağlar. Gibi çeşitli yararlı yöntemlere sahiptir.. , eğer bir dizin ise geçerli konum için bir yineleyici döndürür ve geçerli giriş noktasının bir dizin olup olmadığını kontrol eder. getChildren(), "/t\.(txt|css)$/"); $arFileList = dizi(); foreach($rxIterator as $obFile): $arFileList = $obFile->getFilename(); uçtan uca; //Sonucu göster var_dump($arFileList); ?> Çıktıda aşağıdaki sonucu elde ederiz: bu durumda

GlobYineleyici

getDosyaadı(); uçtan uca; //Sonucu göster var_dump($arFileList); ?> Çıktıda şu sonucu elde ederiz: array(2) ( => string(10) "script.php" => string(7) "test.js" ) GlobYineleyici benzer bir dosya geçişi gerçekleştirir. İlk özellik bir ad modeli içerebilir.


Örnek kullanımı göstermektedir GlobYineleyiciöncekiyle aynı sonuçla.getDosyaadı(); uçtan uca; //Sonucu göster var_dump($arFileList); ?> Çıktıda şu sonucu elde ederiz: array(2) ( => string(10) "/test.html" => string(8) "/test.js" )

Çözüm

Yukarıdaki örnekler dikkate alındı çeşitli yöntemler PHP aynı hedefe ulaşmak için: dosya ve dizinlerin bir listesini almak.

Örneklerden aşağıdaki ana noktalar vurgulanabilir: