Posted: Fri Dec 30, 2005 9:43 pm Post subject: پردازش فایلها
سلام
فرض کنید میخواهیم یه برنامه بنویسیم که محتوای یک فایل رو کد کنه. ساده ترین روش اینه که تک تک بایتهای فایل رو از اول تا آخر بخونیم و از آخر به اول توی یک فایل بنویسیم. به تکه برنامه زیر توجه کنید:
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 تا خونه داشته باشه.
من با این طرفند سرعت پردازش فایل رو خیلی زیاد کردم(حدود یک دقیقه برای یک فایل یک مگا بایتی) ولی باز هم برام قانع کننده نبود برای همین روش کار خودم رو در بالا ذکر کردم که معلوم باشه دقیقا میخوام چیکار کنم .
سوال من اینه : راه سریعتری برای پردازشهای این چنینی سراغ دارید؟ اگه جوابتون مثبت لطف کنید بنویسید تا ما هم استفاده کنیم. من که از کندی سرعت روش خودم به ستوه اومدم.
سلام
وحید جون ازت ممنونم که حداقل تو یکی به فکر ما هستی اگه یکم دقت کنی میبینی اینجا تو تنها کسی هستی که جواب من رو میدی. بقیه انگار....... بگذریم....
میدونیم که برای نگه داری اطلاعات در حافظه کامپیوتر باید اونها رو به صورت 0و1 در بیاریم در حالی که نه متن نه صوت و نه تصویر واقعا صفر و یک نیستند پس باید یه روشی باشه که اونها رو به این حالت در بیاره این روش را کد کردن اطلاعات میگن.
مثلا برای یه فایل Bitmap که 24 بیتی باشه هر سه بایت برای یک پیکسل اختصاص داده میشه که بایتها به ترتیب شدت رنگ قرمز سبز و آبی رو مشخص میکنه. هریک از فایلهای تصویری با فرمت های Jpg,Gif,Psd,Tif و... با روش منحصر به فرد خودشون تصویر را کد میکنند و در فایل ذخیره میکنند.
معمولا در ابتدای هر فایل یک بلوک کوچک وجود داره که فرمت و نوع فایل رو مشخص میکنه مثلا برای Bmp ها این بلوک 54 بایته وBmp بودن فایل همچنین تعداد رنگ و طول و عرض تصویر رو مشخص میکنه برای همینه که اگه پسوند یک فایل رو از Bmp به Jpg تغییر بدیم باز هم برنامه ای مثل ACDsee اونو یک فایل از نوع Bmp تشخیص میده.
خوب فرض کنید ما میخواهیم اطلاعات یک فایل Bmp طوری دستکاری کنیم که اولا برای برنامه های مرورگر تصویر قادر به شناسایی اون نباشه و در ثانی خودمون در مواقع نیاز بتونیم اونو ببینیم(به یه فایل Bmp استاندارد تبدیلش کنیم) . منظور من از کد کردن یه فایل دقیقا این بود. با روشهای زیادی میشه این کار رو کرد که توی پست قبلی به یکیشون اشاره کردم وبراش یه مثال آوردم. همونطور که گفتم برای یه همچین کاری یا هر نوع اعمال پردازشی رو یه فایل باید یک یا چند با بایت به بایت فایل رو بخونیم تغییرات رو اعمال کنیم و در نهایت توی یه فایل جدید (یا همون فایل) ذخیره کنیم . استفاده از دستور Open و جادادن محتوا در یک رشته سرعت کار رو خیلی پایین میاره
برای همین من از شما خواهش میکنم اگه روش سریعتری سراغ دارید بهم یاد بدید.
عزیزم روشی که استفاده کردی همون طور که خودت هم گفتی خیلی وقت گیره.
برای رمز گزاری روش های مختلفی وجود داره که با یه 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
فقط یه سوال: میشه با دستور Replace یا یه چیزی مثل اون کاراکترهای یه رشته رو برحسب ترتیب شون ویرایش کرد مثلا کاراکتر شماره 12 رو صرف نظر از اینکه چیه به "S" تغییر بدیم البته برای رشته طولانی مثل رشته مربوط به فایل های بزرگ سریع عمل کنه
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