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

Mostafa Khalili

New Member
دوستان من میخواستم بدونم چطوری میشه یه فایل رو حالا با هر پسوندی رو توی ویبی به صورت هگز باز کرد و بشه کد هگز مورد نظر رو در اون جستجو کرد و یه مقدار جدید جایگزینش کرد و در نهایتش سیوش کرد.
ممنون میشم اگر کسی سورسی یا کمکی میتونه بکنه چون در این ضمینه هیچ اطلاعی ندارم.
 
آخرین ویرایش:

the_king

مدیرکل انجمن
دوستان من میخواستم بدونم چطوری میشه یه فایل رو حالا با هر پسوندی رو توی ویبی به صورت هگز باز کرد و بشه کد هگز مورد نظر رو در اون جستجو کرد و یه مقدار جدید جایگزینش کرد و در نهایتش سیوش کرد.
ممنون میشم اگر کسی سورسی یا کمکی میتونه بکنه چون در این ضمینه هیچ اطلاعی ندارم.

نگید هگز، عبارت باینری صحیح تره، چون هگز صرفا یک مبنای عددی و یک شیوه نمایش داده است، اما باینری
علاوه بر اینکه یک مبنای عددی است، یک شیوه دسترسی به فایله، درست نقطه مقابل شیوه دسترسی متنی.

موقعی که یک فایل رو با دستور Open و در مد For Binary باز می کنید، بصورت باینری باز میشه :
کد:
    Open "file.ext" For Binary As #1

و با فرمان Get از داخلش داده ها رو می خوانید :
کد:
    Get #1, , Data

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

و با فرمان Close فایل رو می بندید :
کد:
    Close #1

مثلا برنامه زیر فایل file.ext رو باز می کنه، دنبال بایت های 00 می گرده و همه شون رو به FF تغییر می ده :
کد:
    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
 

Mostafa Khalili

New Member
ممنون دوست عزیز حالا یه سوال دیگه این روشی که شما گفتید هر فایلی رو که خواستیم باز میکنه؟؟ مثلا jpg یا exe و میشه داخلش تغیراتی به وجود آورد طبق همون روشی که گفتید؟
 

the_king

مدیرکل انجمن
ممنون دوست عزیز حالا یه سوال دیگه این روشی که شما گفتید هر فایلی رو که خواستیم باز میکنه؟؟ مثلا jpg یا exe و میشه داخلش تغیراتی به وجود آورد طبق همون روشی که گفتید؟

بله، وقتی فایل رو بصورت باینری باز می کنید فایل رو یکسری داده ها خام در نظر می گیره و اینکه داخل فایل چی
قرار داره و فرمت فایل چیه اهمیتی نداره.
 

Mostafa Khalili

New Member
بسیار تا بسیار متشکر هیچ فکر نمیکردم این انجمن به این سرعت مشکلات یه نفرو برطرف کنه.
اگر اشکالی نداره یه سوال دیگه هم در این رابطه بپرسم.
شما فرض کنید ما دو تا فایل داریم.میخواییم فایل شماره یک رو باز کنیم و مثلا مقداری از کدهای باینری فایلی رو که باز کردیم مثلا 10 خطش رو با کل محتوای باینری فایل دو جابه جا کنیم در این صورت باید چیکار کرد.مثلا به برنامه بگیم شما از فایل یک از ابتدای فلان خط شروع کن به جستجو تا اخر فلان خط و کل محتوای باینری فایل دوم رو در جایگزین محتوای انتخاب شده فایل اولی بکن.
خودم فکر میکنم برای این کار باید از آدرسی دهی از طریق آفست انجام بشه.البته یه حدس بود ممنون میشم مثل قبل راهنماییم کنید.
 

the_king

مدیرکل انجمن
بسیار تا بسیار متشکر هیچ فکر نمیکردم این انجمن به این سرعت مشکلات یه نفرو برطرف کنه.
اگر اشکالی نداره یه سوال دیگه هم در این رابطه بپرسم.
شما فرض کنید ما دو تا فایل داریم.میخواییم فایل شماره یک رو باز کنیم و مثلا مقداری از کدهای باینری فایلی رو که باز کردیم مثلا 10 خطش رو با کل محتوای باینری فایل دو جابه جا کنیم در این صورت باید چیکار کرد.مثلا به برنامه بگیم شما از فایل یک از ابتدای فلان خط شروع کن به جستجو تا اخر فلان خط و کل محتوای باینری فایل دوم رو در جایگزین محتوای انتخاب شده فایل اولی بکن.
خودم فکر میکنم برای این کار باید از آدرسی دهی از طریق آفست انجام بشه.البته یه حدس بود ممنون میشم مثل قبل راهنماییم کنید.

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

