اکسترکت کردن فایل Rar در سی شارپ

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
خیلی ممنون آقا علی:rose:
همه چی درست شد
:rose:
فقط توی اون حلقه ای که قرار میگرفت یعنی کد :

کد:
rar.ReadHeader()

که توی حلقه گذاشته شد ؛ این باعث میشه هر بار و آنقدر فایل های داخل رار رو دونه دونه بخونه و بعدش در بدنه ی حلقه اکسترکت کنه تا تموم شه؟؟ یعنی عملیات رو برای تک تک فایل انجام میده هر بار دیگه نه اینکه یه دفعه انجام بده . درسته؟
این روش خیلی راحت تر از اون فایل ها بود که گفتین . فقط پیوست کردن شون مراحل داشت :green:


-------------------------

ولی یه مشکل وجود داره
وقتی فایل rar با دو پارت (حجم دو پارت 1.7 گیگ) رو اکسترکت میخوام کنم ، ارور File CRC Error رو میده (try-catch کردم)
ولی با نرم افزار رار ، اکسترکت میشه و مشکلی نداره
حالا نمیدونم بخاطر چند پارت بودن شه یا پر حجم بودنش!
منم فقط مسیر اولین پارت رو دادم برای اکسترکت . از 1.7 گیگ ، فقط 250 مگ رو اکسترکت میکنه و اون ارور رو میده
نمیدونین بخاطر چیه؟
 
آخرین ویرایش:

the_king

مدیرکل انجمن
خیلی ممنون آقا علی:rose:
همه چی درست شد
:rose:
فقط توی اون حلقه ای که قرار میگرفت یعنی کد :

کد:
rar.ReadHeader()

که توی حلقه گذاشته شد ؛ این باعث میشه هر بار و آنقدر فایل های داخل رار رو دونه دونه بخونه و بعدش در بدنه ی حلقه اکسترکت کنه تا تموم شه؟؟ یعنی عملیات رو برای تک تک فایل انجام میده هر بار دیگه نه اینکه یه دفعه انجام بده . درسته؟
این روش خیلی راحت تر از اون فایل ها بود که گفتین . فقط پیوست کردن شون مراحل داشت :green:


-------------------------

ولی یه مشکل وجود داره
وقتی فایل rar با دو پارت (حجم دو پارت 1.7 گیگ) رو اکسترکت میخوام کنم ، ارور File CRC Error رو میده (try-catch کردم)
ولی با نرم افزار رار ، اکسترکت میشه و مشکلی نداره
حالا نمیدونم بخاطر چند پارت بودن شه یا پر حجم بودنش!
منم فقط مسیر اولین پارت رو دادم برای اکسترکت . از 1.7 گیگ ، فقط 250 مگ رو اکسترکت میکنه و اون ارور رو میده
نمیدونین بخاطر چیه؟

ربطی به حجم فایل تون نداره، خطا باید مربوط به یک ناسازگاری با چند تکه بودن در کد unrar.cs باشه. فرصت نکردم کدش رو بررسی کنم اما هر چی که هست از همونه.
ایراد از خود unrar.dll نیست چون مثال Visual Basic .NET اش مشکلی با چند تکه بودن فایل نداره، البته یک پیغام Oops!!, I don't know what I doing here برای هر تکه نشون میده.

فایل اجرایی TestRAR.exe اش رو با فایل rar چند تکه تان امتحان کنید، مثال ویژوال بیسیک ئه :
مشاهده پیوست bin.zip
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
ربطی به حجم فایل تون نداره، خطا باید مربوط به یک ناسازگاری با چند تکه بودن در کد unrar.cs باشه. فرصت نکردم کدش رو بررسی کنم اما هر چی که هست از همونه.
ایراد از خود unrar.dll نیست چون مثال Visual Basic .NET اش مشکلی با چند تکه بودن فایل نداره، البته یک پیغام Oops!!, I don't know what I doing here برای هر تکه نشون میده.

فایل اجرایی TestRAR.exe اش رو با فایل rar چند تکه تان امتحان کنید، مثال ویژوال بیسیک ئه :
مشاهده پیوست 111546


ممنون
جز همون پیامی که گفتین ، مشکلی نداشت ویژال بیسیک و درست اکسترکت کرد ولی کد من توی سی شارپ اینه که اون ارور رو میده (عین کد شماست) و علی الظاهر نباید مشکلی باشه :

