【问题标题】:Releasing File Locks释放文件锁
【发布时间】:2018-12-19 07:55:12
【问题描述】:

我有一个后台工作程序运行程序的一部分,该程序循环遍历在运行时整理的文件数组,根据文件类型等执行各种 SQL 任务。

随着文件的处理,我想将它们逐个移动到另一个文件夹中,以免它们被意外重新处理。

该过程的某些部分正在锁定文件,因为循环结束时的移动命令因锁定而失败。释放锁(如果有的话)然后移动文件的最佳方法是什么?我考虑过复制然后删除,但我怀疑删除源文件会有同样的问题。

Count Files Sub (source)

Public Function count_files(ByVal location As String, ByVal Filter As String, ByVal searchOption As System.IO.SearchOption) As String()
        ' ArrayList will hold all file names
        Dim alFiles As ArrayList = New ArrayList()

    ' Create an array of filter string
    Dim MultipleFilters() As String = Filter.Split("|")

    ' for each filter find mathing file names
    For Each FileFilter As String In MultipleFilters
        ' add found file names to array list
        alFiles.AddRange(Directory.GetFiles(location, FileFilter, searchOption))
    Next

    ' returns string array of relevant file names
    Return alFiles.ToArray(Type.GetType("System.String"))
End Function

后台工作人员代码。

Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

'Count File Types, work out total & assign to progress bar length.
progress_total = sFiles.Count
current_count = 0

For Each FileName As String In sFiles
        current_count += 1
        currentfile = FileName
        filenamenoext = Path.GetFileNameWithoutExtension(FileName)
        extension = GetExtension(FileName)
        **DO STUFF HERE**

        'Report Progress

        BackgroundWorker1.ReportProgress(Convert.ToInt32((current_count / progress_total) * 100))

        'If we've reached here, we've done something with the file. Move it so it cannot be reprocessed without manually moving the file.
        Try
        My.Computer.FileSystem.MoveFile(currentfile, Import_Path & "processed\" & filenamenoext & extension, True)

        Catch ex As Exception
        MessageBox.Show(ex.Message, "Error Moving File", MessageBoxButtons.OK, MessageBoxIcon.Error)

        End Try

        System.Threading.Thread.Sleep(100)

Next

End Sub

DO STUFF HERE 执行以下两项操作之一 - 将 .csv 文件读入 DataTable(使用 FileIO.TextFieldParser 写入数据)或使用 @987654327 将图像转换为字节码@。

在这两种情况下,数据都会写入 SQLite 表中。

【问题讨论】:

  • “** DO STUFF HERE**”中发生的任何事情都可能是锁定文件的原因。这是推测,因为您没有提供该代码的任何详细信息。
  • 以上帖子中的更多数据...
  • 可以相当安全地假设您已经隐藏了该错误。值得注意的是 MoveFile() 实际上并不关心锁,它所做的只是移动目录条目并且不能被锁定。除非您将其移动到不同的磁盘驱动器,否则它必须求助于完整副本并且锁定确实起作用。不是你通常喜欢的东西。
  • 您确定当您读取 .csv 文件或打开 MemoryStream 文件时,您正确关闭了所有文件?这是我的猜测。
  • 克里斯,这就是问题所在。我通过在循环末尾添加parser.close() 修复了TextParser 之一,但我需要查看使用MemoryStream 的函数以查看关闭/处理它的最佳位置。我想我可能需要更新它以使用USING,按照*.com/a/5961665/1619795 随意做一个正确的答案,我会给你最佳答案信用。

标签: vb.net backgroundworker movefile


【解决方案1】:

正如 Chris Dunaway 所暗示的,在尝试移动文件之前,答案是 close() TextFieldParser 和 Dispose 各自的 Image。

【讨论】: