পিএইচপি স্ক্রিপ্ট একটি ডিরেক্টরি সব ফাইল মাধ্যমে লুপ?


131

আমি এমন একটি পিএইচপি স্ক্রিপ্ট খুঁজছি যা কোনও ডিরেক্টরিতে থাকা সমস্ত ফাইলের মধ্য দিয়ে লুপ করে দেয় তাই আমি ফাইলের নাম দিয়ে যেমন ফর্ম্যাট, মুদ্রণ বা এটি কোনও লিঙ্কে যুক্ত করতে পারি things আমি নাম, টাইপ বা তৈরি তারিখ অনুসারে / যুক্ত / সংশোধিত ফাইলগুলি বাছাই করতে সক্ষম হতে চাই। (ভাবুন অভিনব ডিরেক্টরি "সূচক"।) আমি নিজেও স্ক্রিপ্ট বা অন্যান্য "সিস্টেম" ফাইলগুলির মতো ফাইলের তালিকায় ব্যতিক্রম যুক্ত করতে সক্ষম হতে চাই। ( .এবং .."ডিরেক্টরিগুলি" পছন্দ করুন ))

আমি স্ক্রিপ্টটি সংশোধন করতে সক্ষম হতে চাই, আমি পিএইচপি ডক্সটি দেখতে এবং নিজের একটি কীভাবে লিখতে হয় তা শিখতে আগ্রহী। এটি বলেছে যে যদি কোনও বিদ্যমান স্ক্রিপ্ট, টিউটোরিয়াল এবং হোয়াইট নোট না থাকে তবে দয়া করে আমাকে জানান।


উত্তর:


245

আপনি ডিরেক্টরি নির্দেশক ব্যবহার করতে পারেন । পিএইচপি ম্যানুয়াল থেকে উদাহরণ:

<?php
$dir = new DirectoryIterator(dirname(__FILE__));
foreach ($dir as $fileinfo) {
    if (!$fileinfo->isDot()) {
        var_dump($fileinfo->getFilename());
    }
}
?>

3
দ্রষ্টব্য: অনেক সার্ভারে এসপিএল ইনস্টল করা নেই, সুতরাং আপনি ডিরেক্টরিকোষক শ্রেণিটি ব্যবহার করতে পারবেন না (নীচে আমার বিকল্প পোস্টটি দেখুন)। আপনি যদি পারেন তবে এটি ব্যবহার করুন!
NexusRex

4
দ্রষ্টব্য [2]: আপনি নিশ্চিত যে নিশ্চিত হয়ে গেছেন যে dirname()উপরের ফাংশনটি আপনি যেদিকেই রাখুন না কেন তার মূল ফোল্ডারটি পাবেন। আমার ক্ষেত্রে, আমি ধরে নিয়েছিলাম যে নাম নামটি ডিরেক্টরি নাম / পথের জন্য একটি মোড়ক, তাই এটির প্রয়োজন হয়নি।
willdanceforfun

এছাড়াও, নামটি যদি এটি একটি বৃহত ফাইল সিস্টেম হয় তবে মেমরির সমস্যাগুলি স্পষ্ট। আমার ক্ষেত্রে 1 মিলিয়ন ফাইল সহ, অ্যাপ্লিকেশানের মেমরি_লিমিটের জন্য ~ 512M র্যাম প্রয়োজন।
আব্রিম

1
আপনার যদি /home/examples/banana.jpgব্যবহারের মতো সম্পূর্ণ পাথের প্রয়োজন হয়$fileinfo->getPathname()
মিলিগুট

আপনি ডিরেক্টরিতে ক্রিয়া এড়ানোর জন্য $ fileinfo-> isDir () ব্যবহার করতে পারেন
LeChatNoir

44

আপনার যদি ডিরেক্টরীআইটার শ্রেণিতে অ্যাক্সেস না পান তবে এটি ব্যবহার করে দেখুন:

<?php
$path = "/path/to/files";

if ($handle = opendir($path)) {
    while (false !== ($file = readdir($handle))) {
        if ('.' === $file) continue;
        if ('..' === $file) continue;

        // do something with the file
    }
    closedir($handle);
}
?>

4
আপনি কি এমন পরিস্থিতির নাম লিখতে পারেন যেখানে আপনার এতে অ্যাক্সেস নেই?
জোহেম কুইজপার্স

12
প্রচুর লিগ্যাসি অ্যাপ্লিকেশনগুলি পিএইচপি 4 ব্যবহার করে, যার ডিরেক্টরি ডিরেক্টরিতে কোনও অ্যাক্সেস নেই।
জোসেফ কলার্স

