webForumDet fria alternativet

Sortera filer _och_ underkataloger?

PHP

8 svar · 408 visningar · startad av muskot

Medlem 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)
Medlem 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?

Medlem sedan nov. 19991 033 inlägg
#3

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

Medlem 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

Medlem 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.

Medlem 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 ;)

Medlem 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
Medlem 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 :(

Medlem 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;

259 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)