none
請問有關window services執行檔案複製與刪除之問題 RRS feed

  • 問題

  • 各位先進大家好:

       我有兩個元件服務分別在兩台電腦,一個負責監控是否有檔案進來,若有則copy到另一台電腦後再刪除,程式碼如下:

            '改成尋找在主機目錄c:\xxx\yyy之下,是否有新的檔案進來
            Dim j As Integer
            Dim newfile As String
            newfile = Dir("c:\xxx\yyy\*.txt")
            If newfile = "" Then   '沒有新檔案進來
            Else
                Do Until newfile = ""
                    If File.Exists("c:\xxx\zzz\" & newfile) Then
                        If filecompare("c:\xxx\zzz\" & newfile, "c:\xxx\yyy\" & newfile) Then '兩個檔案相同
                            Try
                                FileCopy("c:\xxx\yyy\" & newfile, "c:\xxx\zzz\" & newfile)
                                File.Delete("c:\xxx\yyy\" & newfile)
                            Catch ex As Exception
                                EventLog.WriteEntry("1.FileChangeMonitor-error=" & newfile & ex.Message)
                            End Try
                        Else
                            Try
                                If File.Exists("\\aaa-server\upload\" & newfile) Then
                                    FileCopy("c:\xxx\yyy\" & newfile, "c:\xxx\zzz\" & newfile)
                                    File.Delete("c:\xxx\yyy\" & newfile)
                                Else
                                    FileCopy("c:\xxx\yyy\" & newfile, "\\aaa-server\upload\" & newfile)
                                    FileCopy("c:\xxx\yyy\" & newfile, "c:\xxx\zzz\" & newfile)
                                    File.Delete("c:\xxx\yyy\" & newfile)
                                End If
                            Catch ex As Exception
                                EventLog.WriteEntry("2.FileChangeMonitor-error=" & newfile & ex.Message)
                            End Try

                        End If
                    Else
                        Try
                            If File.Exists("\\aaa-server\upload\" & newfile) Then
                                FileCopy("c:\xxx\yyy\" & newfile, "c:\act\daysource\" & newfile)
                                File.Delete("c:\xxx\yyy\" & newfile)
                            Else
                                FileCopy("c:\xxx\yyy\" & newfile, "\\aaa-server\upload\" & newfile)
                                FileCopy("c:\xxx\yyy\" & newfile, "c:\xxx\zzz\" & newfile)
                                File.Delete("c:\xxx\yyy\" & newfile)
                            End If
                        Catch ex As Exception
                            EventLog.WriteEntry("3.FileChangeMonitor-error=" & newfile & ex.Message)
                        End Try
                    End If
                    'Thread.Sleep(3000)
                    newfile = Dir() '移到下一個檔案
                Loop

            End If
            ControlTimer.Start()

        End Sub

    在某些狀況下該元件會不動(可能掛掉,我會停用再重新啟用),由事件檢視器中如下錯誤訊息:

    3.FileChangeMonitor-error=V01021720080815.txt由於另一個處理序正在使用檔案 "c:\xxx\yyy\V01021720080815.txt",所以無法存取該檔案。

    請問各位新進,當某一檔案正被使用時,該如何處理才能避免該元件當掉?

    2008年8月20日 上午 06:23

解答

  • 您可以先去檢查這個檔案有沒有被開啟,如果有,就不去做複製的動作.

    Code Snippet
     Function IsThisFileOpen(ByVal fn As String) As Boolean
            Try
                System.IO.File.Open(fn, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
                FileClose(1)
                Return False
            Catch ex As Exception
                Return True
            End Try
        End Function

     

     


    ref: http://bytes.com/forum/thread388089.html

     

    2008年8月21日 上午 12:06
    版主

所有回覆

  • 您可以先去檢查這個檔案有沒有被開啟,如果有,就不去做複製的動作.

    Code Snippet
     Function IsThisFileOpen(ByVal fn As String) As Boolean
            Try
                System.IO.File.Open(fn, IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.None)
                FileClose(1)
                Return False
            Catch ex As Exception
                Return True
            End Try
        End Function

     

     


    ref: http://bytes.com/forum/thread388089.html

     

    2008年8月21日 上午 12:06
    版主
  • 感謝LOLOTA你的回覆,我會試試看!

    很抱歉再延續問題,

    1.如果當fn檔案(傳入IsThisFileOpen的參數)是被開啟時,下FileClose(1)指令時能否成功?

    2.因為我的服務必須確定將檔案均能複製到另一台電腦上去,所以如果當判斷fn這個檔案是被開啟時(在另一台電腦上),如何設定Timer讓他能停留幾秒後再動作?

    謝謝!

    2008年8月21日 上午 12:39
  • 1. 不會成功, 會跳到exception, 所以可以知道檔案有被開啟.

    2. 你可以在這個function內設定一個timer, 如果時間到再來執行這個function.

     

    2008年8月21日 上午 01:08
    版主
  • 感謝指導,謝謝!

    2008年8月21日 上午 01:16
  • 很抱歉!我是上述做法好像fileclose(1)會導致 

                                   FileCopy("c:\bbb\upload\" & newfile, "\\aaa\upload\" & newfile)

    "\\aaa\upload\" & newfile這個檔案被lock住無法刪除?
                                   

    2008年8月21日 上午 04:33
  • 我只是如上面的語法作複製及刪除檔案,並沒有用非同步的方法!

    2008年8月21日 上午 05:12
  • Hi,

    你要不要測試看看都用新的.net類別的方法來試試看,例如File.Copy,File.xxxx等等。

     

     

    PS:原先貼的文我砍掉了~原文是"你的FIleCopy是怎麼做的,有沒有用到非同步的功能?",後來查了一下原來是內建的function

     

    2008年8月21日 上午 05:20
    版主
  • sorry,我一直沒說我用的是VS2003因為一直沒有升級所以無法用VS2005的新類別,不過檔案真的會被LOCK住,當我把元件服務停止後檔案便可以刪除了!

     

    2008年8月21日 上午 05:43
  • 您可參考下列網頁:

    http://msdn.microsoft.com/en-us/library/aa328773(VS.71).aspx

     

    剛剛那段程式碼我測試上有問題(剛剛沒有測到)..你先不要用...Orz

    2008年8月21日 上午 06:40
    版主