ParsX.com
پذیرش پروژه از دانشجویی ... تا سازمانی 09376225339
 
   ProfileProfile   Log in to check your private messagesLog in to check your private messages  |  FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups Log inLog in   RegisterRegister 

پردازش فایلها

 
Post new topic   Reply to topic    ParsX.com Forum Index -> ويژوال بيسيك .NET
View previous topic :: View next topic  
Author Message
SAJAD_MIRZA
مهمون يكي دو روزه


Joined: 20 Dec 2005
Posts: 21

PostPosted: Fri Dec 30, 2005 9:43 pm    Post subject: پردازش فایلها Reply with quote

سلام
فرض کنید میخواهیم یه برنامه بنویسیم که محتوای یک فایل رو کد کنه. ساده ترین روش اینه که تک تک بایتهای فایل رو از اول تا آخر بخونیم و از آخر به اول توی یک فایل بنویسیم. به تکه برنامه زیر توجه کنید:

Private inf As String
Private infc As String
Private byt As String
Private lenf, cont As Long

Open FileName For Binary Access Read As #1
inf = ""
lenf = LOF(1)
inf = Space$(lenf)
Get #1, , inf
Close 1
infc = ""
For cont = 1 To lenf
    byt = Mid(inf, cont, 1)
    infc = byt + infc
Next cont

Open FileName2 For Output As #1
Print #1, ""
Close 1
Open FileName2 For Binary Access Write As #1
Put #1, , infc
Close 1

همونطورکه ملاحظه میکنید ابتدا فایل به صورت باینری بازمیکنیم و سپس طول اون را بدست میاریم و محتوای اون را در متغییر inf قرار میدیم بعد کارکترهای اون رو از اول یکی یکی میخونیم و از آخر در متغییر infc قرار میدیم. در پایان یک فایل جدید خالی ایجاد کرده و محتوای infc را در آن فایل قرار میدهیم.
برای آزمایش برنامه آدرس یک فایل متنی را به جای FileName و آدرس فایلی که میخواهید محتوای کد شده در آن قرار گیرد را به جای FileName2 بنویسید.تعاریف را در قسمت General یک فرم وبقیه رو در رویداد کلیک یکCommand Button قرار دهید و برنامه رو اجرا کنید.
وقتی که فایلها متنی باشند مشکلی پیش نمیاد.اینبارخط زیر را قبل از Next cont بنویسید و یک Text box به فرم اضافه کنید
If cont Mod 100 = 0 Then Text1.Text = lenf - cont
حالا برنامه رو با یک فایل بزرگتر مثلا چند صد کیلو بایتی امتحان کنید.میبینید چقدر طول میکشه؟
توی Text box یه عدد وجود داره که در ابتدا برابر با طول فایل برحسب بایته و رو به کاهش هست هرچه این عدد به صفر نزدیک بشه برنامه به انتها نزدیک تر میشه.
برای یک فایل یک مگا بایتی شاید چند ساعت طول بکشه تا برنامه تموم بشه. همونطور که میبینید هرچه عدد نشون داده کوچکتر میشه سرعت هم کمتر میشه. چون طول رشته infc بیشتر میشه و انجام عملیات روی اون سخت ترووقت گیرتر. برای این که برنامه سریعتر بشه میتونیم هر10 کیلو بایت رو توی یه خونه از یه آرایه قرار بدیم بعد همه رو به هم الحاق کنیم. برای اینکار کد زیر رو داخل حلقه اضافه کنید

   If cont Mod 10000 = 0 Then
     savinf(cont \ 10000) = infc
     infc = ""
   End If

بعد از اتمام حلقه با یه حلقه ی for همه خونه های آرایه رو با هم جمع میکنیم و درinfc قرار میدیم. بعد هم اونو توی فایل جدید مینویسیم. نکته اینه که تعداد خونه های آرایه بستگی به طول فایل داره برای یه فایل یک مگا بایتی آرایه باید حدود 105 تا خونه داشته باشه.
من با این طرفند سرعت پردازش فایل رو خیلی زیاد کردم(حدود یک دقیقه برای یک فایل یک مگا بایتی) ولی باز هم برام قانع کننده نبود برای همین روش کار خودم رو در بالا ذکر کردم که معلوم باشه دقیقا میخوام چیکار کنم .

سوال من اینه : راه سریعتری برای پردازشهای این چنینی سراغ دارید؟ اگه جوابتون مثبت لطف کنید بنویسید تا ما هم استفاده کنیم. من که از کندی سرعت روش خودم به ستوه اومدم.

منتظر جوابم ...............
[/code]
Back to top
vahid
بي تو هرگز


Joined: 26 Nov 2004
Posts: 3067
Location: Tehran

PostPosted: Sat Dec 31, 2005 10:22 pm    Post subject: Reply with quote

يعني چي محتواي يك فايل رو كد كنه ؟
Back to top
SAJAD_MIRZA
مهمون يكي دو روزه


Joined: 20 Dec 2005
Posts: 21

PostPosted: Sun Jan 01, 2006 5:30 pm    Post subject: Reply with quote

vahid wrote:
يعني چي محتواي يك فايل رو كد كنه ؟


سلام
وحید جون ازت ممنونم که حداقل تو یکی به فکر ما هستی اگه یکم دقت کنی میبینی اینجا تو تنها کسی هستی که جواب من رو میدی. بقیه انگار....... بگذریم....

میدونیم که برای نگه داری اطلاعات در حافظه کامپیوتر باید اونها رو به صورت 0و1 در بیاریم در حالی که نه متن نه صوت و نه تصویر واقعا صفر و یک نیستند پس باید یه روشی باشه که اونها رو به این حالت در بیاره این روش را کد کردن اطلاعات میگن.
مثلا برای یه فایل Bitmap که 24 بیتی باشه هر سه بایت برای یک پیکسل اختصاص داده میشه که بایتها به ترتیب شدت رنگ قرمز سبز و آبی رو مشخص میکنه. هریک از فایلهای تصویری با فرمت های Jpg,Gif,Psd,Tif و... با روش منحصر به فرد خودشون تصویر را کد میکنند و در فایل ذخیره میکنند.
معمولا در ابتدای هر فایل یک بلوک کوچک وجود داره که فرمت و نوع فایل رو مشخص میکنه مثلا برای Bmp ها این بلوک 54 بایته وBmp بودن فایل همچنین تعداد رنگ و طول و عرض تصویر رو مشخص میکنه برای همینه که اگه پسوند یک فایل رو از Bmp به Jpg تغییر بدیم باز هم برنامه ای مثل ACDsee اونو یک فایل از نوع Bmp تشخیص میده.
خوب فرض کنید ما میخواهیم اطلاعات یک فایل Bmp طوری دستکاری کنیم که اولا برای برنامه های مرورگر تصویر قادر به شناسایی اون نباشه و در ثانی خودمون در مواقع نیاز بتونیم اونو ببینیم(به یه فایل Bmp استاندارد تبدیلش کنیم) . منظور من از کد کردن یه فایل دقیقا این بود. با روشهای زیادی میشه این کار رو کرد که توی پست قبلی به یکیشون اشاره کردم وبراش یه مثال آوردم. همونطور که گفتم برای یه همچین کاری یا هر نوع اعمال پردازشی رو یه فایل باید یک یا چند با بایت به بایت فایل رو بخونیم تغییرات رو اعمال کنیم و در نهایت توی یه فایل جدید (یا همون فایل) ذخیره کنیم . استفاده از دستور Open و جادادن محتوا در یک رشته سرعت کار رو خیلی پایین میاره


برای همین من از شما خواهش میکنم اگه روش سریعتری سراغ دارید بهم یاد بدید.
Back to top
unknown
مدير بخش ويژوال بيسيك
مدير بخش ويژوال بيسيك


Joined: 05 Dec 2004
Posts: 439
Location: Tehran

PostPosted: Sun Jan 01, 2006 7:21 pm    Post subject: Reply with quote

