ต้องการตรวจสอบไฟล์ วันที่ล่าสุด ครับ
กระทู้เก่าบอร์ด อ.Yeadram

 1,624   9
URL.หัวข้อ / URL
ต้องการตรวจสอบไฟล์ วันที่ล่าสุด ครับ

หากต้องการตรวจสอบ Text ไฟล์ วันที่ล่าสุดที่ตามรูปแบบ ปีเดือนวัน
จากโฟลเดอร์หนึ่ง

ต.ย. เช่น D:\File   ภายในมีชื่อไฟล์ดังนี้

             xxx_20120827.txt
               xxx_20120828.txt
               xxx_20120829.txt

จาก ต.ย. ต้องการตรวจสอบไฟล์ชื่อ xxx_20120829.txt ครับ
ต้องทำอย่างไร ขอบคุณครับ

9 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R13681
ใช้ function Dir() เพื่อดูชื่อ file แล้วตัด string ของชื่อ file มาเปรียบเทียบหาค่าที่ต้องการครับ

วิธีใช้ Dir()
http://www.thai-access.com/yeadram_view.php?topic_id=2828
2 @R13682
การเปรียบเทียบจะเปรียบเทียบอย่างไรครับ ยังคิดไม่ออกครับ
รบกวนคุณ PichiTC ช่วยอธิบายแนวทางหน่อยครับ
3 @R13695
หากผมต้องการเปรียบเทียบโดยเอาวันที่ล่าสุด เช่น

             xxx_20120827.txt
               xxx_20120828.txt
               xxx_20120829.txt

ถ้าผมใช้คำสั่ง mid เพื่อตัด String เอาเฉาพะตัวเลขผมจะใช้ฟังก์ชั่นอะไรในการหาค่าสูงสุดของวันที่ในตัวอย่างนี้ครับ

หากใช้ Dmax หรือพวกฟังก์ชั่นอื่นๆ มันต้องใช้กับฐานข้อมูล
ที่อยู่ใน Access ครับ ช่วยแนะนำหน่อยครับ ขอบคุณครับ
4 @R13699
วนลูปเทียบค่าทีละ file ครับ

Do While ...
...
If MaxFileDate < TempFileDate Then
    MaxFileDate = TempFileDate
End If

...
Loop
5 @R13702
หากต้องการหาชื่อไฟล์ในโฟลเดอร์ที่ต้องการ ว่าไฟล์ไหนมีการอัพเดทล่าสุด ลองใช้ฟังก์ชั่นนี้ดูนะครับ แล้วลองทำเป็นขั้นตอนตามผม ดูว่าตรงตามความต้องการหรือไม่

1. สร้าง Module ขึ้นใหม่ ใส่โค๊ดนี้ลงไป

Public Function GetFileInfo(FileName As String, Optional fReturn As String) As String
On Error GoTo err_fInfo

    Dim myFSO, myFileObject
    Dim datLastModified As Date

    Set myFSO = CreateObject("Scripting.FileSystemObject")
    Set myFileObject = myFSO.GetFile(FileName)

    If fReturn = "" Then
        With myFileObject
            datLastModified = .dateLastModified
        End With
        GetFileInfo = datLastModified
    Else
        Dim vReturn As Variant
               vReturn = myFileObject.dateLastModified
        GetFileInfo = vReturn
    End If

Exit_err:
    Set myFileObject = Nothing
    Set myFSO = Nothing
    Exit Function
err_fInfo:
    GetFileInfo = Err.Description
    Resume Exit_err
End Function


