Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Viisi uusinta tiedostoa kansiosta

Sivun loppuun

Damiqib [09.03.2006 23:50:40]

#

Uusimman tiedoston saan näin:

#Asetetaan muuttuja uusinta tiedostoa varten
$y = 0;

foreach($filenames as $arvo)
{
  $picture = $imgfolder."/".$arvo;

  #Tarkistetaan, että tiedostopääte on varmisti jpg ja tiedosto muutenkin sallittu
  if ($arvo != "." && $arvo != ".." && (substr($arvo,-3) == "jpg"))
  {
    #Etsitään uusin tiedosto
    if(filemtime($picture) > $y)
    {
      $y = filemtime($picture);
      $yf = $arvo;
    }
  }
}

Mutta miten saan viisi uusinta tiedostoa muuttujiin $yf - $yj.

Lebe80 [09.03.2006 23:58:49]

#

Suosittelisin taulukkojen opettelemisen. Paljon helpompi käyttää, kuin $yj, $yk, $yl... -nimiset muuttujat.

Katsoppas koodivinkeistä, siellä on läjä päin tiedosjoen ja hakemistojen listauksista esimerkkejä.

T.M. [10.03.2006 00:12:50]

#

Täl tyylil sais $yf-$yj muuttujiin, mutta todella epäviisasta käyttää tätä tyyliä:

$c = "fghij";
$p = 0;
silmukka{
    ${"y".$c[$p]} = $arvo;
    $p++;
}

Kun taas taulukoilla paljon helpompaa:

$lista = array();
$p = 0;
silmukka{
    $lista[$p] = $arvo;
    $p++;
}

Ps. "silmukka" ei kuulu PHP:n rakenteisiin

tsuriga [10.03.2006 00:55:25]

#

kansiokahva = avaakansio(kansio)
toista_kunnes(ei ole enää tiedostoja)
  tiedostot[tiedostonluontiaika(viimeksi_luettu_kansion_tiedosto)] = tiedostonnimi
toisto_end

järjestätaulukko(tiedostot, NUMEROT)

Tiedostot-taulukko pitää järjestää vastakkaiseen järjestykseen (suurimmasta pienempään), jotta saadaan uusimmat tiedostot ensimmäisiksi. Nyt tiedostot-taulukossa avaimina on tiedostojen luontiajat ja avaimilla osoitetaan tiedostojen nimiin. Sitten vain hakemaan ne taulukon viisi ensimmäistä alkiota. PHP:ssä komennot ovat: opendir, while, readdir, filemtime, rsort(SORT_NUMERIC), closedir. Kannattaa pitää mielessä muuttujien näkyvyysalueet (jos et määrittele tiedostot-taulukkoa silmukan ulkopuolella, sen ei pitäisi myöskään näkyä sinne (en muista kuinka tarkka PHP on tässä asiassa).

Damiqib [10.03.2006 12:59:20]

#

Ei luonnistu.. Tällaista skriptiä tarjottiin, mutta ei tuo mielestäni järjestä tiedostoja aikajärjestykseen.

<?php

function LoadFiles($dir)
{
  $Files = array();
  $It = opendir($dir);
  if (! $It)
  die('Cannot list files for ' . $dir);
  while ($Filename = readdir($It))
  {
    if ($Filename == '.' || $Filename == '..')
    continue;
    if(is_dir($Filename))
    continue;
    $LastModified = filemtime($dir . $Filename);
    $Files[] = array($dir .$Filename, $LastModified);
  }

  return $Files;
}

function DateCmp($a, $b)
{
  return ($a[1] < $b[1]) ? -1 : 0;
}

function SortByDate(&$Files)
{
  usort($Files, 'DateCmp');
}

$Files = LoadFiles('./');
SortByDate($Files);

for($i = 0; $i < 10; $i++)
{
  print_r($Files[$i][1]);
  echo "<br />";
}

?>

Tulostaa:
1131875458
1139757905
1137431471
1137079554
1137262001
1139510697
1137262270
1141825971
1131958002
1131988926

..ja nuo on kaikkea muuta kuin järjestyksessä.


Selvennetään nyt vielä tarkoitustani. Tarkoitukseni on saada gallerian viiden uusimman kuvan yhteyteen teksti (Uusimpia). Nykyisellä skriptilläni saan tekstin uusimpaan tiedostoon, mutta haluaisin tekstin esim. 3-5 uusimpaan kuvaan.

Uusimman etsintäkoodi ensimmäisessä viestissäni ja tiedon tulostus galleriaan näin:

#Tarkistetaan onko tiedosto uusin
if($value == $yf)
{
  echo "<span id=\"uusin\">Uusin kuva&nbsp;-&nbsp;</span>";
}

Damiqib [10.03.2006 15:31:06]

#

No niin, nyt olen hieman päässyt eteenpäin ja saan jo listattua x-määrän uusimpia tiedostoja, mutta...

<?php

$hakemisto = "./testi/";

function LoadFiles($hakemisto)
{
  $filutaulukko = array();
  if(!($kahva = @opendir($hakemisto)))die("Kansion ".$hakemisto." avaaminen ei onnistu!");
  while ($filu = readdir($kahva))
  {
    if($filu != "." && $filu != ".." && is_dir($filu) == false)
    {
      $muokattu = filemtime($hakemisto.$filu);
      $filutaulukko[] = array($muokattu, $hakemisto.$filu, $filu);
    }
  }
  return $filutaulukko;
}

$filutaulukko = LoadFiles($hakemisto);

sort($filutaulukko);

echo "Kansion \"".$hakemisto."\" neljä uusinta tiedostoa:<br /><br />";

for($i = (count($filutaulukko)-1); $i > (count($filutaulukko)-5); $i--)
{
  echo $filutaulukko[$i][2];
  echo "<br />";
}

?>

Jostain syystä tuo pätkä ei jätä kansioita huomioimatta - paitsi jos tutkitaan kansio, jossa skripti on.. Jos tutkii jonkin muun hakemiston, myös kaikki kansiot listataan..

T.M. [10.03.2006 15:59:06]

#

if(is_file($filu)) ...

Luulisin tuon korvaavan kaikki nuo kolme eri iffiä.

Damiqib [10.03.2006 16:08:23]

#

Korvaahan se.. :)

