2016-10-18 4 views
0

私はディレクトリを作成する次のコードを持っています。タスクはレコード数を受け取り、レコード数が必要な数、たとえば1000レコードに達するたびに新しいディレクトリが作成されます。タスクがもう一度実行されると、既存のディレクトリに1000レコードが追加されます。既存のディレクトリをスキップして新しいディレクトリを作成します。私は様々なifexistsを追加しようとしましたが、すべての時間を台無しにしました、どんな助けも認められるでしょうディレクトリがVB.NETコードに存在する場合

Public Sub Main() 

    Dim SourceDirectory As String = "E:\Data" 
    Dim TargetDirectory As String = "E:\CN" 
    Dim FileExtensionsToProcess As String = "CON*.pdf" 
    Dim FileCounter As Integer = 0 
    Dim FolderName As Integer = 1 
    Dim recordcount As Integer 
    recordcount = CInt(Dts.Variables("RecordCount").Value) 

    For Each FileName As String In System.IO.Directory.GetFiles(SourceDirectory, FileExtensionsToProcess) 
     Dim FileOnly As String = System.IO.Path.GetFileName(FileName) 
     Try 
      If Not IO.Directory.Exists(IO.Path.Combine(TargetDirectory, FolderName.ToString())) Then 
       IO.Directory.CreateDirectory(IO.Path.Combine(TargetDirectory, FolderName.ToString())) 
      End If 
      IO.File.Move(FileName, IO.Path.Combine(TargetDirectory, IO.Path.Combine(FolderName.ToString(), FileOnly))) 
     Catch 
     End Try 
     FileCounter += 1 
     If (FileCounter Mod recordcount) = 0 Then 
      FolderName += 1 
     End If 
    Next 
    Dts.TaskResult = ScriptResults.Success 
End Sub 
+0

'recordcount'をハードコードされた小さな番号に設定します。 5、 'try ... catch'で可能な例外を飲み込まず、' for each'ループにブレークポイントを設定し、カウンタ変数とif文をチェックし、コードをデバッグしてエラーを修正します。 –

+0

目的のディレクトリが存在するかどうかをチェックします。ただし、ファイルの数を数えてから、ファイルを移動してください。 –

答えて

0

いいえ。完全な解決策を以下に示します。次に、いくつか説明します。

Public Sub Main() 
    Dim SourceDirectory As String = "E:\Data" 
    Dim TargetDirectory As String = "E:\CN" 
    Dim FileExtensionsToProcess As String = "CON*.pdf" 
    Dim FileCounter As Integer = 0 
    Dim FolderName As Integer = 1 
    Dim recordcount As Integer = CInt(Dts.Variables("RecordCount").Value) 

    Dim targetDir As String = SetOutputFolder(TargetDirectory, FolderName, recordcount) 

    For Each FileName As String In Directory.GetFiles(SourceDirectory, FileExtensionsToProcess) 
     Dim FileOnly As String = Path.GetFileName(FileName) 

     'Try - Leave this out to observe any exceptions, then add handling when you see any 
     ' Check for file name conflicts before moving 
     File.Move(FileName, Path.Combine(targetDir, FileOnly)) 

     'Catch 
     'End Try 
     FileCounter += 1 
     If FileCounter >= recordcount Then 
      FolderName += 1 
      targetDir = SetOutputFolder(TargetDirectory, FolderName, recordcount) 
      FileCounter = Directory.GetFiles(targetDir).Count 
     End If 
    Next 
End Sub 

Private Function SetOutputFolder(baseDir As String, ByRef folderName As Integer, ByRef recordCount As Integer) As String 
    Dim targetDir = Path.Combine(baseDir, folderName.ToString()) 
    Dim filecounter = 0 

    While Directory.Exists(targetDir) 
     filecounter = Directory.GetFiles(targetDir).Count 
     If filecounter >= recordCount Then 
      folderName += 1 
      targetDir = Path.Combine(baseDir, folderName.ToString()) 
     Else 
      Exit While 
     End If 
    End While 

    If Not Directory.Exists(targetDir) Then 
     Directory.CreateDirectory(targetDir) 
    End If 

    Return targetDir 
End Function 

私が作成した追加の機能は、いくつかの問題を解決します。フォルダカウンタとレコード数を参照番号ByRef folderName As Integer, ByRef recordCount As Integerとして渡しているので、正しいディレクトリを取得した後に正しい値を続けることができます。 1から始まるターゲットディレクトリを検索し、ディレクトリごとにフルであるかどうかをチェックします。そうであれば、そのディレクトリを選択します。

ディレクトリ内に存在するかどうかをチェックし、存在しない場合は終了前に作成し、必要な追加のIf文を削除して1か所に配置します。

+0

それは完璧に働いてくれてありがとう – user5367782

+0

私は助けることができてうれしい –

関連する問題