2009-05-19 7 views
8

私はpar2パリティファイルを使用して一連のファイルを修復できる必要があるC#アプリケーションを作成しています。 C++の場合、正確にはそうなるでしょうが、C#ではネイティブ実装を見つけることができません。C#parchive/quickpar/par2修復の実装?

1つのオプションはC#の のC++ DLLを使用していましたが、x64アプリケーションで32ビットdllを使用することはできないので、私はむしろそれをやりたいのですが、32ビットモードに制限しています。

もう1つの選択肢は、背景にpar2cmdlineをshellexecuteすることです( )が、プロセス(進行状況、キャンセルなど)をより詳細に制御できます。

par2セットを使用してファイルを修復するネイティブのC#実装を知っている人はいますか?

+0

あなたは何をやったのですか? –

答えて

0

それが直接の答えではないのですが、私は64ビットアプリに32ビットのDLLをロードする方法があると思う:

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

記事から:

このソリューションは、追加が必要です32ビットのDLLをロードしてそのAPIを公開する32ビットのサロゲートプロセスとして作成する必要があります。また、消費者は32ビットDLLに直接アクセスするのではなく、IPC技術の1つを使用しなければならないため、64ビット側でいくつかの変更が必要になります。極端な場合には、この追加の作業は、最初から32ビットDLLの64ビット版を開発する作業に匹敵する可能性があります。

これらのコストを削減する1つの方法は、オリジナルの32ビットDLLと同じ機能、パラメータ、タイプなどを公開する64ビットラッパーのDLLを実装することです。このラッパーDLLは、サロゲートプロセスにロードされた元の32ビットDLLにIPCベースの呼び出しを行うことができます。

+0

ありがとう! これはオプションですが、記事で言及されているように、おそらくC#のpar2実装を完全にゼロから作成するのと同じくらい多くの作業があります。 – Led

+0

これは私が一から書いたくないことです。 :-) –

0

私はこのようなことをやっていました。 par2のソースコードを見ると、それは簡単なことではありません。多分問題なくC#に移植することができます。悲しいことに、すべての努力は、あなたがパフォーマンスで大変貴重です(あなたが私を信じていない場合はそれを試してください)。

私は、CreateProcessで実行可能なpar2を呼び出すことになりました。 stdin、stdout、およびstrerrにハンドルを取得できます。実行可能ファイルはコンソールアプリケーションなので、出力を解析して進行状況を取得できます。操作を「キャンセル」したい場合は、いつでもプロセスを終了することができます。

これはちょっとした方法です。

"正しい"方法は、par2のソースを取得し、64ビットのdllに移植することです(パフォーマンス上の理由から、アンマネージC/C++ DLLを使用してください)。

+0

C#に移植することを知っていると主張すれば、パフォーマンスが大幅に低下します。あなたは実際にそれを移植したのですか、それとも教育的な推測ですか? 私はそれをC#に移植すると、パフォーマンスが大幅に向上するとは思っていませんが、それは私が自分の時間を費やしたいと思うものではありません:) – Led

+4

私は声明が好きです。それをC#に移植しても問題ありません。 – JasonRShaver

1

PARを使用していますか?私はそれが助けになるならば(PARが基づいているマッチ)、私は完全にネイティブのリード/ソロモンの実装を持っていますが、私はすべてのファイル処理と分割のための何も持っていません。

マイコードはStreamの実装であり、すべてのエラー修正データが含まれた文字列を生成します。そのデータを破損して元に戻すと、システムは自動的に回復します。私はちょうどそれを掲示するだろうが、それは長いであり、私はあまりにもブログの投稿を作成し、それにリンクするのは怠惰だ。

PARのように動作させるには、ファイルを分割して、不足しているボリュームを識別できるシステムを構築し、欠落しているすべてのデータのデータを追加します(この計算では、唯一の破損)。

また、パフォーマンス上の注意として、これが構築されたシステムはむしろ「バースト的」だったので、一度に100kストリームをたくさん取得しますが、何もしないという長い待ち時間もあります。数学のC#バージョンは純粋なCバージョンより約6%速く働いていました。ノンストップ負荷だけでパフォーマンステストを行った場合、C#は約1〜2%遅くなります。私の経験では、ほとんどのCからC#への数学的変換は、同じ結果の結果を持っています。

+1

私が本当に参考にしたとしても、投稿していただければ幸いです。他の人にも役立つかもしれません! – Led

+0

私は今日仕事の後でそれを見つけようとしていますし、コードが見つかる場所でこの投稿を編集します。 – JasonRShaver