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


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.