2010-11-03 51 views

回答

3

您可以使用Win32 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); 
    } 

下面是一些示例代码,演示了如何用它来复制一个符号链接(而不是它是指该文件):

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

.NET框架中没有用于链接(既不是硬链接,也不是软链接或符号链接)的API。

必须要么调用mklink.exeProcess.Start,创造你想要的链接, 或者你有一个找一个第三方库,它能够做这样的事情。

1

您可以使用pinvoke并致电CopyFileEx。请注意0​​这是你正在寻找的。