Sprawa wygląda tak:
Piszę program którego zadaniem jest znalezienie i usunięcie takich samych plików z folderu
Ma on po prostu otworzyć pierwszy plik - porównać go z każdym innym w folderze (i jeśli jakiś będzie taki sam usunąć dubla) następnie zamknąć plik, otworzyć drugi itd.
Samo porównywanie i usuwanie mam już napisane. Schody zaczęły się w chwili gdy zacząłem się zastanawiać jak go zmusić ,żeby otwierał pliki po kolei i porównywał z każdym - totalnie nie mam pojęcia jak się do tego zabrać i byłbym wdzięczny za wszelkie porady :)
I jeszcze pytanie dodatkowe - w czym lepiej to pisać w Devie czy w Borlandzie bo takie mam dwie opcje?
Rozumiem, że piszesz to pod Windowsa, jeśli tak, to mogą Ci się przydać takie funkcje z WinAPI jak FindFirstFile, FindNextFile.
Bardzo nie optymalne ale najprostsze rozwiązanie to:
- wylistować wszystkie pliki i zapisać do jakieś tablicy
- dla każdego pliku zapisanego w tablicy wykonujesz listowanie plików i porównywanie
gdybym wiedzial jak zrobic listowanie to w sumie nie ma problemu - majac tablice z wszystkimi plikami praktycznie jestem w domu....
Mrowa Ci już napisał: FindFirstFile, FindNextFile. Najpierw używasz FindFirstFile, potem w pętli FindNextFile i wyniki dopisujesz np. do jakiegoś wektora -> masz listę wszystkich plików/katalogów
Gumish napisał(a)
Piszę program którego zadaniem jest znalezienie i usunięcie takich samych plików z folderu
Ma on po prostu otworzyć pierwszy plik - porównać go z każdym innym w folderze (i jeśli jakiś będzie taki sam usunąć dubla) następnie zamknąć plik, otworzyć drugi itd.
Samo porównywanie i usuwanie mam już napisane.
Z tytułu wnoszę, że ładujesz te pliki do pamięci i je porównujesz. W Twoim przypadku zawartość plików nie ma znaczenia i liczy się tylko to, czy pliki są identyczne. W takim razie nie ma potrzeby wczytywać ich do pamięci (a tym bardziej wszystkich). Wystarczy jeśli będziesz porównywał skróty (MD5, SHA1/256) ich zawartości, a to możesz zrobić strumieniowo. Np:
- wylicz skrót dla pliku wzorcowego i go zapamiętaj,
- wylicz skrót dla kolejnego pliku
- porównaj skrót pliku wzorcowego ze skrótem pliku porównywanego i jeśli są takie same, to znaczy że pliki mają identyczną zawartość
- jeśli są jakieś pliki do przetworzenia, GOTO 2
Może warto najpierw wczytać listę plików wraz z ich rozmiarami, po czym posortować wg rozmiarów, a jakiekolwiek porównywania robić tylko dla plików o identycznych rozmiarach.
Jak napisano wcześniej:
- wczytać nazwy plików i ich rozmiary
- porównać rozmiary plików
- dla reszty: porównać pierwsze k bajtów plików
- dla reszty: porównać ostatnie k bajtów plików
- dla reszty: porównać skrót (CRC32)
- dla reszty: porównać całą zawartość pliku (gdy skrót jest taki sam)