【问题标题】:renaming and moving files in vb.net在 vb.net 中重命名和移动文件
【发布时间】:2013-03-29 05:11:37
【问题描述】:

我正在尝试将字符串“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 添加到每个文件的名称中,并且文件也被移动到文件夹 B。但是,在第二次运行时,它会发送一条错误消息:

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

我可以看到文件 20130327082003.pdf 已经移动到文件夹 B,新名称为 20130327082003XYZ.pdf,这很好,但服务会不断检查文件夹 A 中的相同文件名。

我也尝试过重命名、移动、复制、复制到所有这些命令,但系统不会检查文件夹 A 中的新文件(如果有的话),而是继续检查已移动到文件夹 B 的文件。不知何故,循环不断引用它已重命名(并且已经移动)到文件夹 B 的最后一个文件。

我正在使用.Delete 方法将文件(或任何引用)复制到文件夹B 后删除,但这似乎没有任何区别。

一旦服务将运行,最终假设将文件夹 A 中生成的每个新文件(在其名称中添加 XYZ 后)移动到文件夹 B。

任何帮助将不胜感激。 谢谢。

【问题讨论】:

  • 如果你要检查文件是否存在并且它是否包含一个字符串,你不应该在检查名称是否包含字符串之前检查它是否存在吗?
  • 您可能正在移动文件修改它的过程完成之前。您需要使用 FileShare.None 获得对文件的独占锁定。一开始会失败。请稍后再试。

标签: vb.net


【解决方案1】:

您有两个循环,一个在另一个,外部循环 (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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多