使用c#,如何複製Windows Vista,7,2008中的符號鏈接。使用c#,如何複製Windows Vista中的符號鏈接,7,2008
當我使用File.Copy來複制符號鏈接時,它的目標被複制。
我希望模仿在使用xcopy和/ B選項時得到的行爲。
這可能使用.NET 3.5嗎?
使用c#,如何複製Windows Vista,7,2008中的符號鏈接。使用c#,如何複製Windows Vista中的符號鏈接,7,2008
當我使用File.Copy來複制符號鏈接時,它的目標被複制。
我希望模仿在使用xcopy和/ B選項時得到的行爲。
這可能使用.NET 3.5嗎?
您可以使用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);
}
.NET框架中沒有用於鏈接(既不是硬鏈接,也不是軟鏈接或符號鏈接)的API。
必須要麼調用mklink.exe
與Process.Start
,創造你想要的鏈接, 或者你有一個找一個第三方庫,它能夠做這樣的事情。
您可以使用pinvoke並致電CopyFileEx。請注意0這是你正在尋找的。