1

我正在创建一个控制台应用程序,它将每 30 分钟从目录中删除一次图片。问题是它每分钟左右都会被文件填充。因此,如果我去删除该目录中的文件,那么尝试删除正在创建或打开的文件可能会导致错误。

我目前有这段代码可以将文件复制到另一个目录,然后从源目录中删除它们。

Dim f() As String = Directory.GetFiles(sourceDir)

    For i As Integer = 0 To UBound(f)
        'Check file date here in IF statement FIRST...

        File.Copy(f(i), destDir & f(i).Replace(sourceDir, ""))

        If File.Exists(f(i)) = True Then
              File.Delete(f(i))
        End If

        Debug.Print(f(i) & " to >>> " & destDir & f(i).Replace(sourceDir, ""))
    Next

我该如何使用:

File.GetCreationTime(f(i))

在 IF 语句中检查其当前文件是否比 30 秒前更新?

或者

有没有办法只填充:

 Dim f() As String = Directory.GetFiles(sourceDir)

只有那些超过 30 秒的文件?

4

2 回答 2

2

没有可靠的方法来检测文件是否被锁定。即使您确实发现了(这在技术上是可能的),它也可能在您尝试删除它之前被锁定。删除失败还有其他原因。在你的情况下,我认为原因是什么并不重要。

唯一的方法是将 delete 调用放在 try/catch 中并捕获 IOException,然后根据需要重试。

您需要使用 FileInfo 对象来获取CreatedTime并与 Now 进行比较。您也可以使用LastAccessTimeor LastWriteTime,但由于这些都是当时正在编写的新文件,因此您不需要。

Private Sub DeleteFiles()
    Dim files = From f In Directory.GetFiles("c:\temp")
                Let fi = New FileInfo(f) 
                Where fi.Exists AndAlso fi.CreationTime <= DateTime.Now.AddSeconds(-30)

    For Each f In files
        Try
            f.Delete()
        Catch ex As Exception
            If TypeOf ex Is IOException AndAlso IsFileLocked(ex) Then
                ' do something? 
            End If
            'otherwise we just ignore it.  we will pick it up on the next pass
        End Try
    Next   
End Sub

Private Shared Function IsFileLocked(exception As Exception) As Boolean
    Dim errorCode As Integer = Marshal.GetHRForException(exception) And ((1 << 16) - 1)
    Return errorCode = 32 OrElse errorCode = 33
End Function

IsFileLocked从 SO 上的其他线程提升的函数

于 2012-04-20T04:23:50.370 回答
1
Dim NewFileDate As DateTime = DateTime.Now.AddSeconds(-30)
' get the list of all files in FileDir
Dim PicFiles As List(Of String) = System.IO.Directory.GetFiles("C:\", "*.txt").ToList()
' filter the list to only include files older than NewFileDate
Dim OutputList As List(Of String) = PicFiles.Where(Function(x) System.IO.File.GetCreationTime(x) < NewFileDate).ToList()
' delete files in the list
For Each PicFile As String In OutputList
    'wrap this next line in a Try-Catch if you find there is file locking.
    System.IO.File.Delete(PicFile)
Next

显然是针对 .Net 3.5 或 4.0

于 2012-04-20T04:02:20.723 回答