VB.NET迭代文件和目录

时间:2010-02-15 14:31:07

标签: vb.net filesystems

我正在开发一个VB.NET程序,它会自动将我的工作备份到我的FTP服务器上。到目前为止,我可以通过使用以下方法指定文件名来上传单个文件:

     'relevant part - above is where FTP object is instantiated
       Dim _FileStream As System.IO.FileStream = _FileInfo.OpenRead()

            Try
                'Stream to which the file to be upload is written
                Dim _Stream As System.IO.Stream = _FtpWebRequest.GetRequestStream()

                'Read from the file stream 2kb at a time
                Dim contentLen As Integer = _FileStream.Read(buff, 0, buffLength)

                'Till Stream content ends
                Do While contentLen <> 0
                    ' Write Content from the file stream to the FTP Upload Stream
                    _Stream.Write(buff, 0, contentLen)
                    contentLen = _FileStream.Read(buff, 0, buffLength)
                Loop
                _Stream.Close()
                _Stream.Dispose()
                _FileStream.Close()
                _FileStream.Dispose()

                ' Close the file stream and the Request Stream


            Catch ex As Exception
                MessageBox.Show(ex.Message, "Upload Error", MessageBoxButtons.OK, MessageBoxIcon.Error)
            End Try

现在我希望能够遍历目录(包含子目录)并递归调用上面的函数。我在获取目录中的文件时遇到了问题。

我的问题是,如何循环并将每个文件发送到上面的上传功能?我可以将文件名发送到数组,还是有某种系统对象来处理这个问题(例如System.IO.Directory)

我正在尝试做的伪代码

                For Each Sub_directory In Source_directory

                     For Each File in Directory
                       'call the above code to transfer the file
                     Next

                'start next subdirectory
                Next

我正在尝试复制整个目录结构,子目录完好无损。我的第一次尝试将所有文​​件转储到一个目录中。

3 个答案:

答案 0 :(得分:8)

你可以使用这样的递归遍历每个目录和文件:

Public Shared Sub ForEachFileAndFolder(ByVal sourceFolder As String, _
                                       ByVal directoryCallBack As Action(Of DirectoryInfo), _
                                       ByVal fileCallBack As Action(Of FileInfo))

    If Directory.Exists(sourceFolder) Then
        Try
            For Each foldername As String In Directory.GetDirectories(sourceFolder)
                If directoryCallBack IsNot Nothing Then
                    directoryCallBack.Invoke(New DirectoryInfo(foldername))
                End If

                ForEachFileAndFolder(foldername, directoryCallBack, fileCallBack)
            Next
        Catch ex As UnauthorizedAccessException
            Trace.TraceWarning(ex.Message)
        End Try

        If fileCallBack IsNot Nothing
            For Each filename As String In Directory.GetFiles(sourceFolder)
                fileCallBack.Invoke(New FileInfo(filename))
            Next
        End If
    End If
End Sub

编辑:代表的用法:

ForEachFileAndFolder("yourPath", AddressOf dirAction, Addressof fileAction)

Public Sub dirAction(Byval dirInfo As DirectoryInfo)
    ' do something here '
End Sub

FileAction也一样。

答案 1 :(得分:2)

你必须分开处理目录和文件,但它仍然很简单。

System.IO.DirectoryInfo保存指定目录中的列表文件和子目录。查找属性目录和文件。

您要做的是指定一个首先读取所有文件的函数,然后指定DirectoryInfo中的目录。对于文件,你可以用你想做的事情(我认为上传),一旦你点击目录,使用子目录作为参数来递归调用你的函数。这将是所有子目录和文件。

伪代码(我称之为伪代码cos'我不知道确切的语法)


Sub UploadDirectory(oDirInfo as DirectoryInfo)

   For eaco oFile as FileInfo in oDirINfo.Files
     'Do your thing
   Next

   For each oDir as DirectoryInfo as oDirInfo.Directories
     ' Do some stuff if you need to separate directories
     UploadDirectory(odir)
End sub

希望有所帮助。

答案 2 :(得分:0)

查看DirectoryInfo课程。