使用c#,如何在Windows Vista 72008中复制符号链接

使用c#,如何在Windows Vista 72008中复制符号链接,c#,.net-3.5,symlink,C#,.net 3.5,Symlink,使用c#,如何在WindowsVista 72008中复制符号链接 当我使用File.Copy复制符号链接时,它的目标会被复制 我希望模仿使用xcopy和/B选项时的行为 使用.NET 3.5是否可能做到这一点?在.NET framework中没有用于链接(既没有硬链接,也没有软链接或符号链接)的API 您必须使用进程调用。启动并创建所需的链接, 或者你可以找一个第三方的图书馆来做这些事情。你可以利用并打电话。请注意您正在查找的COPY\u FILE\u COPY\u SYMLINK。您可以使用

使用c#,如何在WindowsVista 72008中复制符号链接

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

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

使用.NET 3.5是否可能做到这一点?

在.NET framework中没有用于链接(既没有硬链接,也没有软链接或符号链接)的API

您必须使用
进程调用。启动
并创建所需的链接,

或者你可以找一个第三方的图书馆来做这些事情。

你可以利用并打电话。请注意您正在查找的
COPY\u FILE\u COPY\u SYMLINK

您可以使用Win32
CopyFileEx
功能来执行此操作。这需要一些努力,但这里是整个
CopyFileEx
helper类(C#3.0和.NET 3.5客户端配置文件兼容并经过测试!)。您还可以将其重新用于您拥有的任何其他
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);
  }
下面是一些示例代码,演示如何使用它复制符号链接(而不是它引用的文件):

  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);   
  }