به عنوان مثال کد زیر 100 بایت ابتدای از فایل first.ext رو با 100 بایت ابتدای فایل second.ext تعویض می کنه،
از فایل اول به فایل دوم منتقل میشه و از فایل دوم به فایل اول. داده ها این وسط از دست نمی روند و
طبیعتا اگه این برنامه رو دوباره اجرا کنید داده های داخل ایندو فایل به جای اولیه شون بر می گردند :
کد:
    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 باشند :
کد:
    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
 

Mostafa Khalili

New Member
بازم ممنون علی آقا میخواستم بدونم میشه مانند دستور اول یه حالت سرچ مانندی براش به وجود آورد که مثلا بگیم شما از فلان جا باید که اولش &h8562127 بخون تا زمانی که رسیدی به &h564f547 بعدش وقتی به آخرش رسید این بشه اون محدوده ما و اون محدوده رو هم که میخواییم جایگزین کنیم فکر کنم بهتر بششه بدستش اورد . چون اینجوری شاید یک فایل چندین و چند هزار بایت داشته باشه و اینجوری کار خیلی سخت میشه.
 

the_king

مدیرکل انجمن
بازم ممنون علی آقا میخواستم بدونم میشه مانند دستور اول یه حالت سرچ مانندی براش به وجود آورد که مثلا بگیم شما از فلان جا باید که اولش &h8562127 بخون تا زمانی که رسیدی به &h564f547 بعدش وقتی به آخرش رسید این بشه اون محدوده ما و اون محدوده رو هم که میخواییم جایگزین کنیم فکر کنم بهتر بششه بدستش اورد . چون اینجوری شاید یک فایل چندین و چند هزار بایت داشته باشه و اینجوری کار خیلی سخت میشه.

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

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

طبیعتا جستجوی 32 بیتی (چهار بایتی) سریعتر از جستجوی 8 بیتی (یک بایتی) است اما همانند مثال بالا ممکنه
موردی رو از دست بدهیم. در مثال زیر در فایل file.ext دنبال داده H11223344& می گردیم و اگر پیدا شد، متغیر
Start موقعیت آن در فایل را بر حسب بایت مشخص می کند، این جستجو فقط زمانی موثر است که داده ها
32 بیتی ذخیره شده باشند :
کد:
    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 بیتی (یک بایتی) انجام دهیم که طبیعتا کندتر است چون هر بایتی چهار بار
جستجو می شود، اما مزیت این شیوه در این است که هیچ موردی را از قلم نمی اندازد :
کد:
    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

حالا شما می توانید این جستجو را دوبار انجام دهید، یکبار دنبال نقطه شروع بگردید و یکبار دنبال نقطه پایان
و سپس داده های بین ایندو را بخوانید و بنویسید.
 
آخرین ویرایش:

Mostafa Khalili

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

پیوست ها

  • Vb.zip
    4.4 کیلوبایت · بازدیدها: 13

the_king

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

به این مساله توجه کنید که اعداد 32 بیتی در حافظه بصورت بایت های معکوس نوشته می شوند، مثلا عدد H12345678&
به صورت بایت های متوالی زیر نوشته می شود :
کد:
78 56 34 12
بنابر این اگر می خواهید دنبال بایت های متوالی DF B8 C3 5D بگردید باید دنبال مقدار H5DC3B8DF& بگردید، نه
مقدار HDFB8C35D&

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

تابع ReadData از داخل فایل داده ها را به طول درخواستی خوانده و بر می گرداند.
پارامتر اول فایل است که با شماره های 1 و 2 و ... مشخص می کنیم، پارامتر دوم Start موقعیت شروع خواندن است و
پارامتر سوم طول داده درخواستی بر حسب بایت است :
کد:
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 موقعیت شروع نوشتن است و
پارامتر سوم داده ای است که باید نوشته شود :
کد:
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 موقعیت شروع جستجو است
و پارامتر سوم داده ای است که باید جستجو شود :
کد:
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 نوشته می شود :
کد:
    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
 

Mostafa Khalili

