2

真的不知道该怎么办?我可以将一个 tif 转换为一个 pdf。我可以将一个目录中的所有 tif 转换为一个 pdf。我想要做的是根据他们的 lastwriteaccess 或 createddate 或 modifieddate 转换一组 tif。

例如,如果我在一个目录中有 7 个 tif,其中 3 个具有相同的时间戳,4 个具有另一个相同的时间戳,我想将 3 个合并到一个 pdf 中,然后将另外 4 个合并到另一个 pdf 中。我有点坚持如何解决这个问题。我是否需要创建所有文件的列表然后对它们进行分组,或者我可以合并 3 个然后去下一个组合并这些等,等等,等等,等等,等等,等等?

下面的代码是我用来收集前 5 个文件的代码:

Dim dir As New DirectoryInfo(tiffPath)
Dim files As List(Of FileInfo) = 
dir.GetFiles("*.tif").OrderByDescending(Function(fc) 
fc.LastAccessTime).Take(5).ToList

For Each lfi As FileInfo In files
MsgBox(lfi.Name)
Next
4

1 回答 1

0

如果它们的时间戳相差小于某个时间跨度,看起来将文件捆绑在一起就足够了。

因此,如果您按文件排序文件,.LastWriteTimeUtc则可以遍历该列表并检查一个与前一个之间的时间。如果差距很小,则将其添加到当前列表中,否则开始一个新列表。

我在随机选择文件的目录上测试了以下代码,因此 30 天是一个合适的时间跨度,看起来两三秒可能适合您的使用:

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

我建议两到三秒,因为如果文件存储在 FAT 类型(例如 FAT32 或 exFAT,可用于 USB 记忆棒、旧磁盘驱动器等)文件系统上,那么时间戳的分辨率将是两秒钟。

于 2017-08-16T19:22:28.823 回答