باز کردن یک فایل بصورت باینری و ویرایش کردن محتویات آن (ویژوال بیسیک)

شروع موضوع توسط Mostafa Khalili ‏16 آوریل 2011 در انجمن منطق و الگوریتم برنامه‌نویسی

  1. Mostafa Khalili

    Mostafa Khalili New Member

    ارسال‌ها:
    24
    تشکر شده:
    3
    امتیاز دستاورد:
    1
    دوستان من میخواستم بدونم چطوری میشه یه فایل رو حالا با هر پسوندی رو توی ویبی به صورت هگز باز کرد و بشه کد هگز مورد نظر رو در اون جستجو کرد و یه مقدار جدید جایگزینش کرد و در نهایتش سیوش کرد.
    ممنون میشم اگر کسی سورسی یا کمکی میتونه بکنه چون در این ضمینه هیچ اطلاعی ندارم.
     
    آخرین ویرایش: ‏1 می 2011
    نوشته شده توسط Mostafa Khalili در ‏16 آوریل 2011
  2. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    9,976
    تشکر شده:
    9,871
    امتیاز دستاورد:
    113
    نگید هگز، عبارت باینری صحیح تره، چون هگز صرفا یک مبنای عددی و یک شیوه نمایش داده است، اما باینری
    علاوه بر اینکه یک مبنای عددی است، یک شیوه دسترسی به فایله، درست نقطه مقابل شیوه دسترسی متنی.

    موقعی که یک فایل رو با دستور Open و در مد For Binary باز می کنید، بصورت باینری باز میشه :
    کد (Text):

        Open "file.ext" For Binary As #1
     
    و با فرمان Get از داخلش داده ها رو می خوانید :
    کد (Text):

        Get #1, , Data
     
    و با فرمان Put داده ها را داخلش می نویسید :
    کد (Text):

        Put #1, , Data
     
    و با فرمان Close فایل رو می بندید :
    کد (Text):

        Close #1
     
    مثلا برنامه زیر فایل file.ext رو باز می کنه، دنبال بایت های 00 می گرده و همه شون رو به FF تغییر می ده :
    کد (Text):

        Dim Data() As Byte, Pos As Long, Length As Long
        Open "file.ext" For Binary As #1
        Length = LOF(1)
        If Length > 0 Then
            ReDim Data(0 To Length - 1)
            Get #1, 1, Data
            For Pos = 0 To Length - 1
                If Data(Pos) = &H0 Then Data(Pos) = &HFF
            Next
            Put #1, 1, Data
        End If
        Close #1
     
     
    نوشته شده توسط the_king در ‏16 آوریل 2011
    arian17*، arash.arya43، 0098 و یک نفر دیگر از این ارسال تشکر کرده اند.
  3. Mostafa Khalili

    Mostafa Khalili New Member

    ارسال‌ها:
    24
    تشکر شده:
    3
    امتیاز دستاورد:
    1
    ممنون دوست عزیز حالا یه سوال دیگه این روشی که شما گفتید هر فایلی رو که خواستیم باز میکنه؟؟ مثلا jpg یا exe و میشه داخلش تغیراتی به وجود آورد طبق همون روشی که گفتید؟
     
    نوشته شده توسط Mostafa Khalili در ‏16 آوریل 2011
  4. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    9,976
    تشکر شده:
    9,871
    امتیاز دستاورد:
    113
    بله، وقتی فایل رو بصورت باینری باز می کنید فایل رو یکسری داده ها خام در نظر می گیره و اینکه داخل فایل چی
    قرار داره و فرمت فایل چیه اهمیتی نداره.
     
    نوشته شده توسط the_king در ‏16 آوریل 2011
    arian17*، arash.arya43 و Mostafa Khalili از این ارسال تشکر کرده اند.
  5. Mostafa Khalili

    Mostafa Khalili New Member

    ارسال‌ها:
    24
    تشکر شده:
    3
    امتیاز دستاورد:
    1
    بسیار تا بسیار متشکر هیچ فکر نمیکردم این انجمن به این سرعت مشکلات یه نفرو برطرف کنه.
    اگر اشکالی نداره یه سوال دیگه هم در این رابطه بپرسم.
    شما فرض کنید ما دو تا فایل داریم.میخواییم فایل شماره یک رو باز کنیم و مثلا مقداری از کدهای باینری فایلی رو که باز کردیم مثلا 10 خطش رو با کل محتوای باینری فایل دو جابه جا کنیم در این صورت باید چیکار کرد.مثلا به برنامه بگیم شما از فایل یک از ابتدای فلان خط شروع کن به جستجو تا اخر فلان خط و کل محتوای باینری فایل دوم رو در جایگزین محتوای انتخاب شده فایل اولی بکن.
    خودم فکر میکنم برای این کار باید از آدرسی دهی از طریق آفست انجام بشه.البته یه حدس بود ممنون میشم مثل قبل راهنماییم کنید.
     
    نوشته شده توسط Mostafa Khalili در ‏17 آوریل 2011
  6. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    9,976
    تشکر شده:
    9,871
    امتیاز دستاورد:
    113
    ابتدا به این نکته توجه کنید که در فایل باینری خط مفهوم خاصی نداره، خط و سطر مربوط به فایل های متنی هستند.
    وقتی یک فایل باینری رو باز می کنید، هیچ پردازشی روی داده ها انجام نمیشه، واحد پردازش بایته، نه خط و سطر.
    شما در فایل باینری باید بگید بایت چندم. برای اینکه بدانید سطر شماره n از کدوم بایت شروع میشه بایستی
    داده های داخل فایل رو پیمایش کنید تا به کاراکتر های انتهای سطر (کاراکتر 13 و کاراکتر 10) برسید تا یک سطر تموم بشه.

    به عنوان مثال کد زیر 100 بایت ابتدای از فایل first.ext رو با 100 بایت ابتدای فایل second.ext تعویض می کنه،
    از فایل اول به فایل دوم منتقل میشه و از فایل دوم به فایل اول. داده ها این وسط از دست نمی روند و
    طبیعتا اگه این برنامه رو دوباره اجرا کنید داده های داخل ایندو فایل به جای اولیه شون بر می گردند :
    کد (Text):

        Dim Data1(0 To 99) As Byte, Data2(0 To 99) As Byte
        Open "first.ext" For Binary As #1
        Open "second.ext" For Binary As #2
        Get #1, , Data1
        Get #2, , Data2
        Put #1, 1, Data2
        Put #2, 1, Data1
        Close #1
        Close #2
     
    دقت کنید که در دستورات Put پارامتر دوم روی 1 تنظیم شده، یعنی از بایت 1 ام به بعد بخوان و بنویس.
    دلیلش این است که قبل از دستورات Put دستورات Get ای اجرا شده و موقعیت مکان نمای فایل ها
    100 بایت به جلو حرکت کرده و دیگر ابتدای فایل نیست.

    زمانی که از دستور Get یا Put استفاده می کنید موقعیت مکان نما در فایل به همان اندازه که می خوانید
    یا می نویسید به سمت جلو حرکت می کنه، در نتیجه اگر می خواهید در همان مکان قبلی چیزی را بخوانید
    یا نویسید یا باید با استفاده از دستور Seek به موقعیت قبلی برگردید و یا در دستورات Put و Get بعدی موقعیت
    خواندن و نوشتن را مشخص کنید. در دستورات Get نیازی به این پارامتر 1 نبود، چون موقعیت مکان نما در
    فایلی که تازه باز شده همان بایت 1 ام است.

    اگر می خواهید بجای 100 بایت 10 سطر از فایل ها را بخوانید باید این مساله را هم در نظر بگیرید که 10 سطر
    ممکن است در یک فایل 50 بایت باشد و در یک فایل دیگر 1000 بایت و جابجا کردن بین 50 بایت و 1000 بایت
    نباید به داده های بعد از آنها آسیبی برساند، اگر مستقیما 1000 بایت را جایی قرار دهید که قبلا 50 بایت
    قرار داشته، 950 بایتی که بعد از 50 بایت قرار داشته را نابود می کنید و اگر 50 بایت را جایی قرار دهید که
    قبلا 1000 بایت قرار داشته، 950 بایت بعد از آن دست نخورده باقی می ماند.

    برای جلوگیری از این اتفاق باید تمام داده های بعد از 10 سطر را هم بخوانید و بنویسید. کد زیر اینکار را به
    درستی انجام می دهد، 10 سطر از فایل first.txt را با 10 سطر از فایل second.txt تعویض می کند.
    فقط دقت کنید که قرار است محتویات فایل ها داده های متنی ASCII باشند :
    کد (Text):

        Dim Data As String, Length As Long
        Dim Lines1() As String, Lines2() As String
        Dim Index As Long
        Open "first.txt" For Binary As #1
        Length = LOF(1)
        If Length > 0 Then
            Data = Space(Length)
            Get #1, , Data
        Else
            Data = vbCrLf
        End If
        Lines1 = Split(Data, vbCrLf)
        Close #1
        Open "second.txt" For Binary As #2
        Length = LOF(2)
        If Length > 0 Then
            Data = Space(Length)
            Get #2, , Data
        Else
            Data = vbCrLf
        End If
        Lines2 = Split(Data, vbCrLf)
        Close #2
        Open "first.txt" For Output As #1
        For Index = 0 To 9
            If Index > UBound(Lines2) Then Exit For
            Print #1, Lines2(Index)
        Next
        For Index = 10 To UBound(Lines1)
            Print #1, Lines1(Index)
        Next
        Close #1
        Open "second.txt" For Output As #2
        For Index = 0 To 9
            If Index > UBound(Lines1) Then Exit For
            Print #2, Lines1(Index)
        Next
        For Index = 10 To UBound(Lines2)
            Print #2, Lines2(Index)
        Next
        Close #1
     
     
    نوشته شده توسط the_king در ‏17 آوریل 2011
    arian17*، arash.arya43، 0098 و یک نفر دیگر از این ارسال تشکر کرده اند.
  7. Mostafa Khalili

    Mostafa Khalili New Member

    ارسال‌ها:
    24
    تشکر شده:
    3
    امتیاز دستاورد:
    1
    بازم ممنون علی آقا میخواستم بدونم میشه مانند دستور اول یه حالت سرچ مانندی براش به وجود آورد که مثلا بگیم شما از فلان جا باید که اولش &h8562127 بخون تا زمانی که رسیدی به &h564f547 بعدش وقتی به آخرش رسید این بشه اون محدوده ما و اون محدوده رو هم که میخواییم جایگزین کنیم فکر کنم بهتر بششه بدستش اورد . چون اینجوری شاید یک فایل چندین و چند هزار بایت داشته باشه و اینجوری کار خیلی سخت میشه.
     
    نوشته شده توسط Mostafa Khalili در ‏17 آوریل 2011
  8. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    9,976
    تشکر شده:
    9,871
    امتیاز دستاورد:
    113
    اعدادی مثل H8562127& چهار بایتی (32 بیتی) هستند و موقع جستجو کردن هم باید از نوع داده 32 بیتی Long
    استفاده کرد. فقط به این نکته توجه داشته باشید که وقتی 4 بایت 4 بایت داده ها رو پردازش می کنیم فرض رو بر
    این قرار دادیم که داده ها 4 بایتی نوشته شده اند، یعنی داده مورد نظر ما در میان یکسری داده 32 بیتی
    قرار گرفته و اگر از ابتدای فایل 4 بایت 4 بایت به جلو حرکت کنیم پیدایش می کنیم.

    وگرنه ممکنه موردی که جستجو می کنیم وجود داشته باشه اما پیدا نشه. به عنوان مثال در داده های زیر داده
    H11223344& هست اما اگر داده ها رو 32 بیتی پردازش کنیم بصورت قطعات 32 بیتی پردازش میشه و
    بین دو داده 32 بیتی قرار می گیره میشه و پیدا نخواهد شد (داده ها در فایل برعکس نوشته می شوند) :
    کد (Text):

    8899[B][COLOR="Blue"]1122[/COLOR][/B] [COLOR="Blue"][B]3344[/B][/COLOR]5566 77889900
     
    طبیعتا جستجوی 32 بیتی (چهار بایتی) سریعتر از جستجوی 8 بیتی (یک بایتی) است اما همانند مثال بالا ممکنه
    موردی رو از دست بدهیم. در مثال زیر در فایل file.ext دنبال داده H11223344& می گردیم و اگر پیدا شد، متغیر
    Start موقعیت آن در فایل را بر حسب بایت مشخص می کند، این جستجو فقط زمانی موثر است که داده ها
    32 بیتی ذخیره شده باشند :
    کد (Text):

        Dim Data As Long, Start As Long
        Open "file.ext" For Binary As #1
        Do While Loc(1) + 4 <= LOF(1)
            Get #1, , Data
            If Data = &H11223344 Then
                Start = Loc(1) - 4
                Exit Do
            End If
        Loop
        Close #1
     
    می توانیم همینکار را با جستجوی 8 بیتی (یک بایتی) انجام دهیم که طبیعتا کندتر است چون هر بایتی چهار بار
    جستجو می شود، اما مزیت این شیوه در این است که هیچ موردی را از قلم نمی اندازد :
    کد (Text):

        Dim Data As Long, Start As Long, Length As Long, Pos As Long
        Open "file.ext" For Binary As #1
        Length = LOF(1)
        For Pos = 1 To Length - 3
            Get #1, Pos, Data
            If Data = &H11223344 Then
                Start = Pos
                Exit For
            End If
        Next
        Close #1
     
    حالا شما می توانید این جستجو را دوبار انجام دهید، یکبار دنبال نقطه شروع بگردید و یکبار دنبال نقطه پایان
    و سپس داده های بین ایندو را بخوانید و بنویسید.
     
    آخرین ویرایش: ‏18 آوریل 2011
    نوشته شده توسط the_king در ‏18 آوریل 2011
    arian17*، arash.arya43 و Mostafa Khalili از این ارسال تشکر کرده اند.
  9. Mostafa Khalili

    Mostafa Khalili New Member

    ارسال‌ها:
    24
    تشکر شده:
    3
    امتیاز دستاورد:
    1
    دستتون درد نکنه.
    بحث خیلی جالبی شده واسه من که برای اولین بار دارم با باینری کار میکنم و چیزای خوبی از شما یاد گرفتم ولی طبیعاتا چون بار اولمه دارم آخراش قاطی میکنم.
    من یه فایل ضمیمه کردم با فرمت EEC حالا میخوام یه محدوده از dfb8c35d تا 7f06f9a7 که در این فایل موجوده محدوده ما قرار بگیره و ما به جای این محدوده یه مقادیر دیگری از هر فایلی که خواستی رو جایگزینش کنید.ممنون میشم سورس رو برای این بنویسید چون فکر کنم بهتر موضوع رو درک کنم.
     

    پیوست ها:

    • Vb.zip
      اندازه فایل:
      کیلوبایت 4.4
      نمایش ها:
      13
    نوشته شده توسط Mostafa Khalili در ‏18 آوریل 2011
  10. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    9,976
    تشکر شده:
    9,871
    امتیاز دستاورد:
    113
    به این مساله توجه کنید که اعداد 32 بیتی در حافظه بصورت بایت های معکوس نوشته می شوند، مثلا عدد H12345678&
    به صورت بایت های متوالی زیر نوشته می شود :
    کد (Text):

    78 56 34 12
     
    بنابر این اگر می خواهید دنبال بایت های متوالی DF B8 C3 5D بگردید باید دنبال مقدار H5DC3B8DF& بگردید، نه
    مقدار HDFB8C35D&

    برای ساده تر شدن کد چند تابع می سازیم :

    تابع ReadData از داخل فایل داده ها را به طول درخواستی خوانده و بر می گرداند.
    پارامتر اول فایل است که با شماره های 1 و 2 و ... مشخص می کنیم، پارامتر دوم Start موقعیت شروع خواندن است و
    پارامتر سوم طول داده درخواستی بر حسب بایت است :
    کد (Text):

    Private Function [B]ReadData[/B](ByVal File As Integer, ByVal Start As Long, ByVal Length As Long) As Byte()
        Dim Data() As Byte, Pos As Long
        Pos = Seek(File)
        ReDim Data(0 To Length - 1)
        Get File, Start, Data
        Seek File, Pos
        ReadData = Data
    End Function
     
    تابع WriteData را برای نوشتن داده ها در فایل تعریف می کنیم.
    پارامتر اول فایل است که با شماره های 1 و 2 و ... مشخص می کنیم، پارامتر دوم Start موقعیت شروع نوشتن است و
    پارامتر سوم داده ای است که باید نوشته شود :
    کد (Text):

    Private Sub [B]WriteData[/B](ByVal File As Integer, ByVal Start As Long, ByRef Data() As Byte)
        Dim Pos As Long
        Pos = Seek(File)
        Put File, Start, Data
        Seek File, Pos
    End Sub
     
    یک تابع به نام FindDataLong هم ایجاد می کنیم که در فایل دنبال یک داده 32 بیتی Long بگردد و موقعیت
    آنرا برگرداند، جستجو 8 بیتی است و هیچ موردی را از قلم نمی اندازد.
    پارامتر اول فایل است که با شماره های 1 و 2 و ... مشخص می کنیم، پارامتر دوم Start موقعیت شروع جستجو است
    و پارامتر سوم داده ای است که باید جستجو شود :
    کد (Text):

    Private Function [B]FindDataLong[/B](ByVal File As Integer, ByVal Start As Long, ByVal Data As Long) As Long
        Dim Buffer As Long, Length As Long, Pos As Long
        Length = LOF(File)
        For Pos = Start To Length - 3
            Get #1, Pos, Buffer
            If Buffer = Data Then
                FindDataLong = Pos
                Exit For
            End If
        Next
    End Function
     
    در مثال زیر ما ابتدا در فایل VB.EEC موقعیت دو داده H5DC3B8DF& و HA7F9067F& را پیدا می کنیم که اولی
    Start است و دومی Finish و اگر پیدا نشدند با نمایش پیغام روال متوقف می شود.
    اگر هر دو پیدا شدند، طول داده میان آنها (شامل خود دو داده شروع و پایان هم می شود) برابر است
    با Finish - Start + 4 که Length خواهد بود.
    سپس از داخل فایل file.ext داده ای به همین طول از ابتدای فایل خوانده شده و در همان موقعیت Start در فایل
    VB.EEC نوشته می شود :
    کد (Text):

        Dim Start As Long, Finish As Long, Length As Long
        Dim Data() As Byte
        Open App.Path & "\Vb.EEC" For Binary As #1
        Start = FindDataLong(1, 1, &H5DC3B8DF)
        If Start = 0 Then
            MsgBox "Start position not found!"
        Else
            Finish = FindDataLong(1, Start, &HA7F9067F)
            If Finish = 0 Then
                MsgBox "Finish position not found!"
            Else
                Length = Finish - Start + 4
                Open App.Path & "\file.ext" For Binary As #2
                Data = ReadData(2, 1, Length)
                Close #2
                WriteData 1, Start, Data
            End If
        End If
        Close #1
     
     
    نوشته شده توسط the_king در ‏18 آوریل 2011
    arian17*، arash.arya43 و Mostafa Khalili از این ارسال تشکر کرده اند.
  11. Mostafa Khalili

    Mostafa Khalili New Member

    ارسال‌ها:
    24
    تشکر شده:
    3
    امتیاز دستاورد:
    1
    عالی بود تشکر میکنم.
    حالا میخوام ببینم که اگر بخواییم کل محتوای فایل دومی رو در اون محدوده فایل اولی بریزیم باید چه کرد؟چون شما توی اون سورس اشاره کردید که به اندازه طول همون فایل اولی از فایل دوممون رو میگیره.
    درضمن یه مسئله دیگه ای هم توی این کدی که گذاشتید هستش که میخواستم ببینم چرا وقتی ما برای جستجوی عبارتون یه مقدار 00 یا 0000 وارد میکنیم همه صفر ها رو حذف میکنه و یک صفر رو باقی میگذاره؟
    دلیلش چیه و چطوری باید درستش کرد؟
    ضمن اینکه اگر بخواییم به صورت چهار بایت چهار بایت جستجو کنیم چیکار باید کرد چون من هر کار میکنم فقط همون 00 و ff جواب میده بیشتر از این مقدار نمیشه.
     
    آخرین ویرایش: ‏18 آوریل 2011
    نوشته شده توسط Mostafa Khalili در ‏18 آوریل 2011
  12. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    9,976
    تشکر شده:
    9,871
    امتیاز دستاورد:
    113
    برای اینکه بتوانید داده هایی با هر طولی رو در فایل اول بنویسید باید ابتدا بقیه فایل اول را هم جداگانه بخوانید تا
    بعد از نوشتن داده های فایل دوم آنها را دقیقا در موقعیتی که داده های فایل دوم تمام می شود بنویسید :
    کد (Text):

        Dim Start As Long, Finish As Long, Length As Long
        Dim Data1() As Byte, Data2() As Byte, Data3() As Byte
        Open App.Path & "\Vb.EEC" For Binary As #1
        Length = LOF(1)
        Start = FindDataLong(1, 1, &H5DC3B8DF)
        If Start = 0 Then
            MsgBox "Start position not found!"
        Else
            Finish = FindDataLong(1, Start, &HA7F9067F)
            If Finish = 0 Then
                MsgBox "Finish position not found!"
            Else
                If Start > 1 Then
                    Data1 = ReadData(1, 1, Start - 1)
                End If
                If Finish < Length - 3 Then
                    Data3 = ReadData(1, Finish + 4, Length - Finish - 3)
                End If
                Open App.Path & "\file.ext" For Binary As #2
                Data2 = ReadData(2, 1, LOF(2))
                Close #2
                Close #1
                Kill App.Path & "\Vb.EEC"
                Open App.Path & "\Vb.EEC" For Binary As #1
                If Start > 1 Then
                    WriteData 1, 1, Data1
                End If
                WriteData 1, Start, Data2
                If Finish < Length - 3 Then
                    WriteData 1, Start + UBound(Data2) + 1, Data3
                End If
            End If
        End If
        Close #1
     
    طول داده (بر حسب بیت یا بایت) توسط نوع داده مشخص میشه، نه مقداری که شما می نویسید، مثلا اگر متغیر Data
    از نوع Long تعریف شده، 32 بیتی (چهار بایتی) است، اگر مقدار H12& را هم داخلش قرار دهید به شکل H00000012&
    ذخیره و جستجو می شود. ویرایشگر ویژوال بیسیک 0 های اضافی را حذف می کند، اما اینکار تاثیری روی طول داده
    ندارد، فرقی بین H0& و H00& و H0000& و H00000000& نیست، همه شان صفر هستند.

    نوع داده متغیر Data را ببینید، Byte است، بنابر این فقط یک مقدار بین H00& و HFF& در آن قرار می گیرد :
    کد (Text):

    Dim Data() As Byte
     
    برای جستجو 32 بیتی بایستی از نوع داده Long استفاده کنید، به این نکته هم توجه کنید که اگر در جستجوی
    32 بیتی دنبال H0& بگردید در حقیقت دارید دنبال H00000000& می گردید، یعنی به ترتیب بایت های 00 00 00 00
    و اگر دنبال HFF& بگردید در حقیقت دارید دنبال H000000FF& می گردید، یعنی به ترتیب بایت های FF 00 00 00
    کد (Text):

        Dim Data As Long, Pos As Long, Length As Long
        Open "file.ext" For Binary As #1
        Length = LOF(1)
        Pos = 1
        Do While Pos <= Length - 3
            Get #1, Pos, Data
            If Data = &H0 Then
                Data = &HFF
                Put #1, Pos, Data
                Pos = Pos + 4
            Else
                Pos = Pos + 1
            End If
        Loop
        Close #1
     
     
    نوشته شده توسط the_king در ‏19 آوریل 2011
    Mostafa Khalili از این پست تشکر کرده است.
  13. Mostafa Khalili

    Mostafa Khalili New Member

    ارسال‌ها:
    24
    تشکر شده:
    3
    امتیاز دستاورد:
    1
    خب تمامی مشکلاتم برطرف شد و حالا سوال آخری از این مبحث رو دارم.
    من میخوام بدونم چطوری میشه که محدوده دوم رو از فایل شماره یک حذف کرد و به برنامه بگیم که بجای محدوده شماره دومی که میخواد پیدا کنه به جاش تا آخر فایل رو سلکت کنه.
     
    نوشته شده توسط Mostafa Khalili در ‏19 آوریل 2011
  14. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    9,976
    تشکر شده:
    9,871
    امتیاز دستاورد:
    113
    خیلی ساده، بجای اینکه دنبال فلان مقدار برای Finish بگردید...
    کد (Text):

            Finish = FindDataLong(1, Start, &HA7F9067F)
     
    مستقیما Finish را روی انتهای فایل اول تنظیم کنید :
    کد (Text):

        Finish = LOF(1)
     
     
    نوشته شده توسط the_king در ‏20 آوریل 2011
    Mostafa Khalili از این پست تشکر کرده است.
  15. Mostafa Khalili

    Mostafa Khalili New Member

    ارسال‌ها:
    24
    تشکر شده:
    3
    امتیاز دستاورد:
    1
    آقای سعید من با استفاده از این سورس ها برنامم رو نوشتم ولی یه مشکلی براش پیش اومده. من وقتی برنامم باز میشه ابتدا یه فایل از یه مسیر به داخل پوشه برنامم کپی میکنم با این دستور: FileCopy "address1", App.Path & "address2" و بعد از این کار وقتی میخوام با یه کلید دیگه یه فایل رو با دستور زیر باز کنم اصلا فایلم باز نمیشه انگار که دستور رو اصلا نادیده میگیره و برای اینکه بازش کنم باید یه بار برنامه رو ببندم و دوباره باز کنم و روی کلید دومی که برای باز کردن فایل هست بزنم تا اون فایلی که میخوام رو باز کنه: Shell App.Path & "\File.exe" ممنون میشم یه راهنمایی کنید و بگید واسه چیه.
     
    نوشته شده توسط Mostafa Khalili در ‏30 آوریل 2011
  16. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    9,976
    تشکر شده:
    9,871
    امتیاز دستاورد:
    113
    تا دقیقا مشخص نکنید که از چه کدی برای دکمه اول و دوم استفاده کرده اید معلوم نمیشه که مشکل از چیه.
    FileCopy اگه موفق به پیدا کردن فایل نشه پیغام خطا نشان خواهد داد و تا زمانی هم که کپی فایل تموم نشه
    روال برنامه را منتظر نگه می دارد، یعنی تا زمانی که عملیات کپی به اتمام نرسیده است، دکمه های روی فرم
    عمل نخواهند کرد. اگر فایل تان حجیم و زمان کپی کردنش طولانی نباشد به همین دلیل احتمالا یا مشکل از
    مسیر فایل مقصد در FileCopy است یا مسیر فایل در Shell
     
    نوشته شده توسط the_king در ‏30 آوریل 2011
    Mostafa Khalili از این پست تشکر کرده است.
  17. Mostafa Khalili

    Mostafa Khalili New Member

    ارسال‌ها:
    24
    تشکر شده:
    3
    امتیاز دستاورد:
    1
    واسه کلید اول که عملیات کپی رو انجام بده از این کد استفاده کردم که حجم فایلم هم 180 کیلو بایته و ضمن اینکه عملیات کپی کردن با موفقیت انجام میشه:
    FileCopy Text1.Text, App.Path & "\File.exe"
    درضمن برای آدرس فایل مبدا نوشتم text1.text چون فایلم رو با کامند دیالوگ سلکت کردم و مسیرش رو ریختم توی تکست باکس.
    بعدش برای باز کردن اون فایلم که پسوند bat داره از این سورس استفاده کردم:
    Shell App.Path & "\file.bat"

    که مشکل من هم همینه که بعد از زدن کلید اول وقتی روی کلید دوم میزنیم هیچ اتفاق نمیوفته انگار که درون این کلید سورسی نریختیم.
     
    نوشته شده توسط Mostafa Khalili در ‏30 آوریل 2011
  18. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    9,976
    تشکر شده:
    9,871
    امتیاز دستاورد:
    113
    اینطور که به نظر می رسه فایل file.bat از قبل در پوشه برنامه تون وجود داره (قراره باشه) و مستقیما ربطی به کپی کردن
    یا نکردن فایل File.exe نداره. طبیعتا هم فایل file.bat همیشه بدون مشکل اجرا میشه، چون در غیر اینصورت Shell
    پیغام خطا نشون می داد. فرمان های داخل فایل file.bat رو بررسی کنید. برای اطمینان بیشتر یک فرمان pause
    را در سطر اول و سطر آخر فایل file.bat اضافه کنید تا قبل از اجرا کردن فرمان ها و بعد از اجرا کردن آنها منتظر
    فشار دادن کلیدی شود.
     
    نوشته شده توسط the_king در ‏30 آوریل 2011
    Mostafa Khalili از این پست تشکر کرده است.
  19. Mostafa Khalili

    Mostafa Khalili New Member

    ارسال‌ها:
    24
    تشکر شده:
    3
    امتیاز دستاورد:
    1
    متاسفانه من به سورس فایل file.bat دسترسی ندارم چون خودم اونو ننوشتم.راه دیگه ای نیست تا از شر این مشکل رها بشم؟
     
    نوشته شده توسط Mostafa Khalili در ‏1 می 2011
  20. the_king

    the_king مدیرکل انجمن

    ارسال‌ها:
    9,976
    تشکر شده:
    9,871
    امتیاز دستاورد:
    113
    مشکل اگه مربوط به برنامه ای باشه که دارید می نویسید که خوب حتما می توانید رفع اش کنید، اما گویا اصلا مشکل
    مربوط به برنامه ای که می نویسید نیست. برنامه شما قراره یه فایل bat رو اجرا کنه، که لابد اجرا هم می کنه که
    پیغام خطا نشون نمیده، اگه خودتون به فایل file.bat دسترسی ندارید شرایط اش مهیا نیست که بتوانید رفع اش کنید.
     
    نوشته شده توسط the_king در ‏1 می 2011
    Mostafa Khalili از این پست تشکر کرده است.

به اشتراک بگذارید