2009-05-19 8 views
8

Sto scrivendo un'app C# che deve essere in grado di riparare un set di file utilizzando i file di parità par2. Per C++ c'è molto da scoprire che farà esattamente questo, ma per C# non riesco a trovare un'implementazione nativa.C# parchive/quickpar/par2 implementazione della riparazione?

Un'opzione potrebbe essere una DLL C++ da C#, ma preferirei non farlo poiché non è possibile utilizzare una dll a 32 bit in un'app x64 quindi limiterei la mia app alla modalità 32 bit.

Un'altra opzione è quella di shellexecute par2cmdline in background, ma preferirei avere più controllo sul processo (avanzamento, cancellazione ecc.).

Qualcuno sa di un'implementazione nativa in C# che ripara i file utilizzando un set par2?

+0

Cosa hai finito? –

risposta

0

Non è una risposta diretta, ma penso che ci sia un modo per caricare un 32 bit DLL in un'applicazione a 64 bit:

http://dnjonline.com/article.aspx?ID=jun07_access3264

Dall'articolo:

Questa soluzione richiede ulteriore funziona come il processo surrogato a 32 bit che carica la DLL a 32 bit e espone la sua API deve essere creata. Inoltre, saranno necessarie alcune modifiche sul lato a 64 bit poiché il consumatore deve utilizzare una delle tecniche IPC invece di accedere direttamente alla DLL a 32 bit. Vale la pena notare che, in casi estremi, questo lavoro aggiuntivo potrebbe essere paragonabile al lavoro necessario per lo sviluppo di una versione a 64 bit della DLL a 32 bit da zero.

Un possibile modo per ridurre questi costi è implementare una DLL wrapper a 64 bit che esponga le stesse funzioni, parametri, tipi e così via come la DLL originale a 32 bit. Questa DLL wrapper può quindi effettuare chiamate basate su IPC alla DLL originale a 32 bit, che è stata caricata in un processo surrogato.

+0

Grazie! Questa è un'opzione, anche se, come l'articolo cita è probabilmente altrettanto molto lavoro come la scrittura completamente un par2-implementazione in C# da zero .. – Led

+0

che è una cosa che non vorrei scrivere da zero ... mai! :-) –

0

Stavo facendo qualcosa di simile qualche tempo fa. Se si guarda il codice sorgente par2, non è banale. Probabilmente potresti portarlo su C# senza troppi problemi. Purtroppo, tutto lo sforzo che sarebbe necessario ti costerebbe caro nelle prestazioni (provalo se non mi credi).

Ho finito per chiamare eseguibile par2 tramite CreateProcess. Puoi ottenere maniglie per stdin, stdout e strerr. Poiché l'eseguibile è un'app per console, è possibile analizzare l'output per ottenere il progresso. Se si desidera "annullare" l'operazione, è sempre possibile terminare il processo.

È un metodo sciatto.

Il modo "giusto" sarebbe prendere il sorgente par2 e portarlo su una dll a 64 bit (bastone con DLL C/C++ non gestita per motivi di prestazioni).

+0

Se affermi di sapere come portarlo su C# si tradurrebbe in un grande successo nelle prestazioni, posso chiederti come lo sai? Lo hai effettivamente portato o è solo un'ipotesi educata? Io non sono così sicuro che il porting in C# si tradurrebbe in un grande calo di prestazioni, è solo che questo non è qualcosa che voglio passare il mio tempo sul :) – Led

+4

mi piace l'affermazione: "non è banale si potrebbe forse. portalo in C# senza troppi problemi ". – JasonRShaver

1

Vuoi attaccare con gli stessi PAR? Ho un impianto nativo di Reed/Solomon che pubblicherei se sarà d'aiuto (il match su cui sono basati i PAR), ma non ho nulla per la gestione e la rottura dei file.

Il mio codice è un'implementazione di Stream e produce una stringa con tutti i dati di correzione degli errori inclusi. È quindi possibile corrompere i dati e inviarli di nuovo e il sistema lo recupererà automaticamente. Vorrei solo postarlo ma è lungo e sono troppo pigro per fare un post sul blog e collegarlo ad esso.

Per fare in modo che funzioni come PAR, dovresti suddividerlo in file, quindi creare un sistema in grado di identificare i volumi mancanti e "aggiunge" dati corrotti per tutti i dati mancanti (la matematica non può gestire i dati mancanti, solo corrotto).

Inoltre, come nota sulle prestazioni, il sistema per cui è stato costruito era piuttosto "scoppiettante", si otterrebbe in un sacco di 100k flussi alla volta, ma ha anche lunghe attese di non fare nulla. La versione C# della matematica ha funzionato circa il 6% più velocemente rispetto alla versione C pura. Se ho eseguito test delle prestazioni usando solo il carico non-stop, il C# funziona più lentamente dell'1-2%. Nella mia esperienza, la maggior parte delle conversioni matematiche da C a C# hanno gli stessi risultati delle prestazioni.

+1

Vorrei davvero grato se avrei posto, anche se solo fosse per riferimento. Potrebbe essere utile anche per altre persone! – Led

+0

Ok, cercherò di trovarlo dopo il lavoro oggi e permetterà di modificare questo post con cui si può trovare il codice. – JasonRShaver

Problemi correlati