1
কেন '।' === $ ফাইল? এটি জাভা নয়।
ডেভ হেক

2
ডেভ ... না, এটি বিন্দুগুলির সাথে মিলে যাচ্ছে এবং এটি পিএইচপি-তে মেলে না তবে চালিয়ে যায় না। == এবং === এর মধ্যে পার্থক্য অনুসন্ধান করুন।
জেএসজি

22

scandir()ফাংশনটি ব্যবহার করুন :

<?php
    $directory = '/path/to/files';

    if (!is_dir($directory)) {
        exit('Invalid diretory path');
    }

    $files = array();
    foreach (scandir($directory) as $file) {
        if ($file !== '.' && $file !== '..') {
            $files[] = $file;
        }
    }

    var_dump($files);
?>

18

আপনি এটি ব্যবহার করতে পারেন FilesystemIterator। এর জন্য তখন আরও কম কোড প্রয়োজন DirectoryIteratorএবং স্বয়ংক্রিয়ভাবে মুছে ফেলা হয় .এবং ..

// Let's traverse the images directory
$fileSystemIterator = new FilesystemIterator('images');

$entries = array();
foreach ($fileSystemIterator as $fileInfo){
    $entries[] = $fileInfo->getFilename();
}

var_dump($entries);

//OUTPUT
object(FilesystemIterator)[1]

array (size=14)
  0 => string 'aa[1].jpg' (length=9)
  1 => string 'Chrysanthemum.jpg' (length=17)
  2 => string 'Desert.jpg' (length=10)
  3 => string 'giphy_billclinton_sad.gif' (length=25)
  4 => string 'giphy_shut_your.gif' (length=19)
  5 => string 'Hydrangeas.jpg' (length=14)
  6 => string 'Jellyfish.jpg' (length=13)
  7 => string 'Koala.jpg' (length=9)
  8 => string 'Lighthouse.jpg' (length=14)
  9 => string 'Penguins.jpg' (length=12)
  10 => string 'pnggrad16rgb.png' (length=16)
  11 => string 'pnggrad16rgba.png' (length=17)
  12 => string 'pnggradHDrgba.png' (length=17)
  13 => string 'Tulips.jpg' (length=10)

লিঙ্ক: http://php.net/manual/en/class.files systemmiterator.php


5

আপনি এই কোডটি পুনরাবৃত্তভাবে একটি ডিরেক্টরি মাধ্যমে লুপ করতে ব্যবহার করতে পারেন :

$path = "/home/myhome";
$rdi = new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::KEY_AS_PATHNAME);
foreach (new RecursiveIteratorIterator($rdi, RecursiveIteratorIterator::SELF_FIRST) as $file => $info) {
    echo $file."\n";
}

2

গ্লোব () এর বাছাই এবং প্যাটার্ন মিলের বিধান রয়েছে। যেহেতু রিটার্নের মানটি একটি অ্যারে, আপনি আপনার প্রয়োজনীয় সমস্ত কিছুই করতে পারেন।


1
আপনি অনেক ফাইল ...> 10,000 এর সাথে ডিল না করে থাকলে এটি ভাল। আপনার স্মৃতি শেষ হয়ে যাবে।
NexusRex

@ নেেক্সাসআরেক্স: আপনার কোনও ডাটাবেস থেকে ১০,০০০ রেকর্ড পড়া উচিত নয়, তবে প্রশ্নটি যতটা
উদাসীন

একমত! যদি কোনও ডাটাবেস থেকে পড়া হয় তবে আপনি "সীমা" দিয়ে প্যাগিনেট করতে পারেন — যখন আপনার কাছে 5 মিলিয়ন এক্সএমএল ফাইল সহ ডিরেক্টরিতে পুনরাবৃত্তি করার জন্য কোনও ডিরেক্টরি থাকবে না তখন luck
NexusRex

এসপিএল গ্লোবআইট্রেটর রয়েছে।
przemo_li

2

সম্পূর্ণতার জন্য (যেহেতু এটি একটি উচ্চ ট্র্যাফিক পৃষ্ঠা বলে মনে হচ্ছে), আসুন ভাল পুরানো dir()ফাংশনটি ভুলে যাবেন না :

$entries = [];
$d = dir("/"); // dir to scan
while (false !== ($entry = $d->read())) { // mind the strict bool check!
    if ($entry[0] == '.') continue; // ignore anything starting with a dot
    $entries[] = $entry;
}
$d->close();
sort($entries); // or whatever desired

print_r($entries);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.