Ongelma on silti vielä olemassa..

Jos tiedostolistaus "haetaan" skriptin ulkopuolisesta hakemistosta, ei tuo is_file pelitä oikein, vaan mukaan tulee myös hakemistoja.

ja tuoreimpana erikoisuutena skripti ei tunnista is-file-funktion avulla galleria-kansiostani muita tiedostoja tiedostoiksi kuin Thumbs.db- tiedoston.

T.M. [10.03.2006 16:27:55]

#

if(is_file($hakemisto.$filu)) ...

Damiqib [10.03.2006 16:32:12]

#

Stupid Me.. Kiitos erittäin paljon.. Nyt toimii loistavasti..

tsuriga [10.03.2006 16:33:08]

#

Hyi Thumbs.db :). Se on eri kansion Thumbs.db se, jonka skripti tunnistaa. Ja tarkistus T.M.:n ylläolevan pätkän malliin.

Damiqib [10.03.2006 17:35:38]

#

Laitanpa vielä lopullisen version..

#Uusimmat tiedostot
  function uusimmatTiedostot($hakemisto)
  {
    $filutaulukko = array();
    if(!($kahva = @opendir($hakemisto)))die("Kansion ".$hakemisto." avaaminen ei onnistu!");

    while($filu = readdir($kahva))
    {
      if(is_file($hakemisto.$filu) == true)
      {
        $muokattu = filemtime($hakemisto.$filu);
        $filutaulukko[] = array($muokattu, $hakemisto.$filu, $filu);
      }
    }
    sort($filutaulukko);
    return $filutaulukko;
  }
#EO Uusimmat tiedostot

..ja tulostusosa..

#Merkitään x-määrä uusimpia tiedostoja
        $filutaulukko = uusimmatTiedostot($imgfolder."/");

        for($a = (count($filutaulukko)-1); $a > (count($filutaulukko)-5); $a--)
        {
          if($value == $filutaulukko[$a][2])
          {
            echo "<span id=\"uusin\">Uusimpia&nbsp;-&nbsp;</span>";
          }
        }

T.M. [10.03.2006 19:09:26]

#

" == true" on turha, pelkkä if(is_file(...)) riittää


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta