在Windows服务中移动文件

时间:2012-11-11 06:09:51

标签: vb.net windows-services

这是我第一次制作Windows服务应用。我正在尝试使用Windows服务应用程序将文件从一个文件夹移动到另一个文件夹。它会每10秒钟完成一次。 这是我正在使用的代码。当我在Windows窗体应用程序上使用它时它可以正常工作,但是当我在Windows服务应用程序上使用它时它不起作用。

如果我在OnStart中使用它,Timer1_Tick中的代码就可以工作。但是在计时器中不起作用。

    Protected Overrides Sub OnStart(ByVal args() As String)
        Timer1.Enabled = True
    End Sub

    Protected Overrides Sub OnStop()
        Timer1.Enabled = False
    End Sub

    Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
        Dim FileToMove As String
        Dim MoveLocation As String
        Dim count1 As Integer = 0
        Dim files() As String = Directory.GetFiles("C:\Documents and Settings\dmmc.operation\Desktop\Q8")
        Dim pdfFiles(100) As String

        For i = 0 To files.Length - 1
            If Path.GetExtension(files(i)) = ".pdf" Then
                pdfFiles(count1) = files(i)
                count1 += 1
            End If
        Next

        For i = 0 To pdfFiles.Length - 1
            If pdfFiles(i) <> "" Then
                FileToMove = pdfFiles(i)
                MoveLocation = "C:\Documents and Settings\dmmc.operation\Desktop\Output\" + Path.GetFileName(pdfFiles(i))
                If File.Exists(FileToMove) = True Then
                    File.Move(FileToMove, MoveLocation)
                End If
            End If
        Next

    End Sub

2 个答案:

答案 0 :(得分:1)

如果没有实例化Form,Windows.Forms.Timer将无法运行。您应该使用System.Timers.Timer:

Private WithEvents m_timer As System.Timers.Timer

Protected Overrides Sub OnStart(ByVal args() As String)
    m_timer = New System.Timers.Timer(1000)   ' 1 second
    m_timer.Enabled = True
End Sub

Private Sub m_timer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles m_timer.Elapsed
    m_timer.Enabled = False

    'Do your stuff here

    m_timer.Enabled = True
End Sub

答案 1 :(得分:0)

我还构建了一项服务,该服务可以将拖放到文件夹中的文件移动,但我正在使用FileSystemWatcher。 FileSystemWatcher允许我在创建新文件时移动文件,在SQL数据库中创建条目并在完成所有操作后发送电子邮件通知。

这是我设置FileSystemWatcher的方式

  1. 设置要监视的文件夹:watcher.Path =“ C:\要监视的文件夹”
  2. 设置要监视的文件类型:watcher.Filter =“ * .pdf”。
  3. 要监视的事件类型和触发的方法:watcher.Created + = new FileSystemEventHandler(OnChanged);
  4. 最后,我需要启用事件:watcher.EnableRaisingEvents = true;

不幸的是,我每天都有实例无法成功移动文件。我得到正在使用的文件的IO异常。将复制文件,但目标文件夹中的文件为0kb。

我正在尝试对其进行故障排除,并且设法进行了远程调试,但是我仍然没有弄清楚自己在做什么错。

我得到的最常见错误是:错误:System.IO.IOException:该进程无法访问文件'fileName.pdf',因为它正在被另一个进程使用。

此错误没有意义,因为在我的服务尝试移动该文件之前该文件不存在...

任何进一步的帮助,将不胜感激。