0

各ファイル名に文字列「XYZ」を追加してから、ファイルをフォルダーAからフォルダーBに移動しようとしています。これは私がこれまでに持っているコードです。


Private Const varSourceAddress As String = "\\serverA\drivename\FolderA\"
Dim diaddr As New DirectoryInfo(varSourceAddress)
Dim fiaddr As FileInfo() = diaddr.GetFiles()

While diaddr.GetFiles.Length > 0
  For Each scannedFile As FileInfo In fiaddr
    If scannedFile.Name.Contains("Thumbs") = False Then
      If scannedFile.Exists Then
         strOldName = scannedFile.Name
         strNewName = strOldName.Insert(14, "XYZ")
         scannedFile.CopyTo("\\serverA\drivename\FolderB\" & strNewName, True)
         scannedFile.Delete()

         strOldName = ""
         strNewName = ""

      End If
     End If
    Next
  End While

このコードを Windows サービスで使用しています。サービスが初めて実行されると、すべてが想定どおりに行われます。すべてのファイルの名前に XYZ が追加され、ファイルは folderB にも移動されます。ただし、2 回目の実行時に、エラー メッセージが送信されます。

System.IO.FileNotFoundException: Could not find file '\\serverA\drivename\folderA\20130327082003.pdf'.

ファイル20130327082003.pdfはすでに新しい名前の folderB に移動されていることがわかります。それで問題ありません20130327082003XYZ.pdfが、サービスは folderA で同じファイル名をチェックし続けます。

これらすべてのコマンドの名前変更、移動、コピー、コピーも試しましたが、フォルダーAに新しいファイルがある場合はチェックする代わりに、システムはフォルダーBに既に移動されているファイルをチェックし続けます。どういうわけか、ループは、名前を変更した(そしてすでに移動した)最後のファイルをfolderBに参照し続けます。

folderBにコピーされたファイル(または任意の参照)を削除する方法を使用.Deleteしていますが、違いはないようです。

サービスが実行されると、最終的には、folderA で生成されたすべての新しいファイル (名前に XYZ を追加した後) を folderB に移動することになります。

どんな助けでも大歓迎です。ありがとうございました。

4

1 に答える 1

0

外部ループ (while) は、GetFiles() によって返されるファイルがなくなるまで続きますが、内部ループではfiaddr 、ループの外側で取得した変数を使用します。

必要以上にループしていると思います

Private Const varSourceAddress As String = "\\serverA\drivename\FolderA\"
Dim diaddr As New DirectoryInfo(varSourceAddress)
Dim fiaddr As FileInfo() = diaddr.GetFiles()

For Each scannedFile As FileInfo In fiaddr
    If scannedFile.Exists Then ' not sure it is necessary unless someone adds files externally
        If scannedFile.Name.Contains("Thumbs") = False Then
            strOldName = scannedFile.Name
            strNewName = strOldName.Insert(14, "XYZ")
            scannedFile.CopyTo("\\serverA\drivename\FolderB\" & strNewName, True)
            scannedFile.Delete()
            strOldName = ""
            strNewName = ""
        End If
    End If
 Next
于 2013-03-28T21:08:23.867 に答える