หากมีคำถาม ขอให้ไปโพสต์ลง เว็บบอร์ดจีทูจีเน็ตดอตคอม ตัวใหม่แทนน่ะครับ

หรือติดต่อเข้ามาทาง Inbox ที่ เฟซบุ๊ค ผมครับ

หน้าหลัก
ข่าวสาร - บทความ ทั้งหมด
VB 6/VB.Net
ASP/ASP.Net
จับฉ่ายคอมพิวเตอร์
เรียนรู้ผ่าน Flash Movie
บทความที่มีผู้ตอบล่าสุด  
 RSS Feeds
 ดาวน์โหลดโปรแกรม RSS Reader ได้ที่นี่ ...   Download โปรแกรม RSS Reader

Forum - www.g2gnet.com
Webmaster - www.g2gnet.com
Visitors - Session views
 5 1 2 8 5 1 3

7 ธันวาคม พ.ศ.2549
304 Users On-Line.
Visitors - Page views
 8 4 2 4 5 6 4
1 กุมภาพันธ์ พ.ศ.2551

Google   
เว็บ g2gnet.com
ขนาดตัวอักษร:  

การอ่านไฟล์ และ โฟลเดอร์ใน Remove Drive (Flash/Thumb/Handy Drive) ภาค 2 - เสียบเป็นเจอ

Category »  VB 6/VB.Net
โดย : Webmaster เมื่อ 1/3/2552   เวลา: 18:01
(อ่าน : 12207) 
วิวัฒนาการของตัวแปลภาษาในปัจจุบันนี้ ได้ก้าวล้ำนำหน้าไปมากกว่าแต่ก่อน ใช้งานได้ง่ายขึ้น แต่นั่นแหละมันก็เป็นเหมือนดาบ 2 คม ที่อาจจะทำให้นักพัฒนาซอฟท์แวร์รุ่นใหม่ๆ ติดกับดักหลุมพราง เพราะมักถูกเน้นมาทางการฝึกใช้โปรแกรม มากกว่าที่จะฝึกการเขียนโปรแกรม ... ยกตัวอย่างเช่น การนำภาพกราฟิคสักรูปมาแสดงผล สไตล์ Visual ก็แค่ลาก Control มาวาง และใส่คุณสมบัติลงไป ไม่เกินครึ่งนาทีก็น่าจะเรียบร้อย แต่หากเป็นภาษา C (DOS) คุณจะต้องรู้จักคุณสมบัติของไฟล์ภาพนั้นๆเป็นอย่างดี เช่นว่า มันมีขนาดกี่บิต แต่ละบิตมีความหมายว่าอย่างไร รวมไปถึงการจับจองพื้นที่ในหน่วยความจำ (Allocation) เอาไว้ก่อนล่วงหน้า เหล่านี้เป็นต้น ... ไม่ได้หมูเลย ... สิ่งที่กล่าวมานี้ ผมพยายามสื่อให้เห็นถึงเรื่องราวของ "อัลกอริทึ่ม - Algorithm" หรือ "วิธีการคิด และ ลำดับขั้นตอน" ในการแก้ปัญหา ช่วงหลังๆมานี้ บทความของผม มันก็เลยค่อนข้างเน้นไปในเรื่องกระบวนการคิดซ่ะเป็นหลักใหญ่
แนวคิดของการอ่าน Remove Drive แบบอัตโนมัติ ... Algorithm แบบบ้านๆ
    หลายคนคงอาจจะงง และ สงสัย ... มันคิดได้ยังไงของมัน (ว่ะ) เนี่ย ... ง่ายจังเลยวุ้ย ... 55555+
  • คัดลอก Drive เช่น C: D: จาก DriveListBox ไปเก็บไว้ใน ListView ซึ่งจะถูกซ่อนเอาไว้ (Visible = False)
  • ตั้งเวลาใน Timer เอาไว้ เช่น ทุกๆ 1 วินาที (หรือให้เร็วกว่านี้) เพื่อให้อ่าน Drive ชนิดต่างๆใน DriveListBox หรือ สั่งให้ Refresh DriveListBox นั่นเอง
  • เปรียบเทียบ Drive ต่างๆจาก DriveListBox และ Drive ที่มีอยู่ใน ListView (ต้องใช้ 2 ลูป ในการตรวจสอบ)
    1. หาก Drive ใน DriveListBox มี แต่ใน ListView ไม่มี ... แสดงว่ามีการเสียบ Removable Drive เข้ามาใหม
    2. หาก Drive ใน DriveListBox ไม่มี แต่ใน ListView มี ... แสดงว่ามีการถอด Removable Drive ออกไป
  1. Project --> References ...
  1. Project --> Components ...
  1. Design Time
  2. สำหรับ Properties ของ List View Control (lvwViewer)
    Style = 1 - CheckBox
