我正在开发一个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
我正在尝试复制整个目录结构,子目录完好无损。我的第一次尝试将所有文件转储到一个目录中。
答案 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
课程。