New Member
عالی بود تشکر میکنم.
حالا میخوام ببینم که اگر بخواییم کل محتوای فایل دومی رو در اون محدوده فایل اولی بریزیم باید چه کرد؟چون شما توی اون سورس اشاره کردید که به اندازه طول همون فایل اولی از فایل دوممون رو میگیره.
درضمن یه مسئله دیگه ای هم توی این کدی که گذاشتید هستش که میخواستم ببینم چرا وقتی ما برای جستجوی عبارتون یه مقدار 00 یا 0000 وارد میکنیم همه صفر ها رو حذف میکنه و یک صفر رو باقی میگذاره؟
دلیلش چیه و چطوری باید درستش کرد؟
ضمن اینکه اگر بخواییم به صورت چهار بایت چهار بایت جستجو کنیم چیکار باید کرد چون من هر کار میکنم فقط همون 00 و ff جواب میده بیشتر از این مقدار نمیشه.
[/code]مثلا برنامه زیر فایل file.ext رو باز می کنه، دنبال بایت های 00 می گرده و همه شون رو به ff تغییر می ده :
کد:
    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

مدیرکل انجمن
عالی بود تشکر میکنم.
حالا میخوام ببینم که اگر بخواییم کل محتوای فایل دومی رو در اون محدوده فایل اولی بریزیم باید چه کرد؟چون شما توی اون سورس اشاره کردید که به اندازه طول همون فایل اولی از فایل دوممون رو میگیره.
برای اینکه بتوانید داده هایی با هر طولی رو در فایل اول بنویسید باید ابتدا بقیه فایل اول را هم جداگانه بخوانید تا
بعد از نوشتن داده های فایل دوم آنها را دقیقا در موقعیتی که داده های فایل دوم تمام می شود بنویسید :
کد:
    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

درضمن یه مسئله دیگه ای هم توی این کدی که گذاشتید هستش که میخواستم ببینم چرا وقتی ما برای جستجوی عبارتون یه مقدار 00 یا 0000 وارد میکنیم همه صفر ها رو حذف میکنه و یک صفر رو باقی میگذاره؟
دلیلش چیه و چطوری باید درستش کرد؟
طول داده (بر حسب بیت یا بایت) توسط نوع داده مشخص میشه، نه مقداری که شما می نویسید، مثلا اگر متغیر Data
از نوع Long تعریف شده، 32 بیتی (چهار بایتی) است، اگر مقدار H12& را هم داخلش قرار دهید به شکل H00000012&
ذخیره و جستجو می شود. ویرایشگر ویژوال بیسیک 0 های اضافی را حذف می کند، اما اینکار تاثیری روی طول داده
ندارد، فرقی بین H0& و H00& و H0000& و H00000000& نیست، همه شان صفر هستند.

ضمن اینکه اگر بخواییم به صورت چهار بایت چهار بایت جستجو کنیم چیکار باید کرد چون من هر کار میکنم فقط همون 00 و ff جواب میده بیشتر از این مقدار نمیشه.
نوع داده متغیر Data را ببینید، Byte است، بنابر این فقط یک مقدار بین H00& و HFF& در آن قرار می گیرد :
کد:
Dim Data() As Byte

برای جستجو 32 بیتی بایستی از نوع داده Long استفاده کنید، به این نکته هم توجه کنید که اگر در جستجوی
32 بیتی دنبال H0& بگردید در حقیقت دارید دنبال H00000000& می گردید، یعنی به ترتیب بایت های 00 00 00 00
و اگر دنبال HFF& بگردید در حقیقت دارید دنبال H000000FF& می گردید، یعنی به ترتیب بایت های FF 00 00 00
کد:
    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
 

Mostafa Khalili

New Member
خب تمامی مشکلاتم برطرف شد و حالا سوال آخری از این مبحث رو دارم.
من میخوام بدونم چطوری میشه که محدوده دوم رو از فایل شماره یک حذف کرد و به برنامه بگیم که بجای محدوده شماره دومی که میخواد پیدا کنه به جاش تا آخر فایل رو سلکت کنه.
 

the_king

مدیرکل انجمن
خب تمامی مشکلاتم برطرف شد و حالا سوال آخری از این مبحث رو دارم.
من میخوام بدونم چطوری میشه که محدوده دوم رو از فایل شماره یک حذف کرد و به برنامه بگیم که بجای محدوده شماره دومی که میخواد پیدا کنه به جاش تا آخر فایل رو سلکت کنه.

خیلی ساده، بجای اینکه دنبال فلان مقدار برای Finish بگردید...
کد:
        Finish = FindDataLong(1, Start, &HA7F9067F)

مستقیما Finish را روی انتهای فایل اول تنظیم کنید :
کد:
	Finish = LOF(1)
 

Mostafa Khalili

