【问题标题】:Deleting a partially cancelled-copy file VB.NET删除部分取消的副本文件 VB.NET
【发布时间】:2016-07-05 22:52:59
【问题描述】:

删除在复制过程中被取消的文件的最佳方法是什么?我所做的是,如果我单击Cancel 按钮,Timer 将被启用并检查文件是否存在,如果存在,它将删除文件,然后计时器将被禁用,反之亦然。这是我的代码:

Private Sub btnCancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCancel.Click
    Timer3.Enabled = True 
End Sub

updatedFiles 是一个 List(Of String),其中包含在复制之前已放在那里的文件。

Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick
    Dim dest As String = Label6.Text
        For i = 0 To updatedFilesCancel.Count - 1
             File.Delete(Path.Combine(dest, updatedFilesCancel(i)))
             Timer3.Enabled = False
        Next
End Sub

Timer 有 1 秒。间隔,ONCE删除成功,第二次就不行了,请问是什么问题?建议?

【问题讨论】:

  • 为什么需要计时器?
  • 嗯,这是我能想到的唯一方法。因为我使用FileStream 复制文件,如果我在取消复制后删除文件,则会抛出错误the file is being used,所以我等待FileStream 在删除之前完成其过程。
  • 我是怎么做的:If file.Exists("path") Then File.Delete("path") 区别是取消还是取消?
  • 如果文件数不在100s以内,不用担心timer或threading。只需将计时器代码移动到您的取消按钮代码中并摆脱计时器。
  • 如果文件数足够多,会花费很多时间,则使用ThreadingBackgroundWorker 控制。

标签: .net vb.net file stream file-copying


【解决方案1】:

我建议你使用 TaskCancellationTokenSource,而不是搞乱计时器,它会给你更好的文件控制和行为- 复制操作。

我在一个名为 FileCopy 的简单类中实现了所有这些,该类用于演示示例。

如果您不喜欢它,您可以获取源代码并根据您的需要对其进行调整,或者只是看看如何管理我的源代码中的内容以自己制作!。

一个例子:

Imports Elektro.IO.Types

Public Class Form1 : Inherits Form

    Friend WithEvents FileCopier As FileCopy
    Private fileCopyCancelToken As CancellationTokenSource

    Private Sub ButtonStart_Click() Handles Button1.Click

        Me.FileCopier = New FileCopy("C:\Source File.ext")

        ' It returns a CancellationTokenSource to cancel the task whenever you want.
        Me.fileCopyCancelToken = Me.FileCopier.CopyTo("C:\Target file.ext",
                                                      overwrite:=True,
                                                      deleteFileOnCancel:=True,
                                                      cancelCallback:=Nothing)

    End Sub

    Private Sub ButtonCancel_Click() Handles Button2.Click

        Me.fileCopyCancelToken.Cancel()

    End Sub

    Private Sub FileCopier_ProgressChanged(ByVal sender As Object, ByVal e As FileCopyProgressChangedEventArgs) _
    Handles FileCopier.FileCopyProgressChanged

        Console.WriteLine(String.Format("Copied: {0:0.00}%", e.Percentage))

    End Sub

End Class

这个其他(更扩展的)示例可以在源代码中找到:

Public Class Form1 : Inherits Form

    Friend WithEvents FileCopier As FileCopy
    Private fileCopyCancelToken As CancellationTokenSource

    Private Sub Button1_Click() Handles Button1.Click

        Me.StartCopy()

    End Sub

    Private Sub Button2_Click() Handles Button2.Click

        Me.CancelCopy()

    End Sub

    Private Sub StartCopy()

        ' Create a dummy file of 2 GB
        Using fs As New FileStream("C:\source file.ext", FileMode.CreateNew)
            fs.SetLength(2147483648)
        End Using

        Me.FileCopier = New FileCopy("C:\source file.ext")

        Me.fileCopyCancelToken =
            Me.FileCopier.CopyTo("C:\Target file.ext",
                                 bufferSize:=(CInt(Me.FileCopier.File.Length \ (1024 * 100)) + 1),
                                 overwrite:=True,
                                 deleteFileOnCancel:=False,
                                 cancelCallback:=AddressOf Me.FileCopier_CancelCallBack)

    End Sub

    Private Sub CancelCopy()

        ' Cancel the current file-copy operation.
        Me.FileCopier.CancelCopy(Me.fileCopyCancelToken)

    End Sub

    ''' <summary>
    ''' Callback that is called when the a file-copy operaton of the <see cref="FileCopier"/> is cancelled.
    ''' </summary>
    Private Sub FileCopier_CancelCallBack()

        Me.Invoke(
            Sub()
                Me.Label1.Text = "Canceled!"
                Me.Label2.Text = "Canceled!"
                Me.Label3.Text = "Canceled!"
                Me.Label4.Text = "Canceled!"
            End Sub)
    End Sub

    ''' ----------------------------------------------------------------------------------------------------
    ''' <summary>
    ''' Handles the <see cref="FileCopy.FileCopyProgressChanged"/> event of the <see cref="FileCopier"/> instance.
    ''' </summary>
    ''' ----------------------------------------------------------------------------------------------------
    ''' <param name="sender">
    ''' The source of the event.
    ''' </param>
    ''' 
    ''' <param name="e">
    ''' The <see cref="FileCopyProgressChangedEventArgs"/> instance containing the event data.
    ''' </param>
    ''' ----------------------------------------------------------------------------------------------------
    Private Sub FileCopier_FileCopyProgressChanged(ByVal sender As Object, ByVal e As FileCopyProgressChangedEventArgs) _
    Handles FileCopier.FileCopyProgressChanged

        Me.Invoke(
            Sub()
                Me.Label1.Text = String.Format("Size: {0} MB", (e.Filesize / 1024).ToString("n2"))
                Me.Label2.Text = String.Format("Written: {0} MB", (e.BytesRead / 1024).ToString("n2"))
                Me.Label3.Text = String.Format("Read: {0} MB", (e.BytesRemaining / 1024).ToString("n2"))
                Me.Label4.Text = String.Format("Done: {0}%", e.Percentage.ToString("n2"))
            End Sub)

    End Sub

End Class

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    • 2012-07-14
    • 2011-12-25
    相关资源
    最近更新 更多