Otwieranie / wczytywanie do pamięci wielu plików c++

0

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?

0

Rozumiem, że piszesz to pod Windowsa, jeśli tak, to mogą Ci się przydać takie funkcje z WinAPI jak FindFirstFile, FindNextFile.

0

Bardzo nie optymalne ale najprostsze rozwiązanie to:

  1. wylistować wszystkie pliki i zapisać do jakieś tablicy
  2. dla każdego pliku zapisanego w tablicy wykonujesz listowanie plików i porównywanie
0

gdybym wiedzial jak zrobic listowanie to w sumie nie ma problemu - majac tablice z wszystkimi plikami praktycznie jestem w domu....

0

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

0
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:

  1. wylicz skrót dla pliku wzorcowego i go zapamiętaj,
  2. wylicz skrót dla kolejnego pliku
  3. 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ść
  4. jeśli są jakieś pliki do przetworzenia, GOTO 2
0

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.

0

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)

1 użytkowników online, w tym zalogowanych: 0, gości: 1