1

30分ごとにディレクトリから画像を削除するコンソールアプリを作成しています。問題は、1分ごとにファイルが読み込まれることです。そのため、そのディレクトリにあるファイルを削除すると、その時点で作成されているファイルまたは開かれているファイルを削除しようとするとエラーが発生する可能性があります。

私は現在、ファイルを別のディレクトリにコピーしてからソースディレクトリから削除するこのコードを持っています。

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))

現在のファイルが30秒前より新しいかどうかをチェックするIFステートメントで?

また

移入するだけの方法はありますか?

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

30秒以上前のファイルだけで?

4

2 に答える 2

2

ファイルがロックされているかどうかを確実に検出する方法はありません。見つけたとしても (技術的には可能です)、削除しようとする前にロックされている可能性があります。削除が失敗する理由は他にもあります。あなたの場合、理由が何であったかは問題ではないと思います。

唯一の方法は、削除の呼び出しを try/catch に入れて IOException をトラップし、必要に応じて再試行することです。

CreatedTimeを取得して Now と比較するには、FileInfo オブジェクトを使用する必要があります。LastAccessTimeまたはを使用することもできます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

IsFileLockedSOのこの他のスレッドから関数が持ち上げられました

于 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

明らかに.Net3.5または4.0をターゲットにしています

于 2012-04-20T04:02:20.723 に答える