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