ดาวน์โหลด Source Code สำหรับ MS Visual Basic 6.0 - Service Pack 6
 ดาวน์โหลด Visual Basic 6.0 SP5: Run-Time Redistribution Pack
 ดาวน์โหลด Microsoft Data Access Object (MDAC) และ Jet 4.0 Update
 ดาวน์โหลด Microsoft Visual Basic Service Pack 6
ข้อมูลเพิ่มเติม
 การอ่านไฟล์ และ โฟลเดอร์ใน Remove Drive (Flash/Thumb/Handy Drive) ภาค 1 (ควรอ่านก่อนน่ะพี่น้อง)
เริ่มต้นกระบวนการทำงาน

Private Sub Timer1_Timer()
    ' เปรียบเทียบ Drive จาก DriveListBox กับ ListView ตามเวลาที่ตั้งไว้ เช่น ทุกๆ 1000 millisecond (1 วินาที)
    Call RefreshDrives
End Sub

' โปรแกรมย่อยในการเปรียบเทียบ Drive จาก DriveListBox กับ ListView
Private Sub RefreshDrives()
Dim DrvDet As Integer ' ตัวแปร Drive Detect ตรวจสอบ Drive ทั้งหมดจาก DriveListBox
Dim DrvChk As Integer ' Drive Check ดัก Drive ใหม่ที่เข้ามา
Dim DriveFlag As Boolean ' ตรรกะที่แจ้งให้รู้ว่ามีการเพิ่ม หรือ ถอด Removeable Drive หรือไม่

' อ่าน Drive ทั้งหมดเข้ามาเก็บไว้ใน DriveListBox ก่อน ... ตามเวลาที่ตั้งไว้
DriveDetect.Refresh

' เปรียบเทียบจำนวน DriveListBox กับ ListView
' เงื่อนไข จริง ... แสดงว่ามีการนำ Removable Drive เข้ามาใหม่
If DriveDetect.ListCount > lvwDrives.ListCount Then
  
    ' ลูปวงนอกสุดให้นับตามจำนวน Drive ที่มีอยู่ทั้งหมดจาก DriveListBox
    For DrvDet = 0 To DriveDetect.ListCount
        ' ลูปวงในคือการทดสอบว่ามี Removable Drive ตัวไหนที่เข้ามาใหม่
        For DrvChk = 0 To lvwDrives.ListCount
            
            ' หากมีค่าเท่ากันให้ออกจากลูปใน (DrvChk) ไปเลย แสดงว่าเป็น Drive ที่มีอยู่เดิม
            If lvwDrives.List(DrvChk) = DriveDetect.List(DrvDet) Then
                DriveFlag = False
                Exit For
                
            ' กรณี "เท็จ" จะเกิดขึ้นได้ 2 กรณี คือ
            ' 1. เปรียบเทียบ Drive ไม่ตรงกันก็จริง แต่ยังไม่หมดข้อมูล จะลูปต่อก่อน
            ' 2. เปรียบเทียบค่าแล้วไม่ตรงกันเลย และ หมดข้อมูล แสดงว่าเกิดการเพิ่ม Removable Drive เข้าไป
            ' ในข้อที่ 2 จะเกิดการหลุดจากลูปนอก (DrvDet) ด้วยเงื่อนไข DriveFlag = จริง ด้วย
            Else
                DriveFlag = True
            End If
        ' มันมี 2 ลูป ... เลยใส่ชื่อตัวแปรเงื่อนไข (DrvChk) มาต่อท้าย เพื่อที่จะได้ไม่งง และ ...
        ' เราเรียกมันว่าเป็น Nested Loop ... คือ วงรอบต้องอยู่ภายในของอีกลูป ... ลูปซ้อนลูป
        Next DrvChk
        
        ' จากกรณีที่ 2 ด้านบน ... รู้ทันทีเลยว่ามี Removable Drive เข้ามาใหม่
        If DriveFlag Then
            ' เพิ่มรายการ Drive ตัวใหม่เข้าไปที่ lvwDrives (ListView Control ตัวที่ซ่อนเอาไว้)
            lvwDrives.AddItem DriveDetect.List(DrvDet)
            
            'Debug.Print "Found New Drive: " & DriveDetect.List(DrvDet)
            
            ' ส่งชื่อ Drive ไปทดสอบก่อนว่าเป็นประเภท Removable Drive หรือไม่
            ' หากใช่ให้นำรายการไฟล์ต่างๆเข้ามาใน ListView (ฟังค์ชั่น AddToListView)
            If CheckRemovable(Left$(DriveDetect.List(DrvDet), 2)) Then _
                    Call AddToListView(UCase$(Left$(DriveDetect.List(DrvDet), 2)))
        End If
    
    ' มันมี 2 ลูป ... เลยใส่ชื่อตัวแปรเงื่อนไข (DrvDet) มาต่อท้าย เพื่อที่จะได้ไม่งง ...
    Next DrvDet
  
' เงื่อนไข เท็จ ... แสดงว่ามีการนำ Removable Drive ออกไปจากเครื่อง
ElseIf DriveDetect.ListCount < lvwDrives.ListCount Then

    ' ทำงานกลับด้านกันกับเงื่อนไข "จริง" น่ะครับ ... พี่น้อง
    ' ลูปวงนอกสุดให้นับตามจำนวน Drive ที่มีอยู่ทั้งหมดจาก ListView Control ที่ซ่อนเอาไว้ (lvwDrives)
    For DrvDet = 0 To lvwDrives.ListCount
    
        ' ลูปวงในคือการทดสอบว่ามี Removable Drive ตัวไหนที่ถูกถอดออกไปแล้ว
        For DrvChk = 0 To DriveDetect.ListCount
            
            ' หากมีค่าเท่ากันให้ออกจากลูปไปเลย (แสดงว่าเป็น Drive เดิม)
            ' คำอธิบายจะเหมือนกันกับการเพิ่ม Removable Drive เข้ามาใหม่
            If DriveDetect.List(DrvChk) = lvwDrives.List(DrvDet) Then
                DriveFlag = False
                Exit For
            Else
                DriveFlag = True
            End If
        
        Next DrvChk
    
        If DriveFlag Then
            'Debug.Print "Drive Has Been Removed: " & lvwDrives.List(DrvDet)
            
            ' ไม่ต้องตรวจสอบก็ได้ว่ามันเป็น Removable Drive หรือไม่ ... ถอดมันออกไปก็นั่นแหละมันเป็น ... อิอิอิอิอิ
            'If CheckRemovable(UCase$(Left$(lvwDrives.List(DrvDet), 2))) Then _
                        Call RemoveFromListView(UCase$(Left$(lvwDrives.List(DrvDet), 2)))
            
            ' ลบรายการออกจาก ListView Control (lvwViewer)
            Call RemoveFromListView(UCase$(Left$(lvwDrives.List(DrvDet), 2)))
            
            ' ลบรายการ Drive ออกจาก ListView Control ตัวที่ซ่อนเอาไว้ใน lvwDrives
            lvwDrives.RemoveItem DrvDet
        End If
    Next DrvDet
End If

End Sub

