代码之家  ›  专栏  ›  技术社区  ›  Matt

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

  •  2
  • Matt  · 技术社区  · 14 年前

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

    当我使用file.copy复制符号链接时,它的目标会被复制。

    我希望模仿您在使用xcopy和/b选项时的行为。

    是否可以使用.NET 3.5?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Michael Goldshteyn    14 年前

    您可以使用win32 CopyFileEx 函数执行此操作。虽然花了点力气,但这是全部 copyfileex公司 帮助程序类(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);   
      }  
    
        2
  •  1
  •   codymanix    14 年前

    .NET框架中没有链接(硬链接、软链接或符号链接)的API。

    你要么打电话 mklink.exe 具有 Process.Start 创建你想要的链接, 或者你可以找一个第三方图书馆来做这些事情。

        3
  •  1
  •   Aaron McIver    14 年前

    你可以利用 pinvoke 然后打电话 CopyFileEx . 注意 COPY_FILE_COPY_SYMLINK 这就是你要找的。