Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Szybkie skanowanie katalogu
Forum PHP.pl > Forum > PHP
Kas
Szukam skutecznego rozwiązania na zrobienie "spisu z natury" katalogu. Chcę sprawdzać zawartość folderu i porównać z bazą danych.

Jak zrobić to w optymalny sposób? Skrypt musi wyszukiwać skasowane i dodane pliki.

Edycja: o funkcji scandir, oczywiście, czytałem...
zzeus
DirectoryIterator
Kas
A jakieś inne rozwiązanie? Wpadłem na pomysł aby dla każdego rekordu z bazy sprawdzać czy istnieje plik i odwrotnie: dla każdego pliku sprawdzać rekord. Czy jest jakiś lepszy algorytm?
Wicepsik
Pobierasz wszystkie ścieżki do plików i sprawdzasz file_exists, czy istnieje.
paxton
Może glob? Gdzieś słyszałem ze jest wolniejszy od scandir, ale warto spróbować.
Kas
Aplikacja będzie uruchomiona na serwerze dedykowanym, ale z pewnych względów ekstremalnie zależy mi na jak najmniejszej złożoności obliczeniowej i pamięciowej.

Mój pomysł wygląda tak: pobieram z bazy wszystkie nazwy i sprawdzam czy istnieje, następnie skanuję katalog i sprawdzam w bazie. Da się sprytniej?
Blame
Rozumiem, że chcesz usunąć te pliki, których nie ma w bazie? Jeśli tak to można by też zrobić na inny sposób:
1. Tworzysz dwie tablice, do jednej wrzucasz ścieżki do plików z katalogu, do drugiej z bazy.
2. Przelatujesz foreach po tej tablicy z bazy, sprawdzając in_array czy te pliki są w drugiej tablicy(tej z katalogu).
3. Jeśli true to dajesz unset na danej wartości i potem na końcu dostaniesz tablicę tylko i wyłącznie z plikami, które są w katalogu a nie ma ich w bazie.

Nie wiem czy do końca ci o to chodziło i czy jest to wydajniejsze, ale poddaję tylko pomysł winksmiley.jpg
Kas
Mniej więcej tak to zrobię.

Mam problem, chyba jakoś dzisiaj nie myślę...

  1. $result = mysql_query("SELECT `name` FROM `files`");
  2. $row = mysql_fetch_row($result);
  3.  
  4. echo($row[$i].'<br />');


w tablicy $row nie ma wyników, a zapytanie SQL zwraca kilkadziesiąt rekordów. Co jest grane?
artur_dziocha
o while zapomniałes
  1. while( $row = mysql_fetch_row( $result ) ) { ... }
Kas
Jest źle.

  1. <?php
  2.  
  3.  
  4. $files_dir='../files';
  5. $files = scandir($files_dir);
  6. $link = mysql_connect('***', '***', '***');
  7. mysql_select_db('niebo', $link);
  8. $result = mysql_query("SELECT `name` FROM `files`");
  9. while($row = mysql_fetch_row($result))
  10. {
  11. echo($row[$i]);
  12. $i++;
  13. }
  14.  
  15.  
  16. echo('<br /><br /><br />');
  17.  
  18.  
  19. $files_dir='../files';
  20. $files = scandir($files_dir);
  21.  
  22.  
  23. $j=(count($files));
  24. $i=0;
  25. while($i<$j)
  26. {
  27. echo($files[$i].' ');
  28.  
  29. $i=$i+1;
  30. }
  31.  
  32. ?>


Potrzebuję dwie tablice. Tablica $files działa dobrze, ale mam problem z wynikami z bazy danych MySQL. Z tego co widzę mysql_fetch_row pozwala na łatwe stworzenie tablicy, bez pętli. Przykład z php.net:

  1. <?php
  2. $result = mysql_query("SELECT id,email FROM people WHERE id = '42'");
  3. if (!$result) {
  4. echo 'Could not run query: ' . mysql_error();
  5. }
  6. $row = mysql_fetch_row($result);
  7.  
  8. echo $row[0]; // 42
  9. echo $row[1]; // the email value
  10. ?>
artur_dziocha
w tym przypadku, który jest na php.net pobierany jest tylko jeden wiersz więc w ten sposób zadziała. Ty pobierasz więcej wierszy więc musisz polecieć pętlą
Kas
Kłopot w tym, że to chyba też nie działa.

Potrzebuję zapytania

  1. SELECT `name` FROM `files`


stworzyć tablicę do porównania z tablicą $files. Coś dziś kiepsko ze mną... wstydnis.gif
artur_dziocha
w $result masz już tablicę z plikami znajdującymi się w bazie.
później wykonujesz scandir lub inna funkcję do wrzucenia plików do tablicy z twojego folderu($files -> tak jak robiłeś).
Następnie porównujesz obydwie tablice($result oraz $files) za pomocą petli(foreach), array_diff, in_array etc
Kas
A nie da się tego jakoś inaczej zrobić?

  1. while($row = mysql_fetch_row($result))
  2. {
  3. echo($row[0]);
  4. echo($files[$i].'<br /><br />');
  5. $i++;
  6. }


Mam taki kod, który wyrzuca mi na standardowe wyjście kolejne elementy obu tablic. Jednak one mogą być różnej długości... Zapytanie SQL daje mi wiele wierszy. Teraz chcę z tego zrobić tablicę taką, że kolejny element tablicy to kolejna nazwa pliku. Głupi jestem. sad.gif
artur_dziocha
zwykły przykład. możesz sobie to jakoś zoptymalizować

  1. $fileNotExistsInDir = array();
  2. while( $row = mysql_fetch_array( $result ) )
  3. {
  4. if( in_array( $row[0], $files ) {
  5. $fileNotExistsInArray[] = $row[0];
  6. }
  7. else {
  8. echo 'istnieje';
  9. }
  10. )
  11. }

Do sprawdzenia czy istnieje plik , ale nie ma go w bazie możesz uzyć funkcji
  1. $notExistsInDatabase = array_diff( $result, $files );

Edit Pisane z palca. Pokombinuj
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.