【问题标题】:VB.Net - "My.Computer.FileSystem.CopyDirectory" Does Not Copy Directory or Permissions of Directories Inside Target DirectoryVB.Net - “My.Computer.FileSystem.CopyDirectory”不复制目标目录内的目录或目录权限
【发布时间】:2015-05-29 20:06:39
【问题描述】:

我试图在我的标题中尽可能地具有描述性,但为了澄清我有一个 VB.Net 应用程序,我正在尝试将一个目录复制到另一台具有文件权限和所有子文件/文件夹的机器上。

使用“My.Computer.FileSystem.CopyDirectory”,选择要复制的目录不会像 MSDN 所暗示的那样被复制;而是将目录的内容复制到目标目录。如果该目录中有文件夹,则复制该文件夹,但该文件夹的权限不是。这两件事都构成了一个巨大的问题,因为必须将原始文件夹的权限以及原始文件夹中的任何其他文件夹与它一起复制。这可以使用 PowerShell,是否可以使用 VB.Net?

提前致谢。

For Each item As String In stations
            copyTo = stations([i].ToString)

            If IsHostAvailable(copyTo) Then
                LogBreak()
                LogOutput(TimeStamp() + ": " + copyTo + " available. Beginning file push...")
                copyTo = "\\"
                copyTo = Path.Combine(copyTo, stations([i].ToString))
                copyToLoc1 = copyTo.ToString
                copyToLoc1 = Path.Combine(copyTo, pushLocationBox1.ToString.Remove(0, 36))

                LogBreak()
                LogOutput(TimeStamp() + ": " + "Coyping- " + "\n" + pushFrom1 + "\n" + "...to station '" + copyTo + "'.")

                If (File.Exists(pushFrom1) AndAlso (System.IO.Directory.Exists(copyToLoc1))) Then
                    Dim pushFileName As String = Path.GetFileName(pushFrom1)
                    My.Computer.FileSystem.CopyFile(pushFrom1, Path.Combine(copyToLoc1, pushFileName), True)
                    LogOutput(TimeStamp() + ": " + "File 1 copied.")
                ElseIf (File.Exists(pushFrom1) AndAlso (System.IO.Directory.Exists(copyToLoc1) = False)) Then
                    Directory.CreateDirectory(copyToLoc1)
                    LogOutput(TimeStamp() + ": " + "Directory created.")
                    My.Computer.FileSystem.CopyFile(pushFrom1, copyToLoc1, True)
                    LogOutput(TimeStamp() + ": " + "File 1 copied.")
                ElseIf (Directory.Exists(pushFrom1)) Then
                    My.Computer.FileSystem.CopyDirectory(pushFrom1, copyToLoc1, True)
                    Dim srcPerms As New FileInfo(pushFrom1)
                    Dim destPerms As New FileInfo(Path.Combine(copyToLoc1, pushFrom1))
                    Dim permissions As FileSecurity = srcPerms.GetAccessControl()
                    permissions.SetAccessRuleProtection(True, True)
                    destPerms.SetAccessControl(permissions)
                    LogOutput(TimeStamp() + ": " + "Directory 1 copied.")
                Else
                    LogOutput(TimeStamp() + ": " + "The file or directory selected to be copied can no longer be found. (#1)")
                    MsgBox("The file or directory selected to be copied can no longer be found. (#1)", MsgBoxStyle.Critical, "Error!")
                End If
            Else
                LogOutput(TimeStamp() + ": " + "Ping request timed out on " + copyTo + ". Moving to next station...")
                FailOutput(copyTo)
            End If
            i += 1
        Next

【问题讨论】:

  • 从我记得的最后一次开始,权限永远不会被复制,这是正确的,因为目标文件夹上可能存在不同的 FS(文件系统)。您可能需要采取额外的步骤并复制安全权限并在需要时应用它们。还请发布第一个问题的相关代码 - 没有这个,我们看不到你做错了什么。
  • 有趣。添加了我正在使用的复制功能的片段。我首先检查要复制的选定对象是文件还是文件夹......权限太糟糕了。 PowerShell 的“复制项”对于复制目录的权限完全没有疑虑,它也不关心它是文件还是目录!为什么 MS 允许使用一种语言而不是另一种语言?
  • Powershell 不是一种语言...。它的功能与代码编写不同...Powershell 是一种管理类型的工具,其用途与手动编码不同。回到最初的问题,只需这样做即可:msdn.microsoft.com/en-us/library/bb762914(v=vs.110).aspx
  • 如果无法使用 VB.Net 执行此操作,是否有一种谨慎的方法可以将 PowerShell 脚本添加到程序中?我猜不是因为要执行 PS 脚本,您必须先设置执行策略...
  • Copy-Item 不是运算符或语言结构,它是一个 cmdlet,即一个程序。当您要求操作系统进行复制时,它不会复制权限。当你移动时会发生什么更有趣(Moving a file does not recalculate inherited permissionsWait, so does moving a file recalculate inherited permissions or doesn't it?)。如果您不喜欢这种默认行为,您可以自己复制权限。

标签: vb.net user-permissions file-copying


【解决方案1】:

我认为copyToLoc1中的目录路径不正确,我测试了下面的代码,它可以工作。

My.Computer.FileSystem.CopyDirectory("E:\Users\test1\Desktop\test", "E:\Users\test1\Desktop\test2", True)

您的程序可能没有正确地将信息存储到 copyToLoc1 以进行调试并查看是否是这种情况

注释掉这段代码

'My.Computer.FileSystem.CopyDirectory(pushFrom1, copyToLoc1, True)

添加以下代码

MsgBox(copyToLoc1)

您会收到一条包含您尝试创建的新目录的消息。

查看您尝试创建的目录是否正确。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-25
    • 1970-01-01
    • 2022-10-20
    • 2020-01-27
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 2012-07-24
    相关资源
    最近更新 更多