0

ディレクトリを調べ、ファイル名を読み取り、ファイル名の一部を使用してSQLクエリを実行してDBを修正し、ファイルを新しい場所にコピーして元のファイルを削除するスクリプトを作成しています。

これが完了すると、定義済みの電子メール アドレスに電子メールの確認が送信されます。

大多数が配置されていますが、ディレクトリをポーリングして、そこにある可能性のあるすべてのファイルを処理することはできません。この VB.net のことは初めてで、他のものを機能させるために、最初に名前を付けました。

どんな助けでも大歓迎です。

    Dim fileName As String = "C:\temp\Input\VBTEST1.success"
    Dim pathname As String = "C:\temp\Input\"
    Dim result As String
    Dim sourceDir As String = "C:\temp\Input\"
    Dim processedDir As String = "C:\temp\Input\Processed\"
    Dim fList As String() = Directory.GetFiles(sourceDir, "*.success")
    Dim sqlCommand As SqlCommand

    Public Sub Main()
      result = Path.GetFileName(fileName)

      Console.WriteLine("GetFileName('{0}') returns '{1}'", fileName, result)

      Dim betacell As String = result
      betacell = (result.Remove(7, 8))

      Dim connection As New SqlConnection(My.Settings.connectionString)
      connection.Open()

      Dim updateTransaction As SqlTransaction = connection.BeginTransaction()
      Dim sqlQ As String = "UPDATE " & My.Settings.JobTb & " SET Status = '10'  WHERE  JobNumber ='" & betacell & "'"

      sqlCommand = New SqlCommand(sqlQ, connection, updateTransaction)

      sqlCommand.ExecuteNonQuery()
      updateTransaction.Commit()
      connection.Close()
      SendEmail(My.Settings.emailUsers, "EMAIL TEXT")
      Call MoveFiles()

    End Sub

iv は .success 拡張子を持つすべてのファイルを検索することもできたので、私は今、すべて大騒ぎしています。これで、コードで指定されたファイルではなく、すべてのファイルが処理されます。

Module Module1    
Dim sourceDir As String = My.Settings.watchPath
Dim processedDir As String = My.Settings.processedPath

  Private loggerName As String = "EmailReleases"

Public Sub log(ex As Exception)
Console.WriteLine("Error: " & ex.ToString)
End Sub

Public Sub log(ByVal s As String)
Console.WriteLine(DateTime.Now.ToString & " [" & loggerName & "] " & s)
End Sub


Public Sub Main()    
Dim inputFiles As String() = Directory.GetFiles(sourceDir, "*.success")
log("Starting processing of .success files in '" & sourceDir & "' ... ")
If (inputFiles.Length > 0) Then
  Dim connection As New SqlConnection(My.Settings.connectionString)
  connection.Open()
  For Each fileName As String In inputFiles
    Dim sqlCommand As SqlCommand
    Dim fFile As New FileInfo(fileName)
    log(" Processing  " & fFile.Name)
    Dim betacell As String = fFile.Name.Substring(0, fFile.Name.Length - 8)

    'Update Status on Database with the use of the Betacell
    Dim updateTransaction As SqlTransaction = connection.BeginTransaction()
            Dim sqlQ As String = "UPDATE " & My.Settings.JobTb & " SET Status = '10'  WHERE JobNumber ='" & betacell & "'"
    sqlCommand = New SqlCommand(sqlQ, connection, updateTransaction)
    Dim result = sqlCommand.ExecuteNonQuery()

    'Email COnfirmation
    SendEmail(My.Settings.emailUsers, "EMAIL TEXT")
    If (result > 0) Then
      'Move the file
      fFile.MoveTo(processedDir & fFile.Name)
      updateTransaction.Commit() ' make sure to commit only in case moving the file is OK
    Else
      log("ERROR - Betacell '" & betacell & "' not found in database!")
      updateTransaction.Rollback()
    End If
4

1 に答える 1

3

フォルダをポーリングする (つまり、n新しいファイルがあるかどうかを毎秒チェックする) よりも、オペレーティング システムにそのフォルダの変更を通知させる方がはるかに効率的です。これを行うには、 FileSystemWatcherを作成します。MSDN に例があります。

ただし、フォルダーをポーリングしたい場合は、実際には簡単で、次のコードをTimerにラップするだけです。私は通常 C# でコーディングしているので、構文が 100% でな​​い場合は申し訳ありません...

Imports System.IO

....

For Each file as String in Directory.GetFiles("C:\SomeFolder")
    DoSomethingWithFile (file)
Next
于 2012-11-23T10:17:45.270 に答える