【问题标题】:Creating directory from filename then moving file into that directory从文件名创建目录,然后将文件移动到该目录
【发布时间】:2015-05-21 13:43:28
【问题描述】:

我有一种情况,我有多个以 YearMonthDate 约定格式命名的文件,我想移动到基于月份的目录中,然后移动到基于文件名中列出的日期的子目录中。在帮助下,我得出了以下结论:

Public Class Form1
    Function MakeDirectoryPath(rootFolder As String, fileName As String) As String
        Dim monthDirectory As String = DateAndTime.MonthName(Asc(fileName(2)) - 96) 
        Dim dayDirectory As String = fileName.Substring(3, 2)                       
        Return IO.Path.Combine(rootFolder, monthDirectory, dayDirectory)            
    End Function

    Sub CreateDirectory(rootSource As String, rootDestination As String)

        For Each s As String In IO.Directory.GetFiles(rootSource)                   
            Dim fileName As String = IO.Path.GetFileName(s)                         
            Dim destinationDirectory As String = MakeDirectoryPath(rootDestination, fileName)  

            If Not IO.Directory.Exists(destinationDirectory) Then
                IO.Directory.CreateDirectory(destinationDirectory)
            End If
            **IO.File.Move(s, destinationDirectory)**
        Next

    End Sub
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        CreateDirectory(".....", "......")   
    End Sub
End Class

函数从文件名中提取我想要的内容,Sub CreateDirectory 创建我的月份目录,然后创建我的子目录。我遇到的问题是将实际文件移动到他们尊重的目录中。

简单地放下 IO.File.Move(destinationDirectory) 由于目录已经存在,在 For Each 循环中会产生一个异常,并且我对 IO.File.Copy() 的运气没有更好。

我们将不胜感激。

【问题讨论】:

  • File.Move 有什么异常?您真的要移动它,还是只是创建一个副本?
  • io.file.move 需要两个参数——源文件名和目标文件名。因此,请将 IO.File.Move 行放在您想要的代码中,按照您认为需要的方式,然后我们可能会告诉您哪里出了问题。
  • 在原始帖子的代码中添加了“IO.File.Move(s,destinationDirectory)”。我从中得到的异常是与“当该文件已存在时无法创建文件”相关的 System.IO.IOException。很可能是因为 IO.File.Move 正在尝试重新创建目录。我也希望移动文件,但正在考虑使用 IO.File.Copy 和 IO.File.Delete 作为解决我遇到的这个问题的草率方法。

标签: vb.net


【解决方案1】:

.Move 采用路径和文件名。在您的示例中,目标只是一个路径,您必须添加文件名。

IO.File.Move(s, IO.Path.Combine(destinationDirectory, fileName))

【讨论】:

  • 另外,我不确定在将文件移出该目录时直接迭代GetFiles 是否是个好主意。我建议迭代一个从GetFiles 方法获取值的字符串数组变量。
  • @ZoharPeled GetFiles 确实返回了一个数组。在 VB 中,GetFile 将在循环开始时调用一次(与 C# 不同,后者将在每个循环中调用)。
  • 好吧,你已经把我带到了那里......自从我的 vb.net 时代以来已经有很长一段时间了......搬到了 c#
  • 非常感谢the_lotus。哇,真不敢相信在阅读了十几次移动 API 之后我无法将其放在一起。程序正在做我想做的事。