2009-05-19 4 views
8

par2 패리티 파일을 사용하여 파일 집합을 복구 할 수 있어야하는 C# 응용 프로그램을 작성했습니다. C++의 경우 정확히 할 일이 많지만 C#의 경우 네이티브 구현을 찾을 수 없습니다.C# parchive/quickpar/par2 복구 구현?

한 옵션은 C#에서 의 C++ DLL을 사용하지만 32 비트 모드로 내 응용 프로그램을 제한 할 수 있으므로 x64 응용 프로그램에서 32 비트 DLL을 사용할 수 없기 때문에 그렇게하지 않을 것입니다.

또 다른 옵션은 배경에있는 par2cmdline을 shellexecute하는 것입니다. 그러나 프로세스를 더 잘 제어 할 수 있습니다 (진행, 취소 등).

누구나 par2 세트를 사용하여 파일을 복구 할 원시 C# 구현을 알고 있습니까?

+0

결국 무엇을 했습니까? –

답변

0

그것은 직접적인 대답은 아니지만 내가 64 비트 응용 프로그램으로 32 비트 DLL을로드 할 수있는 방법이 생각 :

이 솔루션은 추가로 필요합니다

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

문서에서가 32 비트 DLL을로드하고 해당 API를 노출하는 32 비트 대리 프로세스로 작업해야합니다. 또한 소비자는 32 비트 DLL에 직접 액세스하는 대신 IPC 기술 중 하나를 사용해야하므로 일부 변경이 64 비트 측에서 필요합니다. 극단적 인 경우에는이 추가 작업이 처음부터 32 비트 DLL의 64 비트 버전 개발과 관련된 작업과 비교 될 수 있다는 점은 주목할 가치가 있습니다.

이러한 비용을 줄이는 방법 중 하나는 원본 32 비트 DLL과 동일한 기능, 매개 변수, 형식 등을 제공하는 64 비트 래퍼 DLL을 구현하는 것입니다. 이 래퍼 DLL은 대리 프로세스에로드 된 원래 32 비트 DLL에 대한 IPC 기반 호출을 수행 할 수 있습니다.

+0

감사합니다. 이 기사에서 언급했듯이이 기사에서는 처음부터 C#에서 par2 구현을 완전히 작성한 것만 큼 많은 작업이있을 것입니다. – Led

+0

그건 처음부터 작성하고 싶지 않은 것이 하나뿐입니다! :-) –

0

나는 이런 식으로 뭔가를하고 있었다. par2 소스 코드를 보면, 그것은 사소한 것이 아닙니다. 별로 문제없이 C#으로 이식 할 수 있습니다. 슬프게도, 모든 노력을 기울이면 성능에 대한 비용이 많이들 것입니다 (나를 믿지 않으면 시도하십시오).

필자는 CreateProcess를 통해 par2 실행 파일을 호출하게되었습니다. stdin, stdout 및 strerr에 대한 핸들을 얻을 수 있습니다. 실행 파일은 콘솔 응용 프로그램이므로 출력을 구문 분석하여 진행 상황을 확인할 수 있습니다. 작업을 "취소"하려면 항상 프로세스를 종료 할 수 있습니다.

지저분한 방법입니다.

"올바른"방법은 par2 소스를 가져 와서 성능상의 이유로 관리되지 않는 C/C++ DLL을 사용하여 64 비트 dll로 포트하는 것입니다.

+0

C#으로 포팅 한 사실을 알고 있다면 성능이 크게 떨어질 수 있습니다. 어떻게 알 수 있습니까? 실제로 포팅 했습니까 아니면 교양있는 추측입니까? C#으로 이식하면 성능이 저하 될 수 있습니다. – Led

+4

나는 간단합니다. 많은 문제없이 C#으로 포트하십시오. " – JasonRShaver

1

PAR을 사용하고 싶습니까? 필자는 그것이 도움이된다면 PAR에 기반한 Reed/Solomon 임 플리 멘 테이션을 완전히 가지고 있지만 모든 파일 처리 및 해체에 대해서는 아무 것도하지 않습니다.

내 코드는 Stream 구현이며 모든 오류 수정 데이터가 포함 된 문자열을 생성합니다. 그런 다음 해당 데이터를 손상시키고 다시 전송하면 시스템이 자동으로 복구합니다. 나는 단지 그것을 게시 할 것이지만, 그것은 길어이고 나는 블로그 포스트와 링크를 만들기에는 너무 게으른 다.

PAR과 같이 작동 시키려면 파일로 분할 한 다음 누락 된 볼륨을 식별하고 누락 된 모든 데이터에 대해 손상된 데이터를 추가 할 수있는 시스템을 구축해야합니다 (누락 된 데이터를 처리 할 수없는 수학, 부패 만).

성능에 대한 참고 사항으로,이 시스템은 한 번에 많은 스트림을 얻게되지만, 아무 것도하지 않을 때까지 기다리는 시간이 길어졌습니다. 수학의 C# 버전은 순수 C 버전보다 약 6 % 빠릅니다. 부하가 걸리지 않는 부하를 사용하여 성능 테스트를 수행 한 경우 C#은 약 1-2 % 느리게 실행됩니다. 내 경험상, 대부분의 C에서 C# 수학으로의 변환은 동일한 성능 결과를 얻습니다.

+1

참조 용 일지라도 게시한다면 정말 고맙겠습니다. 다른 사람들에게도 유용 할 수 있습니다! – Led

+0

좋아, 나는 오늘 일을 끝내고 그것을 찾으려고 노력할 것이고 코드가있는 곳에서이 포스트를 편집 할 것이다. – JasonRShaver