Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Szybkie skanowanie katalogu
Kas
post
Post #1





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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

Ten post edytował Kas 4.07.2010, 16:08:36
Go to the top of the page
+Quote Post
zzeus
post
Post #2





Grupa: Zarejestrowani
Postów: 441
Pomógł: 71
Dołączył: 3.09.2007
Skąd: wrocław

Ostrzeżenie: (0%)
-----


DirectoryIterator
Go to the top of the page
+Quote Post
Kas
post
Post #3





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Wicepsik
post
Post #4





Grupa: Zarejestrowani
Postów: 1 575
Pomógł: 299
Dołączył: 26.03.2009

Ostrzeżenie: (20%)
X----


Pobierasz wszystkie ścieżki do plików i sprawdzasz file_exists, czy istnieje.
Go to the top of the page
+Quote Post
paxton
post
Post #5





Grupa: Zarejestrowani
Postów: 66
Pomógł: 1
Dołączył: 22.06.2009
Skąd: Londyn, UK

Ostrzeżenie: (0%)
-----


Może glob? Gdzieś słyszałem ze jest wolniejszy od scandir, ale warto spróbować.

Ten post edytował paxton 4.07.2010, 18:50:37
Go to the top of the page
+Quote Post
Kas
post
Post #6





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
Blame
post
Post #7





Grupa: Zarejestrowani
Postów: 678
Pomógł: 124
Dołączył: 26.09.2009

Ostrzeżenie: (0%)
-----


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ł (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Kas
post
Post #8





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
artur_dziocha
post
Post #9





Grupa: Zarejestrowani
Postów: 320
Pomógł: 53
Dołączył: 18.09.2007
Skąd: Radom

Ostrzeżenie: (0%)
-----


o while zapomniałes
  1. while( $row = mysql_fetch_row( $result ) ) { ... }


Ten post edytował artur_dziocha 5.07.2010, 11:28:54
Go to the top of the page
+Quote Post
Kas
post
Post #10





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
artur_dziocha
post
Post #11





Grupa: Zarejestrowani
Postów: 320
Pomógł: 53
Dołączył: 18.09.2007
Skąd: Radom

Ostrzeżenie: (0%)
-----


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ą
Go to the top of the page
+Quote Post
Kas
post
Post #12





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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ą... (IMG:style_emoticons/default/wstydnis.gif)
Go to the top of the page
+Quote Post
artur_dziocha
post
Post #13





Grupa: Zarejestrowani
Postów: 320
Pomógł: 53
Dołączył: 18.09.2007
Skąd: Radom

Ostrzeżenie: (0%)
-----


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

Ten post edytował artur_dziocha 5.07.2010, 11:54:36
Go to the top of the page
+Quote Post
Kas
post
Post #14





Grupa: Zarejestrowani
Postów: 425
Pomógł: 0
Dołączył: 28.05.2005
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


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. (IMG:style_emoticons/default/sad.gif)
Go to the top of the page
+Quote Post
artur_dziocha
post
Post #15





Grupa: Zarejestrowani
Postów: 320
Pomógł: 53
Dołączył: 18.09.2007
Skąd: Radom

Ostrzeżenie: (0%)
-----


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


Ten post edytował artur_dziocha 5.07.2010, 12:39:20
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 22.08.2025 - 14:15