webForumDet fria alternativet

Sortera filer _och_ underkataloger?

PHPur PHP

8 svar · 408 visningar · startad av muskot

muskotMedlem sedan jan. 20027 905 inlägg
Frågan#1

Använder koden under för att lista filer i en katalog.

Problemet är att jag vill ha vill ha allting listat i bokstavsordning, med underkatalogerna överst. Det vill säga någonting i stil med:

katalog1
katalog2
katalog4
fil1.php
fil2.php

Att man kan använda t ex natcasesort() har jag lite hum om, men det blir inte riktigt bra eftersom underkatalogerna då inte hamnar högst upp!

Förstår ni vad jag menar? Lösningar, någon?

$dir_name = "e:\blabla";
$dir = opendir($dir_name);

while ($file_name = readdir($dir)):

	if ($file_name != "." && $file_name != ".."):

		echo "$file_name\n<br>";

	endif;

endwhile;

closedir($dir)
nkrantzMedlem sedan apr. 2002830 inlägg
#2

förslag bara.. går det inte att läsa in allt i en array och sedan sortera den? typ allt som inte har filändelser först och sedan resten?

FlashXMedlem sedan nov. 19991 033 inlägg
#3

Annars finns ju is_dir och is_file redan klara att användas.

nkrantzMedlem sedan apr. 2002830 inlägg
#4

Annars finns ju is_dir och is_file redan klara att användas.

hm.. öh.. just det.. hrmpf.. :r

muskotMedlem sedan jan. 20027 905 inlägg
#5

Elände...

Jag fattar inte hur jag ska göra.
Har kollat is_dir och is_file på php.net men jag hajar ändå inte hur jag ska fixa det.

FamineMedlem sedan jan. 200265 inlägg
#6

Hmm

Du får först läsa in och sortera alla kataloger i en array. Sen gör du samma sak fast med filerna. Annars kan du kolla på en kompis och mitt lilla projekt: http://fami.asna.nu/filelist.txt

Det finns en del buggar och html koden som skapas är inte direkt den bästa. Hoppas du får ut något av den kanske något röriga koden, som förövrgit var min första "riktiga" sak jag gjorde i php ;)

spangos avatarspangoMedlem sedan juni 20008 205 inlägg
#7

Annars kan man ju tänka sig något sådant här:


function isStupidLink($name){
  return $name == '.' or $name == '..';
}

function getEntriesInDirectory($dirname){
  $entries = array();
  $dir = opendir($dirname);
  while ($entry = readdir($dir))
    if (!isStupidLink($entry))
      $entries[] = $entry;
  return $entries;
}

function fileVsDirectorySort($a, $b){
  $adir = is_dir($a);
  $bdir = is_dir($b);
  if ($adir == $bdir)
    return 0;
    else
      return ($adir) ? -1 : 1;
}
$entries = getEntriesInDirectory('C:\foo');
natsort($entries);
usort($entries, 'fileVsDirectorySort');
foreach($entries as $entry)
    #skriv ut $entry
muskotMedlem sedan jan. 20027 905 inlägg
#8

Tack för hjälpen.

Problemet är att det bara går (i alla fall för mig) att lista filer som ligger i min dokumentrot. Försöker jag lista underkataloger flippar det ur...

Den kod famine postade fungerar så länge man kör med opendir('.') men om jag t ex kör opendir('files/') så får jag följande felmeddelande:

Warning: Wrong datatype in sort() call in d:\wwwroot\list.php on line 56

Filerna och katalogerna listas, men helt huller om buller och felaktig storleksangivelse i vissa fall (0 b).

Med spangos kod får jag inga felmeddelanden, dock samma fel...

Jämmer och elände :(

spangos avatarspangoMedlem sedan juni 20008 205 inlägg
#9

Observera att filnamnen inte blir relativa utifrån den katalog du arbetar från. Prova om det går bättre om du byter ut den här raden i getEntriesInDirectory:
$entries[] = $entry;
och ersätter den med exempelvis:
$entries[] = $dirname . '/' . $entry;

142 ms totalt · 3 externa anrop · v20260731065814-full.58439ac5
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)