2009-05-19 24 views
8

Tôi đang viết một ứng dụng C# cần có khả năng sửa chữa một tập hợp các tệp bằng cách sử dụng các tệp par2 chẵn lẻ. Đối với C++ có rất nhiều thứ được tìm thấy sẽ thực hiện chính xác điều đó, nhưng đối với C# tôi không thể tìm thấy bản thực thi gốc.C# parchive/quickpar/par2 thực hiện sửa chữa?

Một tùy chọn sẽ sử dụng C++ DLL từ C#, nhưng tôi không muốn làm điều đó vì không thể sử dụng dll 32 bit trong ứng dụng x64 vì vậy tôi sẽ giới hạn ứng dụng ở chế độ 32 bit.

Một tùy chọn khác là xếp chồng par2cmdline ở chế độ nền, nhưng tôi muốn có nhiều quyền kiểm soát hơn đối với quy trình (tiến trình, hủy, v.v.).

Có ai biết cài đặt C# gốc sẽ sửa chữa tệp bằng bộ par2 không?

+0

Bạn đã làm gì? –

Trả lời

0

Nó không phải là một câu trả lời trực tiếp nhưng tôi nghĩ rằng có một cách để tải một dll 32 bit vào một ứng dụng 64bit:

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

Từ bài viết:

Giải pháp này đòi hỏi phải có thêm làm việc như là quá trình thay thế 32-bit tải các DLL 32-bit và cho thấy API của nó phải được tạo ra. Ngoài ra, một số thay đổi sẽ cần thiết ở phía 64 bit vì người tiêu dùng phải sử dụng một trong các kỹ thuật IPC thay vì truy cập trực tiếp vào DLL 32 bit. Điều đáng lưu ý là, trong trường hợp cực đoan, công việc bổ sung này có thể so sánh với công việc liên quan đến việc phát triển phiên bản 64 bit của DLL 32 bit từ đầu.

Một cách có thể để giảm các chi phí này là triển khai trình bao bọc 64 bit 'DLL hiển thị cùng chức năng, tham số, loại và v.v. như là DLL 32 bit gốc. DLL wrapper này sau đó có thể thực hiện các cuộc gọi dựa trên IPC tới bản gốc 32-bit DLL, đã được nạp vào một quá trình thay thế.

+0

Cảm ơn! Đây là một tùy chọn, mặc dù như bài viết đề cập đến nó có thể chỉ là công việc như hoàn toàn viết một par2-thực hiện trong C# từ đầu .. – Led

+0

Đó là một điều tôi sẽ không muốn viết từ đầu ... bao giờ hết! :-) –

0

Tôi đã làm điều gì đó như thế này trong khi quay lại. Nếu bạn nhìn vào mã nguồn par2, nó không tầm thường. Bạn có thể có thể chuyển nó đến C# mà không gặp nhiều rắc rối. Đáng buồn thay, tất cả các nỗ lực mà sẽ mất sẽ chi phí bạn đắt trong hiệu suất (thử nó nếu bạn không tin tôi).

Tôi đã kết thúc cuộc gọi thực thi par2 thông qua CreateProcess. Bạn có thể nhận được xử lý để stdin, stdout và strerr. Bởi vì thực thi là một ứng dụng giao diện điều khiển, bạn có thể phân tích đầu ra để có được tiến trình. Nếu bạn muốn "hủy" thao tác, bạn luôn có thể hủy quá trình.

Đó là một phương pháp cẩu thả.

Cách "đúng" sẽ lấy nguồn par2 và chuyển nó sang một dll 64 bit (gắn với DLL C/C++ không được quản lý vì lý do hiệu suất).

+0

Nếu bạn yêu cầu biết việc chuyển nó sang C# sẽ dẫn đến một hit hiệu suất lớn, tôi có thể hỏi bạn biết cách nào không? Bạn đã thực sự chuyển nó hay nó chỉ là một dự đoán có giáo dục? Tôi không chắc chắn rằng việc chuyển nó vào C# sẽ dẫn đến một hit hiệu suất lớn, nó chỉ là đó không phải là cái gì tôi muốn dành thời gian của tôi trên :) – Led

+4

Tôi thích tuyên bố: "nó không tầm thường. chuyển nó sang C# mà không gặp nhiều rắc rối ". – JasonRShaver

1

Bạn có muốn tự gắn bó với PAR không? Tôi có một nguồn gốc Reed/Solomon hoàn toàn tự nhiên tôi sẽ đăng nếu nó sẽ giúp (trận đấu mà các cải cách hành chính dựa trên), nhưng tôi không có bất cứ điều gì cho tất cả các tập tin xử lý và chia tay.

Mã của tôi là triển khai Luồng và tạo chuỗi có tất cả dữ liệu sửa lỗi được bao gồm. Sau đó bạn có thể làm hỏng dữ liệu đó và gửi lại và hệ thống sẽ tự động khôi phục dữ liệu đó. Tôi chỉ đăng nó nhưng nó là dài và tôi quá lười biếng để tạo một bài đăng trên blog và liên kết tới nó.

Để thực hiện công việc như PAR, bạn phải chia nhỏ tệp đó, sau đó xây dựng hệ thống có thể xác định khối lượng bị thiếu và 'thêm vào' dữ liệu bị hỏng cho tất cả dữ liệu bị thiếu (toán học không thể xử lý dữ liệu bị thiếu) chỉ bị hỏng).

Ngoài ra, như là một lưu ý về hiệu suất, hệ thống này được xây dựng cho là khá "bùng nổ", nó sẽ nhận được trong rất nhiều 100k suối tại một thời điểm, nhưng cũng đã chờ đợi lâu không làm gì cả. Phiên bản C# của môn toán hoạt động nhanh hơn khoảng 6% sau đó là phiên bản C thuần túy. Nếu tôi đã thực hiện kiểm tra hiệu suất bằng cách sử dụng chỉ tải không ngừng, C# chạy khoảng 1-2% chậm hơn. Theo kinh nghiệm của tôi, hầu hết các chuyển đổi từ C đến C# đều có kết quả như nhau.

+1

Tôi thực sự sẽ đánh giá cao nếu bạn đăng nó, ngay cả khi nó chỉ là để tham khảo. Nó có thể hữu ích cho những người khác nữa! – Led

+0

Ok, tôi sẽ cố gắng tìm nó sau ngày làm việc hôm nay và sẽ chỉnh sửa bài đăng này với nơi mã có thể được tìm thấy. – JasonRShaver

Các vấn đề liên quan