New Member
آقای سعید من با استفاده از این سورس ها برنامم رو نوشتم ولی یه مشکلی براش پیش اومده. من وقتی برنامم باز میشه ابتدا یه فایل از یه مسیر به داخل پوشه برنامم کپی میکنم با این دستور: FileCopy "address1", App.Path & "address2" و بعد از این کار وقتی میخوام با یه کلید دیگه یه فایل رو با دستور زیر باز کنم اصلا فایلم باز نمیشه انگار که دستور رو اصلا نادیده میگیره و برای اینکه بازش کنم باید یه بار برنامه رو ببندم و دوباره باز کنم و روی کلید دومی که برای باز کردن فایل هست بزنم تا اون فایلی که میخوام رو باز کنه: Shell App.Path & "\File.exe" ممنون میشم یه راهنمایی کنید و بگید واسه چیه.
 

the_king

مدیرکل انجمن
آقای سعید من با استفاده از این سورس ها برنامم رو نوشتم ولی یه مشکلی براش پیش اومده. من وقتی برنامم باز میشه ابتدا یه فایل از یه مسیر به داخل پوشه برنامم کپی میکنم با این دستور: FileCopy "address1", App.Path & "address2" و بعد از این کار وقتی میخوام با یه کلید دیگه یه فایل رو با دستور زیر باز کنم اصلا فایلم باز نمیشه انگار که دستور رو اصلا نادیده میگیره و برای اینکه بازش کنم باید یه بار برنامه رو ببندم و دوباره باز کنم و روی کلید دومی که برای باز کردن فایل هست بزنم تا اون فایلی که میخوام رو باز کنه: Shell App.Path & "\File.exe" ممنون میشم یه راهنمایی کنید و بگید واسه چیه.

تا دقیقا مشخص نکنید که از چه کدی برای دکمه اول و دوم استفاده کرده اید معلوم نمیشه که مشکل از چیه.
FileCopy اگه موفق به پیدا کردن فایل نشه پیغام خطا نشان خواهد داد و تا زمانی هم که کپی فایل تموم نشه
روال برنامه را منتظر نگه می دارد، یعنی تا زمانی که عملیات کپی به اتمام نرسیده است، دکمه های روی فرم
عمل نخواهند کرد. اگر فایل تان حجیم و زمان کپی کردنش طولانی نباشد به همین دلیل احتمالا یا مشکل از
مسیر فایل مقصد در FileCopy است یا مسیر فایل در Shell
 

Mostafa Khalili

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

که مشکل من هم همینه که بعد از زدن کلید اول وقتی روی کلید دوم میزنیم هیچ اتفاق نمیوفته انگار که درون این کلید سورسی نریختیم.
 

the_king

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

که مشکل من هم همینه که بعد از زدن کلید اول وقتی روی کلید دوم میزنیم هیچ اتفاق نمیوفته انگار که درون این کلید سورسی نریختیم.

اینطور که به نظر می رسه فایل file.bat از قبل در پوشه برنامه تون وجود داره (قراره باشه) و مستقیما ربطی به کپی کردن
یا نکردن فایل File.exe نداره. طبیعتا هم فایل file.bat همیشه بدون مشکل اجرا میشه، چون در غیر اینصورت Shell
پیغام خطا نشون می داد. فرمان های داخل فایل file.bat رو بررسی کنید. برای اطمینان بیشتر یک فرمان pause
را در سطر اول و سطر آخر فایل file.bat اضافه کنید تا قبل از اجرا کردن فرمان ها و بعد از اجرا کردن آنها منتظر
فشار دادن کلیدی شود.
 

Mostafa Khalili

New Member
متاسفانه من به سورس فایل file.bat دسترسی ندارم چون خودم اونو ننوشتم.راه دیگه ای نیست تا از شر این مشکل رها بشم؟
 

the_king

مدیرکل انجمن
متاسفانه من به سورس فایل file.bat دسترسی ندارم چون خودم اونو ننوشتم.راه دیگه ای نیست تا از شر این مشکل رها بشم؟

مشکل اگه مربوط به برنامه ای باشه که دارید می نویسید که خوب حتما می توانید رفع اش کنید، اما گویا اصلا مشکل
مربوط به برنامه ای که می نویسید نیست. برنامه شما قراره یه فایل bat رو اجرا کنه، که لابد اجرا هم می کنه که
پیغام خطا نشون نمیده، اگه خودتون به فایل file.bat دسترسی ندارید شرایط اش مهیا نیست که بتوانید رفع اش کنید.
 

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

بالا