C # parchive / quickpar / par2 восстановить реализацию? - PullRequest
9 голосов
/ 19 мая 2009

Я пишу приложение на C #, которое должно иметь возможность восстанавливать набор файлов с использованием файлов четности par2. Для C ++ есть много чего можно сделать, но для C # я не могу найти нативную реализацию.

Одним из вариантов будет использование C ++ DLL из C #, но я бы предпочел этого не делать, поскольку невозможно использовать 32-битную DLL в приложении x64, поэтому я бы ограничил свое приложение режимом 32 бита.

Еще один вариант - запустить par2cmdline в фоновом режиме, но я бы предпочел больше контролировать процесс (прогресс, отмена и т. д.).

Кто-нибудь знает о собственной реализации C #, которая будет восстанавливать файлы с использованием набора par2?

Ответы [ 3 ]

1 голос
/ 20 мая 2009

Вы хотите придерживаться самих PAR? У меня есть полностью родная имплиментация Рида / Соломона, которую я опубликую, если это поможет (соответствие, на котором основаны PAR), но у меня нет ничего для всей обработки файлов и разбивки.

Мой код является реализацией Stream и создает строку со всеми данными для исправления ошибок. Затем вы можете испортить эти данные и отправить их обратно, и система автоматически восстановит их. Я бы просто опубликовал его, но он long , и я слишком ленив, чтобы сделать пост в блоге и ссылку на него.

Чтобы это работало как PAR, вам нужно разбить его на файлы, а затем создать систему, которая может идентифицировать отсутствующие тома и «добавлять» поврежденные данные для всех отсутствующих данных (математика не может обработать отсутствующие данные, только коррумпированной).

Кроме того, как примечание по производительности, система, для которой она была построена, была довольно «взрывной», она могла бы получать множество потоков по 100 тыс. Одновременно, но также долго не могла ничего сделать. Математическая версия на C # работала примерно на 6% быстрее, чем чистая версия на C. Если бы я проводил тестирование производительности, используя только безостановочную нагрузку, C # работает примерно на 1-2% медленнее. По моему опыту, большинство математических преобразований C в C # имеют одинаковые результаты производительности.

0 голосов
/ 19 мая 2009

Я делал что-то подобное некоторое время назад. Если вы посмотрите на исходный код par2, это не тривиально. Вы могли бы, вероятно, перенести его на C # без особых проблем. К сожалению, все усилия, которые потребуются, обойдутся вам очень дорого (попробуйте, если вы мне не верите).

В итоге я вызвал исполняемый файл par2 через CreateProcess. Вы можете получить ручки для stdin, stdout и strerr. Поскольку исполняемый файл является консольным приложением, вы можете проанализировать вывод, чтобы получить прогресс. Если вы хотите «отменить» операцию, вы всегда можете убить процесс.

Это неаккуратный метод.

"Правильный" способ - взять исходный код par2 и перенести его на 64-битную dll (придерживайтесь неуправляемой C / C ++ DLL из соображений производительности).

0 голосов
/ 19 мая 2009

Это не прямой ответ, но я думаю, что есть способ загрузить 32-битную DLL в 64-битное приложение:

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

Из статьи:

Это решение требует дополнительной работы, поскольку необходимо создать 32-разрядный суррогатный процесс, который загружает 32-разрядную DLL и предоставляет ее API. Кроме того, некоторые изменения будут необходимы на 64-битной стороне, так как потребитель должен использовать один из методов IPC вместо прямого доступа к 32-битной DLL. Стоит отметить, что в крайних случаях эта дополнительная работа может быть сравнима с работой, связанной с разработкой 64-битной версии 32-битной DLL с нуля.

Одним из возможных способов снижения этих затрат является реализация DLL-библиотеки 64-битной оболочки, которая предоставляет те же функции, параметры, типы и т. Д., Что и исходная 32-битная DLL. Эта DLL-оболочка может затем выполнять вызовы на основе IPC исходной 32-разрядной DLL, которая была загружена в суррогатный процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...