Laden...

Ordner synchronisieren - Lösungsweg / Ansatz gesucht

Erstellt von Briefkasten vor 14 Jahren Letzter Beitrag vor 14 Jahren 6.267 Views
Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 14 Jahren
Ordner synchronisieren - Lösungsweg / Ansatz gesucht

Hallo,

ich möchte zwei Verzeichnisse miteinander synchronisieren.

Ich habe dazu ein Struct erstellt, womit ich die Ordner / Datei Struktur nach bilde.

public struct File
{
		public Name {get;set;}
		public LastWrite {get;set;}
}
public struct Directory
{
		public List<Directory> Directorys{get;set;}
		public List<Directory> Files{get;set;}
		public LastWrite {get;set;}
		public Name {get;set;}
}

Ich gehe folgendermaßen vor. Ich erstelle mithilfe der Structs File und Directory ein Abbild von den zwei Quellen die synchronisiert werden sollen.

Eine Merge Funktion, der die zwei Verzeichnis Abbildungen übergeben werden, soll ermitteln, welche Ordner oder Dateien kopiert, gelöscht… werden müssen, damit die Dateien / Ordner synchronisiert werden können.

Den "Plan" also welche Dateien Verzeichnisse gelöscht, kopiert werden müssen, soll in Form eines Objektes zurück gegeben werden.

Mithilfe dieses "Plans", kann ich dann für jedes beliebige Protokoll (Samba, FTP, SFTP, etc.) auf einfachste Weise (mithilfe von Interfaces) die Synchronisation der Verzeichnisse realisieren.

Allerdings weiß ich nicht genau, wie ich den Plan in form eines Objekts erstellen soll.

Ist mein Lösungsansatz so durchführbar? Könnt ihr mir tipps geben?

lg

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

5.299 Beiträge seit 2008
vor 14 Jahren

Ich gehe folgendermaßen vor. Ich erstelle mithilfe der Structs File und Directory ein Abbild von den zwei Quellen die synchronisiert werden sollen.

Allerdings weiß ich nicht genau, wie ich den Plan in form eines Objekts erstellen soll.

erweitere deine Structs um einen 3-wertigen enum { ToCopy, ToDelete, None } - dann müsste son Verzeichnis-Abbild doch eindeutig auswertbar sein.

Der frühe Apfel fängt den Wurm.

149 Beiträge seit 2006
vor 14 Jahren

Hallo Briefkasten,

ich würde dir direkt mal einen ganz anderen Lösungsansatz aufzeigen wollen. Microsoft bietet seit dem .NET Framework 3.5 SP1 das Microsoft Sync Framework. Damit ist es sehr leicht den Inhalt zweier Ordner zu synchronisieren.

Das Vorgehen dabei ist folgendes: Du erstellst die zwei File FileSyncAdapter (Quelle und Ziel) und eine SyncOrchestration. Hierbei kannst du sehr einfach einstellen was im Konfliktfall passieren soll (Gewinnt die Source oder das Ziel, soll der Konflikt in einer Datenbank abgelegt werden, ...)

Ich habe hier mal ein kleinen Beispielcode für dich:


            FileSyncProvider sourceProvider = new FileSyncProvider(sourceReplicaId, SourceFolder.Text);
            FileSyncProvider destProvider = new FileSyncProvider(destReplicaId, DestinationFolder.Text);

            // Create a sync controller to coordinate the synchronization
            SyncOrchestrator syncAgent = new SyncOrchestrator();
            syncAgent.LocalProvider = sourceProvider;
            syncAgent.RemoteProvider = destProvider;
            syncAgent.Direction = SyncDirectionOrder.UploadAndDownload;

            // Start the synchronization
            syncAgent.Synchronize();

Vielleicht ist dieser Lösungsansatz ja etwas für dich.

Viele Grüße
Robert

Briefkasten Themenstarter:in
446 Beiträge seit 2004
vor 14 Jahren

erweitere deine Structs um einen 3-wertigen enum { ToCopy, ToDelete, None } - dann müsste son Verzeichnis-Abbild doch eindeutig auswertbar sein.

Wenn ich das Struct um den Enum Wert erweitere, und dieser auf ToCopy gesetzt ist, weiß ich nicht wohin ich diesen kopieren muss.

Ich vermute ich muss dafür eine komplette neue Struct /Class erstellen. Die Frage ist, aber wie diese aussehen soll, wenn man sie möglichst einfach halten will. Soll ich dafür, das vorhandene struct File, Directory verwenden?

Danke für den Tipp roeb, ich möchte möglichst viele andere Protokolle wie ftp implementieren. Ist der "Plan" ein mal erstellt, müsste man theoretisch jedes Protkoll auf einfachste Weise implementieren können, da man nur noch die Copy, Delete, None Methoden überschreiben muss.

Darin führt man dann die File.Copy oder FTP.Copy Methode aus.

So hätte ich mir das vorgestellt

(Edit)

Okay, wenn ich ein ToCopy finde, dann könnte ich auto, davon ausgehen, dass ich die Datei von der anderen Source kopieren muss. Ist allerdings ein wenig verwirrend.

Wann muss eine Datei ins Ziel verzeichnis kopieren?
Wenn es eine neuere Datei gibt -> sprich LastWriteTime vergleichen
Gibt es sonst noch eine Bedingung in der ich eine Datei kopieren muss?

Schaut mal im IRC vorbei:
Server: https://libera.chat/ ##chsarp

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Briefkasten,

Wenn ich das Struct um den Enum Wert erweitere, und dieser auf ToCopy gesetzt ist, weiß ich nicht wohin ich diesen kopieren muss.

natürlich in das korrespondierende Verzeichnis im anderen Dateibaum.

Ich vermute ich muss dafür eine komplette neue Struct /Class erstellen.

Nö.

Wenn es eine neuere Datei gibt -> sprich LastWriteTime vergleichen

Das Dateidatum ist an sich ein schlechter Ratgeber. Wenn ich eine Datei geändert habe, dann einmal synchronisiere und mir dann überlege, dass die Änderung Mist war und aus einer Sicherungskopie den alten Stand der Datei wiederherstelle, dann ist das Dateidatum des gewünschten und zu kopierenden Stands älter und nicht wie üblich jünger.

Gibt es sonst noch eine Bedingung in der ich eine Datei kopieren muss?

Du könntest das Archive-Bit verwenden. Das wäre an sich am besten. Aber leider gibt es nur ein Archive-Bit pro Datei und das wird eigentlich fürs normale Backup gebraucht. Wenn sichergestellt ist, dass es dadurch keine Konflikte gibt, wäre es bestimmt die zuverlässigste Lösung.

herbivore