Porównywanie czy pliki sa takie same

0

Witam, mam krótkie pytania związane z porównywaniem plików. Załóżmy chcę porównać plik_1 i plik_2 (czy są to binarnie te same pliki), ale dodatkowo chciałbym wykorzystać jakąś funkcję hash, myślałem o MD5 - i zamiast porównywać pliki porównać te hashe. Głównie to chce to wykorzystać do autoupdatera, który najpierw ściągnie hashe plików do zupdatowania, a następnie autoupdater sprawdzi które pliki zostały zmodyfikowane i to właśnie te ściągnie. Czy tego typu rozwiązanie do porównywania plików jest dobre? Czy istnieją jeszcze jakieś inne sposoby na efektywne sprawdzenie czy dany plik jest taki sam jak drugi? A jeżeli jest to ten sam plik, to może po prostu powinienem porównać te dwa pliki po dacie modyfikacji?

1

md5 w zupełności wystarczy. Na końcu ściągania porównujesz hash md5 (którego możesz wrzucić na jakiś serwer) jeśli jest ok, to instalacja przebiegła pomyślnie, jeśli nie plik ściągasz od nowa.

1

@Dawid90dd pytanie, czy to są jakieś pliki typu exe, dll? Jeśli tak to sprawa prosta. Wystarczy zaszyć w zasobach wersję pliku. Na serwerze wtedy wystarczy trzymać w pliku txt wykaz aktualnych wersji plików:

test.exe 1.2.4.11
test.dll 1.2.3.1
helper.dll 1.4.0.1

Wtedy pobierasz z serwera plik z wersjami, sprawdzasz wersje plików i wiesz co trzeba pobrać, a co nie.

Jeśli są to pliki z danymi, albo takie w których nie da się łatwo zawrzeć informacji o wersji, to wtedy haszowanie może być dobrym pomysłem.

A co do daty modyfikacji to z góry bym sobie odpuścił takie rozwiązanie. Bo stwarza problemy.

0

wszystko, pliki wykonywalne, biblioteki, grafiki, pliki konfiguracyjne......
@Mr.YaHooo Ja myślałem o podobnym rozwiązaniu, ale to stwarza problem z potrzebą ręcznej aktualizacji wersji w takim pliku, więc wolę by już automatycznie te 200 czy 400 obrazków sprawdzano za pomocą MD5...

W sumie to już i tak sobie poradziłem... Teraz morduje się z cURL-em... :<

0

Więc na Twoim miejscu ja bym albo te obrazki umieścił w pliku *.dll (ja tak właśnie robię z obrazkami umieszczanymi na przyciskach) w przypadku małych bitmap nawet 200 obrazków nie spowoduje wielkiej dll'ki, a wygoda w rozprowadzaniu duża. W przypadku dużych obrazków to zastosowałbym po prostu jakieś archiwum oparte na formacie ZIP i też problem z głowy.

Co do ręcznej aktualizacji pliku, to raczej nikt tego nie będzie robił. Zawsze można napisać jakieś małe narzędzie (a może już coś takiego istnieje?) które będzie wywoływane automatycznie po zakończeniu kompilacji całości. Ja mam tak ustawione środowisko do kompilacji, że kompiluję wszystkie moduły exe, dll. Następnie robi się z tego instalator, dokumentacja i jeszcze kilka innych rzeczy. W efekcie końcowym mam wszystko co mi trzeba zrobione z automatu.

6

Możesz zastosować rozwiązanie z RSync:

  1. Pobierasz z serwera informację o sumach kontrolnych dla zadanych plików (czy to będzie SHA1/2/3 czy MD2/4/5 to nie ma znaczenia poza wydajnością).
  2. Patrzysz które pliki się zmieniły.
  3. Obliczasz sumy kontrolne dla delt plików (np. po 5MB) zarówno na serwerze jak i lokalnie.
  4. Pobierasz tylko to co się zmieniło.
  5. Mergujesz delty do pliku wynikowego.
  6. Profit - zamiast ściągać powiedzmy 10GB ściągasz tylko 100MB, które się zmieniło względem ostatniej pobranej wersji.

EDIT:
A i jeszcze zamiast pobierać 1 deltę X razy (bo np. N plików ma taki sam nagłówek) pobierasz ją tylko raz i stosujesz w N różnych plikach (w końcu to te same dane).

1

A czemu nie użyć po prostu rsync zamiast wymyślać koło na nowo?

0

@Krolik z ciekawości :) A czasem to armata na muchy. Wszystko zależy od zastosowania.

No i chyba rsync wymaga działania dodatkowego softu po stronie serwera? A to na części hostingów będzie utrudnione.

0

Domyślnie rsync używa ssh.

0

@Mr.YaHooo oczywiście w przypadku pełnego RSync takie wymaganie jest, ale nie w ww. przypadku. W tym przypadku (serwer aktualizacji) wystarczy zwykły serwer, który udostępnia statyczne pliki. Masz plik Manifest (format dowolny), który zawiera opis plików oraz ich sum kontrolnych. Wystarczy go pobrać i wykryć zmiany, jeśli się coś zmieniło, to na serwerze trzymamy już statyczne delty, które są obliczane przez jakiś zewnętrzny program, chociażby na maszynie developera lub serwerze CI. W ten sposób, za serwer aktualizacji może służyć chociażby AWS S3.

0

@winerfresh rzeczywiście jeśli coś takiego da się zrobić to jest to bardzo sensowne rozwiązanie.

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