c# - 使用 C#,如何在 Windows Vista,7,2008 中复制符号链接(symbolic link)

标签 c# .net-3.5 symlink

使用c#,如何在Windows Vista,7,2008中复制符号链接(symbolic link)。

当我使用 File.Copy 复制符号链接(symbolic link)时,它的目标会被复制。

我希望模仿使用带有/B 选项的 xcopy 时的行为。

这可以使用 .NET 3.5 实现吗?

最佳答案

您可以使用 Win32 CopyFileEx 函数来执行此操作。这需要一些努力,但这里是整个 CopyFileEx 帮助程序类(C# 3.0 和 .NET 3.5 Client Profile 兼容并经过测试!)。您还可以将其重复用于您拥有的任何其他 CopyFileEx 任务:

  using System;
  using System.ComponentModel;
  using System.Runtime.InteropServices;

  public static class CopyHelper
  {
    [Flags]
    public enum CopyFileFlags : uint
    {
        COPY_FILE_FAIL_IF_EXISTS              = 0x00000001,
        COPY_FILE_RESTARTABLE                 = 0x00000002,
        COPY_FILE_OPEN_SOURCE_FOR_WRITE       = 0x00000004,
        COPY_FILE_ALLOW_DECRYPTED_DESTINATION = 0x00000008,
        COPY_FILE_COPY_SYMLINK                = 0x00000800 //NT 6.0+
    }

    public enum CopyProgressResult : uint
    {
        PROGRESS_CONTINUE = 0,
        PROGRESS_CANCEL   = 1,
        PROGRESS_STOP     = 2,
        PROGRESS_QUIET    = 3
    }

    public enum CopyProgressCallbackReason : uint
    {
        CALLBACK_CHUNK_FINISHED = 0x00000000,
        CALLBACK_STREAM_SWITCH  = 0x00000001
    }

    public delegate CopyProgressResult CopyProgressRoutine(
        long TotalFileSize,
        long TotalBytesTransferred,
        long StreamSize,
        long StreamBytesTransferred,
        uint dwStreamNumber,
        CopyProgressCallbackReason dwCallbackReason,
        IntPtr hSourceFile,
        IntPtr hDestinationFile,
        IntPtr lpData);

    [DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]   
    [return: MarshalAs(UnmanagedType.Bool)]   
    public static extern bool CopyFileEx(string lpExistingFileName, 
        string lpNewFileName, CopyProgressRoutine lpProgressRoutine, 
        IntPtr lpData, ref bool pbCancel, CopyFileFlags dwCopyFlags);
  }

下面是一些示例代码,展示了如何使用它来复制符号链接(symbolic link)(而不是它引用的文件):

  string srcLink = @"c:\l.txt"; // Sample source soft link
  string destFile = @"d:\l.txt"; // Sample destination soft link
  bool bCancel = false; 
  bool bSuccess = CopyHelper.CopyFileEx(srcLink, destFile,
                    null, IntPtr.Zero, ref bCancel, 
                    CopyHelper.CopyFileFlags.COPY_FILE_COPY_SYMLINK);   
  if (!bSuccess)   
  {   
      int error = Marshal.GetLastWin32Error();   
      throw new Win32Exception(error);   
  }  

关于c# - 使用 C#,如何在 Windows Vista,7,2008 中复制符号链接(symbolic link),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4090182/

相关文章:

c# - 使用 Identity 将新表添加到 ASP .NET Core MVC 应用程序中

c# - 从 Visual Studio 2005 迁移到 2008 和 .NET 2.0

c# - 是否有基于 C# 的网络浏览器?

c# - 给定总分区数和分区数对列表进行分区

c# - 您将如何构建 HttpTraceListener?

symlink - 如果循环符号链接(symbolic link)没有用,那么为什么允许它们呢?

git - 为什么可以将符号链接(symbolic link)提交给 git?

Jenkins 符号链接(symbolic link)/永久链接在重新启动后损坏

c# - C# 程序如何使用任何版本的 C++ dll?

c# - EF DbSet.Find 抛出 InvalidOperationException