【问题标题】:VB Copy File from USB to FTP without whole rootVB 将文件从 USB 复制到 FTP,无需整个根目录
【发布时间】:2020-03-22 19:43:55
【问题描述】:

请有人帮助我完成我们正在进行的项目。 我们使用 HMI 将数据记录到直接连接到 HMI 的 USB 驱动器。我们的客户需要通过 FTP 访问这些文件。 HMI 有一个可以访问的 FTP 区域,但是没有直接的方法可以在不同位置之间复制这些文件夹。 我可以在后台运行一些VB脚本并从PLC触发子程序。

我对 VB 脚本一无所知,我正在努力让它工作。

此代码仅在包含日期时才有效: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

【问题讨论】:

  • 只是为了检查我的理解,您是否要将在“DataSet0”目录下找到的每个文件复制到“\User\SysmacHMI\FTP\”中?还是“DataSet0”中的“0”也可以改变?
  • 我想你想要Dim di As New IO.DirectoryInfo("\UsbDisk\Data Logging\Log Files")Dim Diar1 As IO.FileInfo() = di.GetFiles("*.*", SearchOption.AllDirectories)
  • 感谢您的意见。我不确定这是否是由于在 HMI 上运行的脚本但 SearchOption.AllDirectories 没有编译。 Dim Diar1 As IO.FileInfo() = di.GetFiles("." SearchOption.AllDirectories)
  • 您可以改用问题Recursive File Search in VB.NET 中的代码。顺便问一下,HMI 代表什么,它使用的是哪个版本的 .NET Framework?
  • HMI(人机界面) 我是一名控制工程师,只懂逻辑编程(梯形逻辑/结构化文本) VB 不是我必须使用的东西。直到现在:/我很欣赏你的链接,但对我来说没有任何意义。也不知道如何找出使用的 .NET Framework 版本。

标签: vb.net file ftp copy usb


【解决方案1】:

您编写“VB 脚本”,但显示的代码可能在 VB.NET 程序中,所以我选择后者。 (What is the difference between vbscript and vb.net?)

可以遍历所有子目录并从中获取文件,稍微修改Recursive File Search in 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

如果它抱怨EnumerateFilesEnumerateDirectories,则使用GetFilesGetDirectories

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-18
    • 2017-01-16
    • 1970-01-01
    相关资源
    最近更新 更多