عزیزم روشی که استفاده کردی همون طور که خودت هم گفتی خیلی وقت گیره.
برای رمز گزاری روش های مختلفی وجود داره که با یه search ساده می تونی هم الگوریتم هم کداش رو پیدا کنی. اگه امنیت خیلی برات مهم هست من الگوریتم من الگوریتم Cipher یا base64 رو پیشنهاد می کنم.
ولی اگه زمان رو مهم تر میدونی از کد زیر استفاده کن. البته وقت تست کردنش رو ندارم ولی برنامه نویسش می گه خیلی سریع هست
نتیجه رو هم بگو...


Public Function DecodeQP(ByRef StrToDecode As String) As String

    Dim sTemp As String
    Dim i As Integer
    sTemp = StrToDecode

    For i = 255 To 127 Step -1
        If InStr(1, sTemp, "=" & Hex$(i)) <> 0 Then sTemp = Replace(sTemp, "=" & Hex$(i), Chr$(i))
    Next

    If InStr(1, sTemp, "=" & Hex$(61)) <> 0 Then sTemp = Replace(sTemp, "=" & Hex$(61), Chr$(255) & Chr$(254))

    For i = 32 To 10 Step -1
        If InStr(1, sTemp, "=" & Hex$(i)) <> 0 Then sTemp = Replace(sTemp, "=" & Hex$(i), Chr$(i))
    Next


    For i = 9 To 0 Step -1
        If InStr(1, sTemp, "=" & "0" & Hex$(i)) <> 0 Then sTemp = Replace(sTemp, "=" & Hex$(i), Chr$(i))
    Next

    sTemp = Replace(sTemp, "=", "")
    sTemp = Replace(sTemp, Chr$(255) & Chr$(254), "=")
    DecodeQP = sTemp
End Function


Public Function EncodeQP(ByRef StrToEncode As String) As String

    Dim sTemp As String
    Dim i As Integer
    sTemp = StrToEncode

    For i = 255 To 127 Step -1
        If InStr(1, sTemp, Chr$(i)) <> 0 Then sTemp = Replace(sTemp, Chr$(i), "=" & Hex$(i))
    Next

    If InStr(1, sTemp, Chr$(61)) <> 0 Then sTemp = Replace(sTemp, Chr$(61), "=" & Hex$(61))

    For i = 32 To 10 Step -1
        If InStr(1, sTemp, Chr$(i)) <> 0 Then sTemp = Replace(sTemp, Chr$(i), "=" & Hex$(i))
    Next


    For i = 9 To 0 Step -1
        If InStr(1, sTemp, Chr$(i)) <> 0 Then sTemp = Replace(sTemp, Chr$(i), "=" & "0" & Hex$(i))
    Next

    EncodeQP = sTemp
End Function 
Back to top
SAJAD_MIRZA
مهمون يكي دو روزه


Joined: 20 Dec 2005
Posts: 21

PostPosted: Tue Jan 03, 2006 9:10 pm    Post subject: Reply with quote

امیر جون ممنونم برنامه سریع وخوبیه

فقط یه سوال: میشه با دستور Replace یا یه چیزی مثل اون کاراکترهای یه رشته رو برحسب ترتیب شون ویرایش کرد مثلا کاراکتر شماره 12 رو صرف نظر از اینکه چیه به "S" تغییر بدیم البته برای رشته طولانی مثل رشته مربوط به فایل های بزرگ سریع عمل کنه

با تشکر
Back to top
unknown
مدير بخش ويژوال بيسيك
مدير بخش ويژوال بيسيك


Joined: 05 Dec 2004
Posts: 439
Location: Tehran

PostPosted: Wed Jan 04, 2006 3:01 am    Post subject: Reply with quote

آره فکر نکنم مشکلی داشته باشه
Back to top
SAJAD_MIRZA
مهمون يكي دو روزه


Joined: 20 Dec 2005
Posts: 21

PostPosted: Thu Jan 05, 2006 8:01 pm    Post subject: Reply with quote

میشه یکم توضیح بدید چه طوری
Back to top
Display posts from previous:   
Post new topic   Reply to topic    ParsX.com Forum Index -> ويژوال بيسيك .NET All times are GMT + 3.5 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum