Search code examples
vb.netvbscriptxcopy

Find and copy the latest file


Our program is going to save PDFs to a network folder. I will then be copying the PDFs to a web server. There becomes a problem when a user saves/archives the same report more than once.

Example:

  • DAGH4 (002).PDF - Date Modified = 3/16/2016 10:10 AM
  • DAGH4 (001).PDF - Date Modified = 3/16/2016 9:00 AM
  • DAGH4.PDF - Date Modified = 3/16/2016 8:00 AM
  • DANYL (001).PDF - Date Modified = 3/16/2016 10:50 AM
  • DANYL.PDF - Date Modified = 3/16/2016 9:50 AM

Is there a way I could copy the latest version? I only want DAGH4 (002).PDF and DANYL (001).PDF to be copied. Or is there a way to rename and save the latest version?

Another thought

Using this code I check if the file exists and allow the user to click an thumbnail to open the associated PDF.

Dim pdf_path = Server.MapPath(String.Format("../Reports/{0}.pdf",     
SerialNumber))
lblSerial.Visible = System.IO.File.Exists(pdf_path)
HyperLinkSerial.Visible = System.IO.File.Exists(pdf_path)
HyperLinkSerial.Text = "Inspection"
HyperLinkSerial.NavigateUrl = "../Reports/" & SerialNumber & ".PDF"

However, I need to only find and show the DAGH4 (002).PDF with the modified date 3/16/2016 10:10 AM

Is that possible using VB .NET?


Solution

  • To find the latest copy of each file, you could use LINQ to group by serial number, sort by modification date, and select the first item for each group. Note that this assumes that your "SerialNumber" is just letters and numbers (what the regex matches):

    Dim latest As IEnumerable(Of String) =
        From f In New DirectoryInfo(Server.MapPath("../Reports")).EnumerateFiles("*.PDF")
        Let serialNumber = Regex.Match(f.Name, "^\w+").Value
        Order By serialNumber Ascending, f.LastWriteTime Descending
        Group By serialNumber Into Group
        Select Group.First().f.FullName
    

    latest will have the full path/name for the latest (based on modification date) file for each serial number.