Vb.net VB将文件从USB复制到FTP,无需整个根目录
请有人能帮我一个项目,我们正在工作。 我们使用HMI将数据记录到直接连接到HMI的USB驱动器。我们的客户需要通过FTP访问这些文件。HMI有一个可以访问的FTP区域,但是没有在不同位置之间复制这些文件夹的直接方法。 我可以在后台运行一些VB脚本,并从PLC触发子程序 我对VB脚本一无所知,我正努力让它正常工作 此代码仅在包含日期时有效:Vb.net VB将文件从USB复制到FTP,无需整个根目录,vb.net,file,ftp,copy,usb,Vb.net,File,Ftp,Copy,Usb,请有人能帮我一个项目,我们正在工作。 我们使用HMI将数据记录到直接连接到HMI的USB驱动器。我们的客户需要通过FTP访问这些文件。HMI有一个可以访问的FTP区域,但是没有在不同位置之间复制这些文件夹的直接方法。 我可以在后台运行一些VB脚本,并从PLC触发子程序 我对VB脚本一无所知,我正努力让它正常工作 此代码仅在包含日期时有效:IO.DirectoryInfo(“\UsbDisk\Data Logging\Log Files\DataSet0\yyyymmdd”) 每晚午夜都会创建一个
IO.DirectoryInfo(“\UsbDisk\Data Logging\Log Files\DataSet0\yyyymmdd”)
每晚午夜都会创建一个带有新日期的新文件夹,因此固定日期只适用于当天。理想情况下,我希望副本复制“UsbDisk\Data Logging\Log Files”中的所有内容,忽略“DataSet0\yyyymmdd”
提前谢谢
Sub Test
Dim di As New IO.DirectoryInfo("\UsbDisk\Data Logging\Log Files\DataSet0\20191126")
Dim Diar1 As IO.FileInfo() = di.GetFiles()
Dim dra As IO.FileInfo
For Each dra In Diar1
System.IO.File.Copy(dra.FullName, "\User\SysmacHMI\FTP\" + dra.Name,True)
Next
End Sub
您编写“VB脚本”,但显示VB.NET程序中的代码,因此我将使用后者。()
可以迭代所有子目录并从中获取文件,对中显示的代码稍加修改(实际上没有使用递归方法)就足够了
例如,这是一个完整的VB.NET控制台应用程序,它使用:
Option Infer On
Option Strict On
Imports System.IO
Module Module1
''' <summary>
''' Get the full filenames of the files in the given directory and its subdirectories.
''' Errors are ignored.
''' </summary>
''' <param name="path">Initial directory.</param>
''' <returns>A List(Of String) of the full filenames.</returns>
Public Function GetAllFiles(ByVal path As String) As List(Of String)
' Adapted from https://stackoverflow.com/questions/44103640/recursive-file-search-in-vb-net
Dim files As New List(Of String)
Dim dirs As New Stack(Of String)
dirs.Push(path)
Do While (dirs.Count > 0)
Dim currentDir = dirs.Pop()
Try
files.AddRange(Directory.EnumerateFiles(currentDir))
For Each d In Directory.EnumerateDirectories(currentDir)
dirs.Push(d)
Next
Catch ex As Exception
' Could have been a permissions problem. Ignore it.
End Try
Loop
Return files
End Function
Sub Test()
'TODO: Make sure these are the correct absolute paths:
Dim rootDir = "\UsbDisk\Data Logging\Log Files"
Dim destDir = "\User\SysmacHMI\FTP"
Dim allTheFiles = GetAllFiles(rootDir)
For Each f In allTheFiles
Dim newName = Path.Combine(destDir, Path.GetFileName(f))
Console.WriteLine("Copy " & f & " to " & newName)
' Uncomment the File.Copy line to make it actually do the copy.
' File.Copy(f, newName, True)
Next
End Sub
Sub Main()
Test()
Console.ReadLine()
End Sub
End Module
选项推断打开
选项严格限制在
导入System.IO
模块1
'''
''获取给定目录及其子目录中文件的完整文件名。
''错误被忽略。
'''
''初始目录。
''完整文件名的列表(字符串)。
公共函数GetAllFiles(ByVal路径作为字符串)作为列表(字符串)
"改编自https://stackoverflow.com/questions/44103640/recursive-file-search-in-vb-net
将文件变暗为新列表(字符串)
Dim dirs作为新堆栈(字符串)
直接推力(路径)
执行时(dirs.Count>0)
Dim currentDir=dirs.Pop()
尝试
files.AddRange(Directory.EnumerateFiles(currentDir))
对于目录中的每个目录。枚举目录(currentDir)
直接推力(d)
下一个
特例
'可能是权限问题。别理它。
结束尝试
环
返回文件
端函数
子测试()
'TODO:确保这些是正确的绝对路径:
Dim rootDir=“\UsbDisk\Data Logging\Log Files”
Dim destDir=“\User\SysmacHMI\FTP”
Dim allTheFiles=GetAllFiles(rootDir)
对于所有文件中的每个f
Dim newName=Path.Combine(destDir,Path.GetFileName(f))
Console.WriteLine(“复制”&f&“到”&newName)
'取消对File.Copy行的注释,使其实际执行复制。
'File.Copy(f,newName,True)
下一个
端接头
副标题()
测试()
Console.ReadLine()
端接头
端模块
如果它抱怨
EnumerateFiles
和EnumerateDirectories
,则使用GetFiles
和GetDirectories
检查我的理解,是否要将“DataSet0”目录下找到的每个文件复制到“\User\SysmacHMI\FTP\”中?或者“数据集0”中的“0”也可以更改吗?我想您希望Dim di作为新的IO.DirectoryInfo(“\UsbDisk\Data Logging\Log Files”)
和Dim Diar1作为IO.FileInfo()=di.GetFiles(“*”,SearchOption.AllDirectories)
。谢谢您的输入。我不确定这是否是由于HMI上运行的脚本造成的,但是SearchOption.AllDirectories没有编译。Dim Diar1作为IO.FileInfo()=di.GetFiles(“.”SearchOption.AllDirectories)您可以使用问题中的代码。顺便说一句,HMI代表什么?它使用的是哪个版本的.NET Framework?HMI(人机界面)我是一名控制工程师,只懂逻辑编程(梯形图逻辑/结构化文本)VB不是我必须使用的东西。直到现在:/我很感激你的链接,但对我来说没有任何意义。我也不知道如何找到使用了哪个版本的.NET Framework。