کد:
public static string RarExtract(string rarSourceFile, string rarDestinationFolder, string password)
        {
            try
            {
                Unrar rar = new Unrar(rarSourceFile);
                rar.DestinationPath = rarDestinationFolder;
                rar.Password = password;
                rar.Open(Unrar.OpenMode.Extract);
                while (rar.ReadHeader())
                {
                    rar.Extract();
                }
                rar.Close();
                return "extracted";
            }
            catch (Exception err)
            {


                MessageBox.Show(err.Message);
                return err.Message;
            }
        }
 

the_king

مدیرکل انجمن

ممنون
جز همون پیامی که گفتین ، مشکلی نداشت ویژال بیسیک و درست اکسترکت کرد ولی کد من توی سی شارپ اینه که اون ارور رو میده (عین کد شماست) و علی الظاهر نباید مشکلی باشه :

کد:
public static string RarExtract(string rarSourceFile, string rarDestinationFolder, string password)
        {
            try
            {
                Unrar rar = new Unrar(rarSourceFile);
                rar.DestinationPath = rarDestinationFolder;
                rar.Password = password;
                rar.Open(Unrar.OpenMode.Extract);
                while (rar.ReadHeader())
                {
                    rar.Extract();
                }
                rar.Close();
                return "extracted";
            }
            catch (Exception err)
            {


                MessageBox.Show(err.Message);
                return err.Message;
            }
        }

کد متد RARCallback رو در اون فایل unrar.cs پیدا کنید، باید یک سطر کدش رو تغییر دهید.
یک اشکال برنامه نویسی کوچیک اینطوری نتیجه میده، در unrar.dll یک روتین CallbackProc هست که رخداد هایی که در حین عملیات رخ می دهند رو به برنامه اطلاع بده.
رخداد هایی مثل DataAvailable و MissingVolume و NewVolume که در اون کلاس Unrar می بینید از همین روتین استفاده می کنند که اطلاع می دهند که فرضا یک تکه فایل پیدا نشد و باید از کاربر مسیر درستش رو بپرسید.
برنامه توی این روتین باید 1 به معنای ادامه عملیات یا 1- به معنای کنسل کردن عملیات و یا 0 به معنای ناشناخته بودن پیغام رو پاسخ بده.

اشکال عمده کار اینجا است که هم در کد ویژوال بیسیک و هم در کد #C پیغام های روتین CallbackProc رو کامل پیاده سازی نکرده اند، بعضی هاشو نوشته اند و بعضی هاشو ننوشته اند.
یکی از پیغام های CallbackProc پیغام UCM_CHANGEVOLUMEW ئه که برای rar های تک قسمتی کاربردی نداره و موقعی که تکه فایل بعدی rar باز میشه رخ میده.
اما دلیل اینکه کد ویژوال بیسیک درست عمل می کنه اینه که برای پیغام های ناشناخته مقدار 0 رو بر می گردونه که پاسخ درستی ئه
در کد ویژول بیسیک برای پیغام هایی که پیاده سازی نشده با Case Else همچین کدی نوشته اند :
کد:
            Case Else
                MsgBox("Oops!!, I don't know what I doing here")
        End Select

    End Function
این کد فقط یک پیغام نمایش میده و چون مقدار بازگشتی نداره مقدار 0 پیشفرض رو بر می گردونه که به معنی پیغام ناشناخته است، یعنی پیغام هایی که در کد پیاده سازی نشده رو خطا حساب نمیکنه.
اما در کد #C یک مقدار پیشفرض 1- در همون ابتدای کد در نظر گرفته شده و برای همه پیغام های پیاده سازی نشده این مقدار 1- رو بر می گردونه که به معنی کنسل کردن عملیات ئه :
کد:
        private int RARCallback(uint msg, int UserData, IntPtr p1, int p2)
        {
            string volume = string.Empty;
            string newVolume = string.Empty;
[B][COLOR="#0000FF"]            int result = -1;[/COLOR][/B]
.
.
.
            return result;
        }
کاری که شما باید بکنید اینه که متد RARCallback رو طوری تغییر بدهید که برای پیغام هایی مثل UCM_CHANGEVOLUMEW که پیاده سازی نشده مقدار 0 رو برگردونه، نه 1- که تکه های بعدی رو نادیده نگیره :
کد:
        private int RARCallback(uint msg, int UserData, IntPtr p1, int p2)
        {
            string volume = string.Empty;
            string newVolume = string.Empty;
            int result = [B][COLOR="#0000FF"]0[/COLOR][/B];
 

SajjadKhati

کاربر فعال <A href="http://forum.majidonline.com/f
واقعا ممنونم استاد علی
درست شد
خیلی تو زحمت تون انداختم ؛ عذر میخوام :rose:
من که دانش جبران کردن شو ندارم ولی خدا براتون جبران کنه
 

جدیدترین ارسال ها

بالا