On dirait qu'il serait suffisant pour les fichiers tassent si leurs horodatages diffèrent de moins que certains timespan. Donc, si vous commandez les fichiers par leur .LastWriteTimeUtc
, vous pouvez parcourir cette liste et vérifier combien de temps il était entre l'un et le précédent. Si l'écart est faible, ajoutez-le à la liste actuelle, sinon démarrez une nouvelle liste.
J'ai testé le code suivant dans un répertoire avec une sélection aléatoire de fichiers, donc 30 jours était un laps de temps approprié pour cela, il ressemble peut-être deux ou trois secondes serait bon pour votre utilisation:
Option Infer On
Option Strict On
Imports System.IO
Module Module1
''' <summary>
''' Get FileInfos bunched by virtue of having less than some time interval between their consecutive LastWriteTimeUtc when ordered by that.
''' </summary>
''' <param name="srcDir">Directory to get files from.</param>
''' <param name="adjacencyLimit">The allowable timespan to count as in the same bunch.</param>
''' <returns>A List(Of List(Of FileInfo). Each outer list has consecutive LastWriteTimeUtc differences less than some time interval.</returns>
Function GetTimeAdjacentFiles(srcDir As String, adjacencyLimit As TimeSpan) As List(Of List(Of FileInfo))
Dim di = New DirectoryInfo(srcDir)
Dim fis = di.GetFiles().OrderBy(Function(fi) fi.LastWriteTimeUtc)
If fis.Count = 0 Then
Return Nothing
End If
Dim bins As New List(Of List(Of FileInfo))
Dim thisBin As New List(Of FileInfo) From {(fis(0))}
For i = 1 To fis.Count - 1
If fis(i).LastWriteTimeUtc - fis(i - 1).LastWriteTimeUtc < adjacencyLimit Then
thisBin.Add(fis(i))
Else
bins.Add(thisBin)
thisBin = New List(Of FileInfo) From {fis(i)}
End If
Next
bins.Add(thisBin)
Return bins
End Function
Sub Main()
Dim src = "E:\temp"
'TODO: choose a suitable TimeSpan, e.g. TimeSpan.FromSeconds(3)
Dim adjacencyLimit = TimeSpan.FromDays(30)
Dim x = GetTimeAdjacentFiles(src, adjacencyLimit)
For Each b In x
Console.WriteLine("***********")
For Each fi In b
'TODO: merge each fi into a PDF.
Console.WriteLine(fi.Name)
Next
Next
Console.ReadLine()
End Sub
End Module
Je suggère deux ou trois secondes, car si les fichiers ont été stockés sur un type FAT (par exemple FAT32 ou exFAT, comme sur les clés USB, les anciens lecteurs de disque, etc.), la résolution de l'horodatage aura été deux secondes.
J'ai enlevé l'étiquette iText parce que, pendant que vous écrivez vous-même, vous avez déjà la partie iText de votre question couverte. Pour vous aider j'ai ajouté quelques tags qui semblaient plus pertinents. –
Quelle est la correspondance exacte entre les horodatages de chaque groupe de fichiers que vous considérez comme identiques? Pourraient-ils être à moins d'une minute l'un de l'autre, dans une heure, une seconde ...? –
la date et l'heure sont exactement les mêmes à la seconde, ne sais pas comment cela se passe, mais un autre programme fournit le tiff pour nous –