[Wunsch] Synchronisieren nach Inhalt bei Dateisystem-Plugin

German support forum

Moderators: white, Hacker, Stefan2

Post Reply
Popelmaus
Junior Member
Junior Member
Posts: 15
Joined: 2006-06-07, 20:12 UTC

[Wunsch] Synchronisieren nach Inhalt bei Dateisystem-Plugin

Post by *Popelmaus »

Hallo!

Vor Jahren (Anfang 2013) musste ich erfahren, dass der Inhaltsvergleich beim Synchronisieren mit einem Dateisystem-Plugin nicht möglich ist.
Ich habe gehofft, dass diese Funktion vielleicht zwar keine sehr hohe Priorität hat, aber trotzdem irgendwann eingeführt wird. Doch langsam gebe ich die Hoffnung auf... :( Trotzdem muss ich nachfragen:

Kann diese Funktion bitte doch noch implementiert werden?

Ich habe gelesen, dass die Implementierung bei Packer-Plugins sehr kompliziert war. (Die Dateien sind in einer bestimmten Reihenfolge abgelegt, die besonders bei soliden Archiven unbedingt eingehalten werden sollte. Deshalb funktioniert auch der Inhaltsvergleich bei zwei Archiven nicht, denn falls die Dateien in unterschiedlicher Reihenfolge abgelegt sind, müsste eventuell ein Archiv komplett temporär entpackt werden.)
Bei Dateisystem-Plugins sollte es aber solche Probleme nicht geben. (Stimmt doch, oder?) Die Dateien könnten wie bei normalen Dateien auf der Festplatte in einer beliebigen Reihenfolge nacheinander verglichen werden, mit dem einzigen Unterschied, dass sie vorher mit der Methode FsGetFile temporär zwischengespeichert und danach wieder gelöscht werden müssten.

Und auch wenn sich das als extrem langsam herausstellen sollte, würde ich mich trotzdem ernorm darüber freuen! Denn selbst die langsamste und sogar die schlechteste Implementierung wäre mir immer noch viel lieber als gar keine!

Liebe Grüße
Popelmaus
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 48077
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

Total Commander 9.10 unterstützt das nun prinzipiell - allerdings hatte ich leider noch keine Zeit, das zu dokumentieren und in Plugins einzubauen. Bisher funktioniert es bei mir im SFTP-Plugin, doch habe ich die neue Version noch nicht released.

Im Prinzip funktioniert es so, dass TC das Plugin nach einer Quersumme der Datei im Format CRC32, SHA1, SHA256 oder SHA512 fragt. TC selbst berechnet dann die Quersumme der lokal vorhandenen Datei, und vergleicht die beiden.

Bei SFTP geht das, ohne dass die Datei dafür heruntergeladen werden muss, über einen Shell-Befehl. Beim Cloud-Plugin ginge es auch, viele Clouds liefern die Quersumme auf Anfrage. Da aber jede Cloud es wieder anders macht, ist das viel Arbeit zum Einbauen. Derzeit fehlt mir dafür leider die Zeit.
Author of Total Commander
https://www.ghisler.com
Popelmaus
Junior Member
Junior Member
Posts: 15
Joined: 2006-06-07, 20:12 UTC

Post by *Popelmaus »

Wirklich? Ich frage nämlich wegen einem eigenen Plugin.
Heißt das zur Plugin-Schnittstelle ist eine Methode hinzugekommen?
Könnten Sie mir diese bitte kurz beschreiben, so dass ich sie verwenden kann (Name+Parameter oder zB ein Code-Auszug vom SFTP-Plugin)?
Ich würde das wirklich gerne ausprobieren...
User avatar
ghisler(Author)
Site Admin
Site Admin
Posts: 48077
Joined: 2003-02-04, 09:46 UTC
Location: Switzerland
Contact:

Post by *ghisler(Author) »

Ja, das sind allerdings 3 neue Funktionen (6 mit Unicode):

int __stdcall FsServerSupportsChecksums(char* RemoteName);
int __stdcall FsServerSupportsChecksumsW(WCHAR* RemoteName);

Meldet, welche Quersummenfunktionen für diese Datei zur Verfügung stehen (auch mehrere):
#define FS_CHK_CRC32 1
#define FS_CHK_MD5 2
#define FS_CHK_SHA1 4
#define FS_CHK_SHA256 8
#define FS_CHK_SHA512 16
#define FS_CHK_OTHER 512

HANDLE __stdcall FsStartFileChecksum(int ChecksumType,char* RemoteName);
HANDLE __stdcall FsStartFileChecksumW(int ChecksumType,WCHAR* RemoteName);

Teilt dem Plugin mit, dass es mit der Quersummenbestimmung beginnen soll. Das kann entweder ein Befehl sein, den das Plugin an einen Server sendet, etwa md5sum DATEINAME. Oder das Plugin startet einen Thread zur lokalen Berechnung. ChecksumType ist einer der obigen FS_CHK-Werte.

FS_CHK_OTHER ist speziell: Wenn das Plugin keine der Standardmethoden unterstützt, dann kann es FS_CHK_OTHER zurückmelden. Dann ruft Total Commander FsStartFileChecksum 2x auf: Einmal mit der Datei im Plugin-Dateisystem, und einmal mit der lokalen Datei. Das Plugin muss dann beide Quersummen selber berechnen.

Es reicht, wenn das Plugin EINE der Methoden unterstützt und an TC meldet. TC benutzt dann diese auch für die lokale Datei.

int __stdcall FsGetFileChecksumResult(BOOL WantResult,HANDLE ChecksumHandle,char* RemoteName, char* checksum,int maxlen);
int __stdcall FsGetFileChecksumResultW(BOOL WantResult,HANDLE ChecksumHandle,WCHAR* RemoteName,char* checksum,int maxlen);

Nachdem Total Commander die Quersumme der lokalen Datei berechnet hat, fragt er beim Plugin nach, ob es seinerseits die Quersumme schon berechnet hat. Wenn WantResult=FALSE ist, dann hat der Benutzer die Berechnung abgebrochen. ChecksumHandle ist der Rückgabewert von FsStartFileChecksum, RemoteName nochmals der Dateiname.

Das Plugin muss die Quersumme als Hexadezimalwert im Parameter checksum zurückliefern. Maximale Länge ist maxlen.

Der Rückgabewert ist:
0: OK
#define FS_CHK_ERR_BUSY -1 // Das Plugin ist noch nicht fertig mit der Berechnung
#define FS_CHK_ERR_FAIL -2 // Beim Ermitteln der Quersumme ist ein Fehler aufgetreten
Author of Total Commander
https://www.ghisler.com
Post Reply