2. บนฟอร์ม สร้างปุ่มใหม่ขึ้นมา ใส่โค๊ดลงใน Event > On Click

    Dim Date_update As Date
    Dim NameFileUpdate As String
    Dim strFile As String
    strFile = Dir("D:\File\", vbNormal)
    Do While strFile <> ""
        If IsNull(Date_update) Or Date_update < CDate(GetFileInfo("D:\File\" & strFile)) Then
            Date_update = CDate(GetFileInfo("D:\File\" & strFile))
            NameFileUpdate = strFile & Chr(13) & Date_update
        End If
        strFile = Dir()
    Loop
        MsgBox NameFileUpdate


- จากนั้นลองกดปุ่มที่สร้างดู เราจะได้ชื่อไฟล์ที่มีการอัพเดทล่าสุดในโฟลเดอร์ File เสมอ
- เมื่อได้ชื่อไฟล์อัพเดทล่าสุดมาแล้ว จะนำไปใช้อะไรต่อก็สามารถต่อยอดต่อไปได้แล้วครับ

ปล. วิธีนี้ไม่จำเป็นต้องตั้งชื่อไฟล์เป็นรูปแบบวันที่ จะเป็นไฟล์ชื่ออะไรก็ได้ เพราะเราใช้การเรียกดูข้อมูล Info ของไฟล์โดยตรง
6 @R13714
ใช้วิธีของคุณ TTT อาจจะตรวจสอบวันที่ข้อมูลจาก info ของไฟล์ได้โดยตรงก็จริงครับ แต่ผมคิดว่ายังไม่ตรงตามต้องการ เนื่องจาก ในโฟลเดอร์นี้มีหลายไฟล์ ดังนั้นข้อมูลจาก info ของไฟล์อาจจะล่าสุด แต่ไม่ใช่ไฟล์ที่ผมต้องการก็ได้

ความเห็นของผมคือ ผมอยากทราบวิธีสร้างฟังก์ชั่น ตรวจสอบ
จากชื่อไฟล์ที่ผมได้ตั้งไว้คือ

xxx_20120827.txt
xxx_20120828.txt
xxx_20120829.txt

ผมตัดสตริงให้เหลือแค่

20120827
20120828
20120829

เพื่อสะดวกเวลาตรวจสอบวันที่ล่าสุดของไฟล์ครับ
แต่ผมติดปัญหาตรงที่จะหาค่าสูงสุดของตัวเลขเหล่านี้อย่างไรนั่นเอง
ผมไม่สามารถใช้ฟังก์ชั่นสำเร็จรูปใน Acess หาค่าได้ เนื่องจากมันไม่ได้อยู่ใน Database แต่อยู่ที่ D:\File

โค้ดที่ผมเขียนไว้ตรวจสอบไฟล์ใน Drive D:\File คือ

Dim Fso As Object
    Dim intCount as Integer , intTotal as Integer
    Dim xFolder As Object, xFile As Object
    Set Fso = CreateObject("Scripting.FileSystemObject") 'Create Class system file object.
    Set xFolder = Fso.GetFolder("D:\File)
        For Each xFile In xFolder.Files
            If Right(xFile, 3) = "txt" Then
                    intCount = intCount + 1
                    Debug.Print "No: " & intCount & " " & Left(Right(xFile, 12), 8)
            End If
        Next
        intTotal = intCount
        Debug.Print " Total: " & intTotal & vbNewLine
        intCount = 0

ดังนั้นความคิดผมคือน่าจะเขียนฟังก์ชั่นหาค่า max จากตัวเลขเหล่านี้เองครับ ซึ่งผมยังคิดไม่ออกว่าจะเขียนอย่างไร

รบกวนหน่อยนะครับ ขอบคุณทุกท่านที่เข้ามาช่วยเหลือครับ


7 @R13716
บนสมมุติฐานที่ format ของ ชื่อfile เป็น xxx_yyyymmdd.txt

Dim Fso As Object
Dim intCount as Integer , intTotal as Integer
Dim xFolder As Object, xFile As Object

Dim strMaxFile as String

    Set Fso = CreateObject("Scripting.FileSystemObject") 'Create Class system file object.
    Set xFolder = Fso.GetFolder("D:\File)

    strMaxFile = ""

    For Each xFile In xFolder.Files
        If Right(xFile, 3) = "txt" Then
            intCount = intCount + 1
            Debug.Print "No: " & intCount & " " & Left(Right(xFile, 12), 8)

            If xFile.Name > strMaxFile Then
               strMaxFile = xFile.Name
            End If



        End If
    Next

    Debug.Print "Max File = " & strMaxFile
8 @R13718
คือถ้าคุณสามารถเขียนตัดคำโดยใช้การลูปได้แล้ว ก็แค่นำค่าที่ได้นั้นมาเปรียบเทียบตอนลูปเลยก็น่าจะได้แล้วนะครับ ยกตัวอย่างของคุณมาเพิ่มให้ดูนะครับ

Dim Fso As Object
    Dim intCount As Integer, intTotal As Integer
'------กำหนดตัวแปรสำหรับเก็บค่าสูงสุด-----
    Dim DateMax As Long
'-------------------------------------------------------
    Dim xFolder As Object, xFile As Object
    DateMax = 0
    Set Fso = CreateObject("Scripting.FileSystemObject") 'Create Class system file object.
    Set xFolder = Fso.GetFolder("D:\File")
        For Each xFile In xFolder.Files
            If Right(xFile, 3) = "txt" Then
                    intCount = intCount + 1
                    MsgBox "No: " & intCount & " " & Left(Right(xFile, 12), 8)
'-----------------เพิ่มเงื่อนไขการเปรียบเทียบ-------------------
                    If DateMax < CLng(Left(Right(xFile, 12), 8)) Then
                        DateMax = CLng(Left(Right(xFile, 12), 8))
                    End If
'------------------------------------------------------------------------
            End If
        Next
        intTotal = intCount
        MsgBox " Total: " & intTotal & vbNewLine & "Last File: " & "xxx_" & DateMax & ".txt"
        intCount = 0
    Set Fso = Nothing
    Set xFolder = Nothing


ประมาณนี้ครับ คิดว่าคุณทำได้ขนาดนี้แล้ว ไม่น่ายากแล้วนะครับ
9 @R13722
ขอบคุณ อ.ทั้งสองท่านครับ
แนวคิดง่ายๆ จากโค้ดที่แนะนำมา ซึ่งผมเองก็นึกไม่ถึงเลยคือ
สร้างตัวแปรเพื่อเก็บค่า Max ที่ส่งเข้ามาหากค่าไหนน้อยกว่าก็ไม่
ต้องเก็บลงตัวแปร แบบนี้ก็จะสามารถหาค่าสูงสุด ได้แล้ว
ขอบคุณมากครับ ทำให้ผมสามารถนำเอาไปประยุกต์เพื่อพัฒนา
โปรแแกรมได้อีกมากมายเลย ต้องขอบคุณบอร์ดแห่งนี้จริงๆ

@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.2822s