मैं कुछ source code for symlinks posted on my blog है कि आप के लिए अनुमति देगा है:
- सिमलिंक
- जांच एक रास्ता एक सिमलिंक
- एक सिमलिंक का लक्ष्य पुनः प्राप्त है या नहीं बनाने
यह भी होता है एनयूनीट टेस्ट केस, जिन्हें आप विस्तारित करना चाहते हैं।
भावपूर्ण सा है:
private static SafeFileHandle getFileHandle(string path)
{
return CreateFile(path, genericReadAccess, shareModeAll, IntPtr.Zero, openExisting,
fileFlagsForOpenReparsePointAndBackupSemantics, IntPtr.Zero);
}
public static string GetTarget(string path)
{
SymbolicLinkReparseData reparseDataBuffer;
using (SafeFileHandle fileHandle = getFileHandle(path))
{
if (fileHandle.IsInvalid)
{
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
int outBufferSize = Marshal.SizeOf(typeof(SymbolicLinkReparseData));
IntPtr outBuffer = IntPtr.Zero;
try
{
outBuffer = Marshal.AllocHGlobal(outBufferSize);
int bytesReturned;
bool success = DeviceIoControl(
fileHandle.DangerousGetHandle(), ioctlCommandGetReparsePoint, IntPtr.Zero, 0,
outBuffer, outBufferSize, out bytesReturned, IntPtr.Zero);
fileHandle.Close();
if (!success)
{
if (((uint)Marshal.GetHRForLastWin32Error()) == pathNotAReparsePointError)
{
return null;
}
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
}
reparseDataBuffer = (SymbolicLinkReparseData)Marshal.PtrToStructure(
outBuffer, typeof(SymbolicLinkReparseData));
}
finally
{
Marshal.FreeHGlobal(outBuffer);
}
}
if (reparseDataBuffer.ReparseTag != symLinkTag)
{
return null;
}
string target = Encoding.Unicode.GetString(reparseDataBuffer.PathBuffer,
reparseDataBuffer.PrintNameOffset, reparseDataBuffer.PrintNameLength);
return target;
}
है:
स्रोत
2012-03-27 03:02:49
यदि यह संभव है, तो क्या आप यहां पूरा कोड पेस्ट कॉपी कर सकते हैं, ब्लॉन्ग में जाने की आवश्यकता है, अन्यथा संकलित नहीं होगा? – TarmoPikaro
यह कोड अब एक [NuGet पैकेज] है (https://www.nuget.org/packages/SymbolicLinkSupport/) और [गिटहब पर है] (https://github.com/michaelmelancon/symboliclinksupport)। –