我的代码已从图像文件中检索“Date Taken”属性并将其存储为字符串。然后它将该字符串传递回Main Sub,并尝试将其与其他日期(系统时间)进行比较。我收到一条错误消息,说我无法将字符串日期转换为日期。 (从字符串“8/5/2014”到“日期”类型的转换无效。)
在下面的代码中有两条注释掉的行。当执行这些行时,程序按预期工作(字符串转换为日期)。注释掉的行中的日期完全匹配(视觉上)程序化获取日期;虽然如果我从观察窗口复制和粘贴它也会失败。
Imports System.IO
Imports System.Globalization
Module Module1
Sub Main()
Dim topLevelFolder As New DirectoryInfo("C:\Users\amitchell\Desktop\test1\")
Dim cutoffDate As DateTime = DateTime.Now.AddDays(-30)
Dim Dtaken As String
Dim PassFile
Dim Dtaken2
Using outputFile As New StreamWriter("output_file.txt")
For Each currentFile In topLevelFolder.EnumerateFiles("*.*", SearchOption.AllDirectories)
PassFile = currentFile.FullName
Dtaken = GetProperty(PassFile, 12)
'Dtaken = "8/5/2014"
'Dtaken2 = IsDate(Dtaken)
If Dtaken > cutoffDate Then
outputFile.WriteLine(currentFile.FullName)
End If
Next
End Using
End Sub
Function GetProperty(strFile, n)
Dim objShell As Object
Dim objFolder
Dim objFolderItem
Dim i
Dim strPath
Dim strName
Dim intPos
On Error GoTo ErrHandler
intPos = InStrRev(strFile, "\")
strPath = Left(strFile, intPos)
strName = Mid(strFile, intPos + 1)
objShell = CreateObject("shell.application")
objFolder = objShell.NameSpace(CObj(strPath))
objFolderItem = objFolder.ParseName(strName)
If Not objFolderItem Is Nothing Then
GetProperty = objFolder.GetDetailsOf(objFolderItem, n)
GetProperty = Left(GetProperty, InStrRev(GetProperty, " ") - 1)
GetProperty = Left(GetProperty, InStrRev(GetProperty, " ") - 1)
End If
ExitHandler:
objFolderItem = Nothing
objFolder = Nothing
objShell = Nothing
Exit Function
ErrHandler:
MsgBox(Err.Description, vbExclamation)
Resume ExitHandler
End Function
End Module
答案 0 :(得分:1)
那段代码让我难过。它遵循了许多对vb6 / vbscript时代有意义的约定,但对于.Net代码来说并不是那么好。结果是,大部分代码都复制了.Net Framework为您处理(并且做得更好)的工作。我会赞赏你拥抱Using
块,所以有希望。
此代码更好地利用.Net Framework。它永远不会将任何日期值渲染为字符串,从而完全回避您的问题。
Imports System.IO
Module Module1
Sub Main()
Dim topLevelFolder As New DirectoryInfo("C:\Users\amitchell\Desktop\test1\")
Dim cutoffDate As DateTime = DateTime.Now.AddDays(-30).Date
Using outputFile As New StreamWriter("output_file.txt")
Dim files = topLevelFolder.EnumerateFileSystemInfos("*.*", SearchOption.AllDirectories).
Where( Function(f) f.CreationTime > cutoffDate )
For Each file in files
outputFile.WriteLine(file.FullName)
Next file
End Using
End Sub
End Module
答案 1 :(得分:0)
我不确定为什么一个String
会在另一个人无法工作的地方工作。您通常需要将String
转换为DateTime
才能进行比较。请尝试以下方法:
Dim dt As DateTime = DateTime.Parse(Dtaken)
然后
If dt > cutoffDate Then
编辑:我选择乔尔的答案作为最可能的解决方案,但为了附上评论,我会将此保留在这里。
答案 2 :(得分:0)
您在其中一条评论中提供的日期字符串在每个日期部分U+0000
的开头包含三个(?8/?5/?2014)
字符,其中?
表示U+0000
的出现
您需要将其删除才能使日期有效。