PDA

View Full Version : مبتدی: خواندن یک متن از CD



41134100
جمعه 14 خرداد 1389, 11:54 صبح
سلام
فرض میکنیم که ما نمیدونیم اسمه درایور سی دی کاربرمون چیه.
حالا میخوام برنامه اول فایل متنی داخل سی دی رو چک کنه. اگر مطابقت داشت برنامه اجرا بشه

xxxxx_xxxxx
جمعه 14 خرداد 1389, 13:09 عصر
از تابع GetDriveType برای تشخیص نوع درایو استفاده کنید.


Public Declare Function GetDriveType Lib "kernel32" Alias "GetDriveTypeA" (ByVal nDrive As String) As Long
اگر خروجی تابع عدد 5 بود، درایو موردنظر CD-Rom هست.


تاپیک مشابه:
کپی کردن اطلاعات از روی سیدی به داخل درایو ویندوز (http://barnamenevis.org/forum/showthread.php?t=149774)

41134100
جمعه 14 خرداد 1389, 13:18 عصر
Private Declare Function GetDriveTypeA Lib "kernel32.dll" (ByVal nDriev As String) As Long

Private Sub Command1_Click()
If GetDriveTypeA("C:\") = 5 Then
If GetDriveTypeA("D:\") = 5 Then
If GetDriveTypeA("E:\") = 5 Then
If GetDriveTypeA("F:\") = 5 Then
If GetDriveTypeA("G:\") = 5 Then
If GetDriveTypeA("H:\") = 5 Then
If GetDriveTypeA("I:\") = 5 then
If GetDriveTypeA("J:\") = 5 then
End Sub




من حالا با این دستور سی دی رم رو پیدا کردم. اگه 2 تا سی دی رم داشته باشه چی؟
حالا چطور فایل متنی رو که داخل سی دی هستش رو چک کنم که اگه صحیح بود برنامه کار کنه؟

xxxxx_xxxxx
جمعه 14 خرداد 1389, 13:42 عصر
من حالا با این دستور سی دی رم رو پیدا کردم. اگه 2 تا سی دی رم داشته باشه چی؟خب دومی هم پیدا میشه دیگه! برای همه درایو ها اینو باید بررسی کنید.

حالا چطور فایل متنی رو که داخل سی دی هستش رو چک کنم که اگه صحیح بود برنامه کار کنه؟ از تابع PathFileExists برای بررسی وجود یک فایل در یک مسیر مشخص استفاده کنید:


Public Declare Function PathFileExists Lib "shlwapi.dll" Alias "PathFileExistsA" (ByVal pszPath As String) As Long
مسیر موردنظر رو به همراه نام فایل به عنوان پارامتر به این تابع بدید، اگر خروجی تابع 0 نباشد، یعنی فایل در این مسیر وجود داره. و بعد میتونید فایل رو با دستور Open باز کنید. دقت کنید که فایل رو فقط با دسترسی Access Read میتونید باز کنید.

تاپیک های مشابه:
چک کردن وجود یک فایل (http://barnamenevis.org/forum/showthread.php?t=192777)
تشخیص وجود فایل (http://barnamenevis.org/forum/showthread.php?t=168663)

لطفاً پیش از مطرح کردن سؤالی جستجو کنید/

41134100
جمعه 14 خرداد 1389, 14:59 عصر
تونستم چک کردن رو یه کاری کنم.
ولی یه جای کار میلنگه.
وقتی 2 یا 3 تا درایور داره کاربر چیکار کنم؟
لطفا یه نگاهی بندازید به نمونه زیر.
من میخوام با استفاده از این راه یک کلید بسازم واسه برنامم.(با سی دی)

41134100
شنبه 15 خرداد 1389, 16:40 عصر
میشه گفت تمام شد
اما یه مشکلی مونده
اگه کاربر 2 -3 تا درایور داشته باشه چی؟
لطفا این کد رو طوری ویرایش کنید که تمام سی دی درایور ها رو چک کنه و در هر کدام از درایور ها که تکست مورد نظر رو پیدا کرد دیگه ادامه نده واسه چک کردن




Private Declare Function GetDriveTypeA Lib "kernel32.dll" (ByVal nDriev As String) As Long
Dim cd As String
Dim adres As String
Dim exist As New Scripting.FileSystemObject
Private Sub Form_Load()
If GetDriveTypeA("J:\") = 5 Then cd = "j"
adres = (cd + ":\lock.txt")
On Error Resume Next
Open adres For Input As #1
Input #1, x
If x = "123123" Then
login.Show
Else
Unload Me
End If

xxxxx_xxxxx
شنبه 15 خرداد 1389, 18:02 عصر
سلام،
همونجایی که بلافاصله درایو CD شناسایی میشه، یک متغیر رو مقدار میدیم و بعد کنترل به دستور بعدی برای بررسی درایو بعدی میره. اینجا باید بجای مقداردهی متغیر، یک Function رو فراخوانی کنید که بررسی وجود فایل توسط Function انجام بشه. بعد با توجه به خروجی Function که نشون دهنده وجود یا عدم وجود فایل هست برای ادامه کار تصمیم گیری کنیم.

برنامه ضمیمه رو نگاه کنید.

41134100
شنبه 15 خرداد 1389, 18:44 عصر
این نمونه ای که گذاشتید وجود فایل متنی رو چک میکنه
میشه یه نمونه هم بزارید که فایل متن داخل فایل متنی رو چک کنه
راستی حلقه رو چرا از 65 شروع نکردید؟ a و b چی میشه؟

xxxxx_xxxxx
شنبه 15 خرداد 1389, 19:17 عصر
این نمونه ای که گذاشتید وجود فایل متنی رو چک میکنه
میشه یه نمونه هم بزارید که فایل متن داخل فایل متنی رو چک کنه
خب، بجای MsgBox "Yes" فایل رو باز کنید و متن داخل رو بخونید. این که دیگه کاری نداره. خودتون توی پست 6 نوشتید. به هر حال تابع CkeckFile رو به این شکل بنویسید:


Private Function CheckFile(Letter As String) As Boolean
Dim exist As New Scripting.FileSystemObject

If exist.FileExists(Letter & "text.txt") = True Then
Dim SN As String

Open Letter & "test.txt" For Input As #1
Input #1, SN
Close #1

If SN = "123" Then
MsgBox ("Yes")
CheckFile = True
End If
Else
MsgBox ("No")
CheckFile = False
End If
End Function



راستی حلقه رو چرا از 65 شروع نکردید؟ a و b چی میشه؟

درایوهای A و B مختص فلاپی هستند.

41134100
شنبه 15 خرداد 1389, 22:05 عصر
نمیدونم مشکلم رو چطور با متن مطرح کنم
ببینید اسم درایو های من i و j هستش
من سی دی کد رو میزارم تو j
از اون جایی که j بعده I هستش. برنامه اول یه msgbox no میده بعده اینکه Ok میکنم متغیر به i میرسه و ....

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

Babak.Hassanpour
شنبه 15 خرداد 1389, 22:34 عصر
شما باید شرط رو تغییر بدید.نباید همون اول که اولین درایو رو چک کردید و دیدید توش چیزی نیست برنامه رو ببندید.باید درایو های بعدی رو هم که type=5 هستند بگردید.
شرط رو هم به این صورت تغییر بدید ( از عملگر های منطقی And استفاده کنید)
اگر تکست توی درایو i نبود And اگر تکست توی درایو j نبود و ... آنگاه برنامه بسته
این یعنی اینکه دو شرط عدم وجود تکست در درایو باید با هم برقرار بشن تا برنامه بسته بشه.و این به معنی عدم وجود تکت در کلیه درایو های سی دی رام است.
(در بالا فرض شده که سیستم دو درایو داره.اگر بیشتره (که شما قبلش باید تعدادشون و نامشون رو بدست آورده باشید) باید تعداد and ها رو بیشتر کنید)

xxxxx_xxxxx
شنبه 15 خرداد 1389, 23:26 عصر
نمیدونم مشکلم رو چطور با متن مطرح کنم
ببینید اسم درایو های من i و j هستش
من سی دی کد رو میزارم تو j
از اون جایی که j بعده I هستش. برنامه اول یه msgbox no میده بعده اینکه Ok میکنم متغیر به i میرسه و ....

اگه من شرط رو طوری بزارم که اگر سی دی نبود برنامه بسته بشه
و شرایطی مثل بالا برقرار باشه
هیچ وقت به اجرا نمیرسه برنامه حتی اگه سی دی داخل باشه
امید وارن تونسته باشم متوجه کنمتون
فایل ضمینه رو ببینید
تو قسمت Bold شده منظورتون J بود؟ چون از I رد شدیم دیگه.
متأسفانه متوجه منظورتون نشدم! (قسمت قرمز رنگ)

41134100
یک شنبه 16 خرداد 1389, 00:28 صبح
آره منظورم J بود اشتباه نوشتم

فرض کنید به جای MSGBOX ای که NO مینویسه من یه END بزارم.
در این حالت من بیام سی دی کد رو داخل J بزارم.
برنامه اول I رو چک میکنه. و چون جواب منفی هستش END خواهد کرد.
با این حساب دیگه J چک نمیشه.
تونستم متوجه کنمتون؟
صحبت های آقای حسن پور رو چطور پیاده سازی کنم؟ که تمامی 5 ها چک بشن. اگر در نهایت جواب منفی بود END بشه

xxxxx_xxxxx
یک شنبه 16 خرداد 1389, 00:56 صبح
اون تابع وظیفه چک کردن درایو ها رو داره، باید برای خروج از برنامه، خارج از اون تابع دستور بنویسید.
مثلاً توی رویداد کلیک همون Button یک متغیر Boolean تعریف کنید که تنها در صورتی که خروجی تابع True بود اون هم True بشه. در غیر اینصورت اگر همه درایو ها بررسی شدند و حلقه به صورت طبیعی خاتمه پیدا کرد برنامه End بشه.

برای اینکه نیازی به متغیر اضافی نداشته باشید، کلاً حلقه رو به داخل تابع انتقال بدید تا همه کارهای مربوط به بررسی فایل به این تابع سپرده بشه، بعد اگر خروجی تابع False بود اونوقت برنامه End بشه. همین کار توی فایل ضمیمه انجام شده.

41134100
یک شنبه 16 خرداد 1389, 10:37 صبح
بلاخره درست شد
همون چیزی که میخواستم
از مدیر محترم خواهشمندم پست های بیهوده و ناقص رو پاک کنند تا شاید کاربران دیگه هم استفاده کنند

آخرین مشکلم که در مورد ساخت کلید با استفاده از همین برنامه هست اینه
چطور تعداد زیادی فایل متنی (مثلا 1000 تا ) با محتویات 10 کاراکتر و random بسازم؟

xxxxx_xxxxx
یک شنبه 16 خرداد 1389, 15:20 عصر
از مدیر محترم خواهشمندم پست های بیهوده و ناقص رو پاک کنند تا شاید کاربران دیگه هم استفاده کنند
نیازی به حذف پست ها نیست. یعنی درواقع دلیل موجهی برای این کار وجود نداره.



آخرین مشکلم که در مورد ساخت کلید با استفاده از همین برنامه هست اینه
چطور تعداد زیادی فایل متنی (مثلا 1000 تا ) با محتویات 10 کاراکتر و random بسازم؟

لطفاً برای موضوعات جدید، تاپیک جدید ایجاد کنید.

موفق باشید/