Z jakiegoś powodu wciąż otrzymuję „1” dla nazw plików z tym kodem:
if (is_dir($log_directory))
{
if ($handle = opendir($log_directory))
{
while($file = readdir($handle) !== FALSE)
{
$results_array[] = $file;
}
closedir($handle);
}
}
Kiedy powtarzam każdy element w tablicy wyników $ results_array, otrzymuję kilka jedynek, a nie nazwę pliku. Jak uzyskać nazwy plików?
Odpowiedzi:
Nie zawracaj sobie głowy open / readdir i użyj
glob
zamiast tego:foreach(glob($log_directory.'/*.*') as $file) { ... }
źródło
array_filter(..., 'is_file')
wokół tego globu, ponieważ pytanie dotyczy plików.*.*
: po prostu użyj*
zamiast tego.something.something
. Lepiej jest użyćarray_filter
iglob($log_directory.'/*')
.*.*
. Bardziej zdecydowane wyrażenie uczyniłoby to jeszcze lepszą odpowiedzią.Styl SPL :
foreach (new DirectoryIterator(__DIR__) as $file) { if ($file->isFile()) { print $file->getFilename() . "\n"; } }
Sprawdź klasy DirectoryIterator i SplFileInfo , aby uzyskać listę dostępnych metod, których możesz użyć.
źródło
getPathname
: php.net/manual/en/splfileinfo.getpathname.phpMusisz otoczyć
$file = readdir($handle)
się nawiasami.Proszę bardzo:
$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 />'; }
źródło
Po prostu użyj
glob('*')
. Oto dokumentacjaźródło
Ponieważ zaakceptowana odpowiedź ma dwa istotne wady, zamieszczam poprawioną odpowiedź dla tych nowych użytkowników, którzy szukają poprawnej odpowiedzi:
foreach (array_filter(glob('/Path/To/*'), 'is_file') as $file) { // Do something with $file }
globe
wyników funkcji za pomocąis_file
jest konieczne, ponieważ może również zwrócić niektóre katalogi..
w nazwie, więc*/*
generalnie wzorzec jest do niczego.źródło
basename($file)
systemie Windows) musiałem użyć tylko nazwy pliku zamiast całej ścieżki z nazwą pliku.Mam mniejszy kod do zrobienia tego:
$path = "Pending2Post/"; $files = scandir($path); foreach ($files as &$value) { echo "<a href='http://localhost/".$value."' target='_blank' >".$value."</a><br/><br/>"; }
źródło
.php
w każdym pliku.)W niektórych OS dostać
.
..
i.DS_Store
, cóż nie możemy z nich korzystać tak niech nam je ukryć.Najpierw uzyskaj wszystkie informacje o plikach, używając
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>"; } }
źródło
Dzieje się tak dzięki precyzji operatora. Spróbuj zmienić to na:
while(($file = readdir($handle)) !== FALSE) { $results_array[] = $file; } closedir($handle);
źródło
glob()
iFilesystemIterator
przykłady:/* * 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 ) );
źródło
Możesz po prostu wypróbować tę
scandir(Path)
funkcję. jest szybki i łatwy do wdrożeniaSkładnia:
$files = scandir("somePath");
Ta funkcja zwraca listę plików do tablicy.
aby zobaczyć wynik, możesz spróbować
Lub
foreach($files as $file) { echo $file."< br>"; }
źródło
Innym sposobem na wyświetlenie katalogów i plików byłoby użycie
RecursiveTreeIterator
odpowiedzi tutaj: https://stackoverflow.com/a/37548504/2032235 .Dokładne wyjaśnienie
RecursiveIteratorIterator
i iteratory w PHP można znaleźć tutaj: https://stackoverflow.com/a/12236744/2032235źródło
Oto bardziej zaawansowany przykład pokazania wszystkich plików w folderze
źródło
Po prostu używam tego kodu:
<?php $directory = "Images"; echo "<div id='images'><p>$directory ...<p>"; $Files = glob("Images/S*.jpg"); foreach ($Files as $file) { echo "$file<br>"; } echo "</div>"; ?>
źródło
Posługiwać się:
if ($handle = opendir("C:\wamp\www\yoursite/download/")) { while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { echo "<b>" . preg_replace('/\\.[^.\\s]{3,4}$/', '', $entry) . "</b>"; } } closedir($handle); }
Źródło: http://chandreshrana.blogspot.com/2016/08/how-to-fetch-all-files-name-from-folder.html
źródło
Rekursywny kod do eksploracji całego pliku zawartego w katalogu („$ path” zawiera ścieżkę do katalogu):
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 */ } } }
źródło