我有3个不同的功能,除了一个部分(代码中的{ENTERHERE
)外,它们基本上是相同的。 LastWriteTime
,LastAcccessTime
或CreationTime
。
Public Sub DeleteByENTERHERE(delDirectory As String)
Dim directory As New IO.DirectoryInfo(delDirectory)
For Each dctFile As IO.FileInfo In directory.GetFiles()
If dctFile.ENTERHERE.AddDays(Owner.PluginXML.DeleteDays) < Now Then
Try
dctFile.Delete()
Catch ex As Exception
End Try
End If
Next
If Owner.PluginXML.DeleteInSubfolders Then
For Each folder As IO.DirectoryInfo In directory.GetDirectories()
DeleteByENTERHERE(folder.FullName)
Next
End If
End Sub
我有一个配置菜单,可以在其中确定要使用的三个功能中的哪个,并使用此代码使用/不使用功能。
If Not Owner.PluginXML.LastWriteTime Then
Exit Sub
End If
如何将这三个功能合而为一?我尝试了类似的方法,但是感觉不干净。
If Owner.PluginXML.LastWriteTime Then
If file.LastWriteTime.AddDays(Owner.PluginXML.DeleteDays) < Now Then
End If
End If
If Owner.PluginXML.LastAccessTime Then
If file.LastAccessTime.AddDays(Owner.PluginXML.DeleteDays) < Now Then
End If
End If
If Owner.PluginXML.CreationTime Then
If file.CreationTime.AddDays(Owner.PluginXML.DeleteDays) < Now Then
End If
End If
答案 0 :(得分:4)
我会为接口推荐三种独立的方法,但是在单个私有方法中会大量实现,例如
Public Sub DeleteByLastWriteTime(folderPath As String)
DeleteByFileTime(folderPath, FileTimeType.LastWrite)
End Sub
Public Sub DeleteByLastAccessTime(folderPath As String)
DeleteByFileTime(folderPath, FileTimeType.LastAccess)
End Sub
Public Sub DeleteByCreationTime(folderPath As String)
DeleteByFileTime(folderPath, FileTimeType.Creation)
End Sub
Private Enum FileTimeType
LastWrite
LastAccess
Creation
End Enum
Private Sub DeleteByFileTime(folderPath As String, fileTimeType As FileTimeType)
Dim folder As New DirectoryInfo(folderPath)
For Each file In folder.EnumerateFiles()
Dim fileTime As Date
Select Case fileTimeType
Case FileTimeType.LastWrite
fileTime = file.LastWriteTime
Case FileTimeType.LastAccess
fileTime = file.LastAccessTime
Case FileTimeType.Creation
fileTime = file.CreationTime
End Select
If fileTime.AddDays(Owner.PluginXML.DeleteDays) < Date.Now Then
file.Delete()
End If
Next
If Owner.PluginXML.DeleteInSubfolders Then
For Each subfolderPath In Directory.EnumerateDirectories(folderPath)
DeleteByFileTime(subfolderPath, fileTimeType)
Next
End If
End Sub
您甚至可以将该私有方法重构为两个:
Private Sub DeleteByFileTime(folderPath As String, fileTimeType As FileTimeType)
Dim folder As New DirectoryInfo(folderPath)
For Each file In folder.EnumerateFiles().Where(Function(fi) GetFileTime(fi, fileTimeType).AddDays(Owner.PluginXML.DeleteDays) < Date.Now)
file.Delete()
Next
If Owner.PluginXML.DeleteInSubfolders Then
For Each subfolderPath In Directory.EnumerateDirectories(folderPath)
DeleteByFileTime(subfolderPath, fileTimeType)
Next
End If
End Sub
Private Function GetFileTime(file As FileInfo, fileTimeType As FileTimeType) As Date
Select Case fileTimeType
Case FileTimeType.LastWrite
Return file.LastWriteTime
Case FileTimeType.LastAccess
Return file.LastAccessTime
Case FileTimeType.Creation
Return file.CreationTime
Case Else
Throw New ArgumentException($"'{fileTimeType}' is not a valid {NameOf(fileTimeType)} value.", NameOf(fileTimeType))
End Select
End Function