পিএইচপি দিয়ে একটি ডিরেক্টরিতে সমস্ত ফাইলের নাম পাওয়া


88

কিছু কারণে এই কোড সহ ফাইলের নামের জন্য আমি একটি '1' পেয়ে যাচ্ছি:

if (is_dir($log_directory))
{
    if ($handle = opendir($log_directory))
    {
        while($file = readdir($handle) !== FALSE)
        {
            $results_array[] = $file;
        }
        closedir($handle);
    }
}

আমি যখন element ফলাফল_আররে প্রতিটি উপাদান প্রতিধ্বনি করি তখন আমি ফাইলের নাম নয়, '1 এর একগুচ্ছ পাই। আমি কীভাবে ফাইলগুলির নাম পাই?


4
গ্লোব ব্যবহার করে কয়েকটি বিকল্প রয়েছে ।
— ই


4
পোস্টারের সমস্যাটি ছিল যে অ্যাসাইনমেন্টটির খুব কম অগ্রাধিকার রয়েছে, তাই '! ==' অপারেটরটি প্রথমে মূল্যায়ন করে এবং সেই অপারেশনের বাইনারি ফলাফলটি তারপরে $ ফাইলের জন্য বরাদ্দ হয়। কেবলমাত্র প্রয়োজনীয়
— ফিক্সটি হ'ল


votes৯ ভোট থেকে 70০ পর্যন্ত। আমি হ্যাঙ্ক মুডির বিপরীত মত অনুভব করি
— চার্লি

উত্তর:


169

ওপেন / রিডডির নিয়ে বিরক্ত করবেন না এবং এর globপরিবর্তে ব্যবহার করুন:

foreach(glob($log_directory.'/*.*') as $file) {
    ...
}

24
array_filter(..., 'is_file')প্রশ্নটি ফাইলগুলির জন্য জিজ্ঞাসা করার কারণে আপনি সেই গ্লোবকে ঘিরে ফেলতে চাইতে পারেন ।
— সালাতে

23
সমস্ত ফাইলের নামের ফর্ম নেই *.*: কেবল *পরিবর্তে ব্যবহার করুন।
— জামেশফিশার

এক্সটেনশনের তালিকার মধ্যে আমরা কীভাবে সমস্ত ফাইল পেতে পারি? উদাহরণস্বরূপ যদি আমরা সমস্ত .pp এবং .js ফাইল চাই?
— নিস

4
হ্যাঁ, এই উত্তরটি খুব জোরালো নয়। ফাইলগুলির এক্সটেনশন থাকা দরকার না এবং ডিরেক্টরিগুলির নাম দেওয়া যায় something.something। এটি ব্যবহার করা ভাল array_filterএবং glob($log_directory.'/*')।
— অ্যান্ড্রু

আমি এই উত্সাহটি দিয়েছিলাম কেবলমাত্র আমার সহজ উত্তর দরকার ছিল এবং আমার ব্যবহারের ক্ষেত্রে প্রাসঙ্গিক সমস্ত ফাইল হবে *.*। আরও শক্তিশালী অভিব্যক্তি এটিকে আরও উত্তম উত্তর হিসাবে তৈরি করবে।
— TecBrat

50

এসপিএল স্টাইল:

foreach (new DirectoryIterator(__DIR__) as $file) {
  if ($file->isFile()) {
      print $file->getFilename() . "\n";
  }
}

আপনি ব্যবহার করতে পারেন এমন উপলভ্য পদ্ধতির তালিকার জন্য ডিরেক্টরি ডিরেক্টরি এবং স্প্লফিলআইএনফো ক্লাস পরীক্ষা করুন ।


পুরো পথটির পরিবর্তে কেবল ফাইল এবং কেবল তাদের নামগুলি পাওয়ার দুর্দান্ত উপায়, ধন্যবাদ!
— ক্রিস

4
হ্যাঁ. পুরো পাথের জন্য, আপনি ব্যবহার করতে পারেন getPathname: php.net/manual/en/splfileinfo.getpathname.php
— ইলিজা

18

আপনার প্রথম $file = readdir($handle)বন্ধনী দিয়ে ঘিরে রাখা দরকার ।

আপনি এখানে যান:

$log_directory = 'your_dir_name_here';

$results_array = array();

if (is_dir($log_directory))
{
        if ($handle = opendir($log_directory))
        {
                //Notice the parentheses I added:
                while(($file = readdir($handle)) !== FALSE)
                {
                        $results_array[] = $file;
                }
                closedir($handle);
        }
}

//Output findings
foreach($results_array as $value)
{
    echo $value . '<br />';
}


14

গৃহীত উত্তরের দুটি গুরুত্বপূর্ণ ঘাটতি রয়েছে, তাই আমি যারা সঠিক উত্তর খুঁজছেন তাদের নতুন এই আগতদের জন্য উন্নত উত্তর পোস্ট করছি:

foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file)
{
    // Do something with $file
}
  1. globeসাথে ফাংশন ফলাফল ফিল্টারিং is_fileপ্রয়োজনীয়, কারণ এটি কিছু ডিরেক্টরিও ফিরে আসতে পারে।
  2. সমস্ত ফাইলের .নামের একটি নেই, তাই */*প্যাটার্নটি সাধারণভাবে সফল হয়।

এটি আমার জন্য কাজ করে একটি পরিষ্কার কার্যকর। পূর্ববর্তী উত্তরগুলি ফলাফলগুলিতে ডিরেক্টরিগুলি দেখায় যা আমি চাই না।
— এডাব্লুপি

আপনার স্যার আরও upvotes প্রয়োজন! আসলে (উইন্ডোতে) আমাকে basename($file)ফাইলের নাম সহ পুরো পথের পরিবর্তে কেবলমাত্র ফাইলের নামটি ব্যবহার করতে হয়েছিল।
— পাওলোকো

11

আমার এই কোডটি আরও ছোট আছে:

$path = "Pending2Post/";
$files = scandir($path);
foreach ($files as &$value) {
    echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>";
}

আমাকে সমস্ত ফাইল ব্যতীত দুটি "আবর্জনা ফাইল" নামক ফাইল ফিরিয়ে দেওয়া হচ্ছে। এবং "..". আমার কাছে "নামক কোনও ফাইল নেই।" এবং আমার ডিরেক্টরিতে ".."।
— kamranbhatti585

4
$ ফাইলগুলি = অ্যারে_ডিফ (স্ক্যান্ডির ($ পাথ)), অ্যারে ('।', '..')) ব্যবহার করুন; উপরের ত্রুটিগুলি মুক্ত করার জন্য আমি আলোচনা করেছি।
— kamranbhatti585

ভাল লাগল আমি কীভাবে ফাইলগুলির জন্য এক্সটেনশনগুলি সরিয়ে দেব? (আমার .phpপ্রতিটি ফাইল মুছে ফেলা দরকার ))
— কেএসপিআর

8

কিছু OS এ আপনি পান . ..এবং .DS_Storeভাল আমরা সেগুলি ব্যবহার করতে পারি না তাই আসুন আমরা তাদের আড়াল করি।

প্রথমে ফাইলগুলি সম্পর্কে সমস্ত তথ্য ব্যবহার শুরু করুন scandir()

// Folder where you want to get all files names from
$dir = "uploads/";

/* Hide this */
$hideName = array('.','..','.DS_Store');    

// Sort in ascending order - this is default
$files = scandir($dir);
/* While this to there no more files are */
foreach($files as $filename) {
    if(!in_array($filename, $hideName)){
       /* echo the name of the files */
       echo "$filename<br>";
    }
}

4

এটি অপারেটর নির্ভুলতার কারণে। এটিকে পরিবর্তন করার চেষ্টা করুন:

while(($file = readdir($handle)) !== FALSE)
{
    $results_array[] = $file;
}
closedir($handle);

2

glob()এবং FilesystemIteratorউদাহরণ:

/* 
 * glob() examples
 */

// get the array of full paths
$result = glob( 'path/*' );

// get the array of file names
$result = array_map( function( $item ) {
    return basename( $item );
}, glob( 'path/*' ) );


/* 
 * FilesystemIterator examples
 */

// get the array of file names by using FilesystemIterator and array_map()
$result = array_map( function( $item ) {
    // $item: SplFileInfo object
    return $item->getFilename();
}, iterator_to_array( new FilesystemIterator( 'path' ), false ) );

// get the array of file names by using FilesystemIterator and iterator_apply() filter
$it = new FilesystemIterator( 'path' );
iterator_apply( 
    $it, 
    function( $item, &$result ) {
        // $item: FilesystemIterator object that points to current element
        $result[] = (string) $item;
        // The function must return TRUE in order to continue iterating
        return true;
    }, 
    array( $it, &$result )
);

1

আপনি শুধু scandir(Path)ফাংশন চেষ্টা করতে পারে। এটি দ্রুত এবং কার্যকর করা সহজ

বাক্য গঠন:

$files = scandir("somePath");

এই ফাংশনটি একটি অ্যারেতে ফাইলের একটি তালিকা ফেরত দেয়।

ফলাফল দেখতে, আপনি চেষ্টা করতে পারেন

var_dump($files);

বা

foreach($files as $file)
{ 
echo $file."< br>";
} 

1

ডিরেক্টরি এবং ফাইল তালিকাভুক্ত করার আরেকটি উপায় RecursiveTreeIteratorএখানে উত্তরগুলি ব্যবহার করা হবে : https://stackoverflow.com/a/37548504/2032235 ।

RecursiveIteratorIteratorপিএইচপি-তে পুনরাবৃত্তির বিশদ ব্যাখ্যা এবং পুনরাবৃত্তিগুলি এখানে পাওয়া যাবে: https://stackoverflow.com/a/12236744/2032235



0

আমি কেবল এই কোডটি ব্যবহার করি:

<?php
    $directory = "Images";
    echo "<div id='images'><p>$directory ...<p>";
    $Files = glob("Images/S*.jpg");
    foreach ($Files as $file) {
        echo "$file<br>";
    }
    echo "</div>";
?>


0

ডিরেক্টরিতে অন্তর্ভুক্ত সমস্ত ফাইল অন্বেষণ করতে পুনরাবৃত্ত কোড ('$ পাথ' ডিরেক্টরিটির পাথ অন্তর্ভুক্ত করে):

function explore_directory($path)
{
    $scans = scandir($path);

    foreach($scans as $scan)
    {
        $new_path = $path.$scan;

        if(is_dir($new_path))
        {
            $new_path = $new_path."/";
            explore_directory($new_path);
        }
        else // A file
        {
            /*
                  Body of code
            */
        }
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.