' มี Remove Drive เพิ่มขึ้นมา ก็ต้องนำรายชื่อไฟล์ - โฟลเดอร์ ไปเพิ่มใน ListView (lvwViewer)
Private Function AddToListView(Drive As String)
    
    Set mDrive = FSO.GetDrive(Drive)
    If mDrive.DriveType = Removable And mDrive.IsReady = True Then
        For Each mFile In mDrive.RootFolder.Files
            DoEvents
            lvwViewer.AddItem mFile.Path
            nFiles = nFiles + 1
        Next
        
        ' อันนี้ก็แค่แจ้งรายการจำนวนไฟล์ครับผม
        fraViewer.Caption = " จำนวน " & nFiles & " ไฟล์" & " "
        
        ' ยกมาทั้งโฟลเดอร์ด้วย
        For Each mFolder In mDrive.RootFolder.SubFolders
            DoEvents
            ' แสดงชื่อโฟลเดอร์ออกมา
            lvwViewer.AddItem mFolder.Path
            nFolders = nFolders + 1
        Next
        
        ' ส่วนของการนับจำนวนโฟลเดอร์
        fraViewer.Caption = fraViewer.Caption & " / จำนวน " & nFolders & " โฟลเดอร์" & " "
        
    End If
End Function

' มีการถอด Remove Drive ออกไป ก็ต้องนำรายชื่อไฟล์ - โฟลเดอร์ ออกจาก ListView (lvwViewer)
Private Function RemoveFromListView(Drive As String)
Dim sRow As Integer
Dim CountRow As Integer
    
    CountRow = lvwViewer.ListCount - 1
    For sRow = 0 To CountRow
        If UCase$(Left$(lvwViewer.List(sRow), 2)) = Drive Then
            ' เพราะนับมาจากทางขวามือสุดเข้ามา 3 ตัวอักษร ตัวถัดมาหากเป็นจุด (Dot)  ... มันคือไฟล์
            If Mid$(lvwViewer.List(sRow), Len(lvwViewer.List(sRow)) - 3, 1) = "." Then
                nFiles = nFiles - 1
            Else
                nFolders = nFolders - 1
            End If
            
            lvwViewer.RemoveItem sRow
            CountRow = lvwViewer.ListCount - 1
            sRow = lvwViewer.ListIndex - 1
        End If
    Next
    
    fraViewer.Caption = " จำนวน " & nFiles & " ไฟล์" & " / จำนวน " & nFolders & " โฟลเดอร์" & " "
End Function

' ฟังค์ชั่นตรวจสอบว่า Drive ที่เข้ามานั้นเป็น Removable Drive หรือไม่
' หากใช่ ให้คืนค่ากลับเป็น True ... ไม่ใช่ให้คืนค่า False
Public Function CheckRemovable(Drive As String) As Boolean
On Error Resume Next
    Set mDrive = FSO.GetDrive(Drive)
    If mDrive.DriveType = Removable And mDrive.IsReady = True Then
        CheckRemovable = True
    Else
        CheckRemovable = False
    End If
End Function
Conclusion:
บทความ 2 ตอนดังที่กล่าวไปแล้วนั้น ... พี่น้องสามารถนำมันไปประยุกต์ใช้งานในการดักไวรัส หรือ ไฟล์ที่ไม่พึงประสงค์ได้เลยครับ โอว ... แม้แต่สร้างไวรัสเรียบร้อยแล้ว นำไปปล่อยต่อก็ยังไหวเลย 55555+ มันก็แล้วแต่พี่น้องจะเลือกทางขาว หรือ ทางดำเอาเอง ... ส่วนผมมันทางสายผสมโซดาครับ เอิ๊กๆๆๆๆ ... แต่ผมแนะนำไว้ให้หาข้อมูลเพิ่มเติม เกี่ยวกับเรื่องสิทธิ (Rights) หรือ ระบบรักษาความปลอดภัยในระบบ (Security) ในระบบคอมพิวเตอร์ ... ครับกระผม
จี ทู จี เน็ต ดอต คอม - g2gNet Dot Com
เลขทะเบียนพาณิชย์อิเล็กทรอนิกส์ 0407314800231
CopyLeft © 2004 - 2099 g2gNet.Com All rights reserved.
Email: [email protected] หรือ โทร. 08-6862-6560