C # parchive / quickpar / par2 Reparatur-Implementierung?

8

Ich schreibe eine C # -App, die in der Lage sein muss, eine Reihe von Dateien mit par2-Paritätsdateien zu reparieren. Für C ++ gibt es viele zu finden, die genau das tun, aber für C # kann ich keine native Implementierung finden.

Eine Option wäre die Verwendung einer C ++ DLL von C #, aber das würde ich lieber nicht tun, da es nicht möglich ist, eine 32-Bit-DLL in einer x64-App zu verwenden, sodass ich meine App auf den 32-Bit-Modus beschränken würde.

Eine andere Option ist es, par2cmdline im Hintergrund auszuführen, aber ich hätte lieber mehr Kontrolle über den Prozess (Fortschritt, Abbrechen usw.).

Kennt jemand eine native C # -Implementierung, die Dateien mit einem Par2-Set repariert?

    
Led 19.05.2009, 08:19
quelle

3 Antworten

1

Wollen Sie selbst mit PARs bleiben? Ich habe eine vollständig native Reed / Solomon-Implementierung, die ich posten würde, wenn es helfen würde (die Übereinstimmung, auf der PARs basieren), aber ich habe nichts für die gesamte Dateibearbeitung und -auflösung.

Mein Code ist eine Implementierung von Stream und erzeugt eine Zeichenfolge mit allen fehlerkorrigierenden Daten. Sie können diese Daten dann korrumpieren und zurücksenden und das System wird sie automatisch wiederherstellen. Ich würde es nur posten, aber es ist lang und ich bin zu faul, um einen Blogeintrag zu machen und einen Link darauf zu erstellen.

Um dies wie PAR zu machen, müssten Sie das in Dateien aufteilen und dann ein System erstellen, das fehlende Volumes identifizieren und beschädigte Daten für alle fehlenden Daten hinzufügen kann (die Mathematik kann nur mit fehlenden Daten umgehen) beschädigt).

Als Anmerkung zur Performance war das System, für das es gebaut wurde, eher "stoßartig", es würde in vielen 100k-Streams auf einmal kommen, aber auch lange warten, nichts zu tun. Die C # -Version der Mathematik arbeitete etwa 6% schneller als die reine C-Version. Wenn ich Performance-Tests mit nur Non-Stop-Load durchgeführt habe, läuft das C # um 1-2% langsamer. Meiner Erfahrung nach haben die meisten C- bis C # -Mathe-Konvertierungen die gleichen Leistungsergebnisse.

    
JasonRShaver 20.05.2009 05:00
quelle
0

Es ist keine direkte Antwort, aber ich denke, es gibt eine Möglichkeit, eine 32-Bit-DLL in eine 64-Bit-App zu laden:

Ссылка

Aus dem Artikel:

  

Diese Lösung erfordert zusätzliche Arbeit, da der 32-Bit-Surrogatprozess, der die 32-Bit-DLL lädt und seine API verfügbar macht, erstellt werden muss. Außerdem sind einige Änderungen auf der 64-Bit-Seite erforderlich, da der Benutzer eine der IPC-Techniken verwenden muss, anstatt direkt auf die 32-Bit-DLL zuzugreifen. Es ist erwähnenswert, dass diese zusätzliche Arbeit in extremen Fällen vergleichbar mit der Arbeit bei der Entwicklung einer 64-Bit-Version der 32-Bit-DLL von Grund auf sein könnte.

     

Eine Möglichkeit, diese Kosten zu reduzieren, ist die Implementierung einer 64-Bit-Wrapper-DLL, die die gleichen Funktionen, Parameter, Typen usw. wie die ursprüngliche 32-Bit-DLL bereitstellt. Diese Wrapper-DLL kann dann IPC-basierte Aufrufe an die ursprüngliche 32-Bit-DLL vornehmen, die in einen Ersatzprozess geladen wurde.

    
Neil Trodden 19.05.2009 08:41
quelle
0

Ich habe vor einer Weile so etwas gemacht. Wenn Sie sich den Quellcode von par2 ansehen, ist das nicht trivial. Sie könnten es wahrscheinlich ohne großen Aufwand nach c # portieren. Leider würde die ganze Anstrengung, die Sie tun würden, Sie teuer in der Leistung kosten (versuchen Sie es, wenn Sie mir nicht glauben).

Am Ende habe ich Par2 ausführbar über CreateProcess aufgerufen. Sie können Griffe für stdin, stdout und strerr bekommen. Da die ausführbare Datei eine Konsolenanwendung ist, können Sie die Ausgabe analysieren, um den Fortschritt zu erhalten. Wenn Sie die Operation "abbrechen" möchten, können Sie den Prozess immer beenden.

Es ist eine schlampige Methode.

Der "richtige" Weg wäre, die par2-Quelle zu nehmen und sie auf eine 64-Bit-DLL zu portieren (aus Leistungsgründen mit der nicht verwalteten C / C ++ - DLL zu kleben).

    
Robert H. 19.05.2009 14:06
quelle

Tags und Links