using System;
using System.Runtime.InteropServices;
using System.IO;
namespace mklink
{
class Program
{
[DllImport("kernel32.dll")]
static extern bool CreateSymbolicLink(string lpSymlinkFileName, string lpTargetFileName, int dwFlags);
static int SYMLINK_FLAG_DIRECTORY = 1;
static void Main(string[] args)
{
//
// Symbolic file link bar.txt <<===>> foo.txt
//
string symF = "bar.txt";
string targetF = "foo.txt";
Console.WriteLine(">echo \"Hello World\" > {0}", targetF);
StreamWriter sw = File.CreateText(targetF);
sw.WriteLine("Hello World");
sw.Close();
Console.WriteLine();
Console.WriteLine(">mklink {0} {1}", symF, targetF);
if(CreateSymbolicLink(symF, targetF, 0))
Console.WriteLine("symbolic link created for {0} <<===>> {1}", symF, targetF);
Console.WriteLine();
Console.WriteLine(">type {0}", targetF);
Console.WriteLine(File.ReadAllText(targetF));
Console.WriteLine();
//
// Symbolic directory link bar <<===>> foo
//
string symD = "bar";
string targetD = "foo";
Console.WriteLine(">mkdir {0}", targetD);
Directory.CreateDirectory(targetD);
Console.WriteLine();
Console.WriteLine(">echo \"Hello World\" > {0}\\demo.txt", targetD);
StreamWriter sw2 = File.CreateText(targetD + \\demo.txt);
sw2.WriteLine("Hello World");
sw2.Close();
Console.WriteLine();
Console.WriteLine(">mklink /d {0} {1}", symD, targetD);
if (CreateSymbolicLink(symD, targetD, SYMLINK_FLAG_DIRECTORY))
Console.WriteLine("symbolic link created for {0} <<===>> {1}", symD, targetD);
Console.WriteLine();
Console.WriteLine(">dir {0}", targetD);
foreach (string f in Directory.GetFiles(targetD))
Console.WriteLine(f);
}
}
}
(код взят здесь)
Результатом работы программы будет файл bar.txt ссылающийся на файл foo.txt и папка bar ссылающаяся на папку foo.
а как проверить является ли файл символической ссылкой?
ОтветитьУдалитьЕсли верить этому http://stackoverflow.com/questions/817794/find-out-whether-a-file-is-a-symlink-in-powershell/2255548#2255548 то System.IO.File.GetAttributes для ссылки должна вернуть еще и установленный атрибут ReparsePoint
ОтветитьУдалитьКстати, маленькое дополнение: можно создавать ссылку на сетевую папку, т.е., например, на путь \\othercomputer\share_name\folder и она будет работать, но нельзя использовать путь, который указывает на папку на подмонтированном сетевом диске. Т.е., если x: - это сетевой диск с путем \\othercomputer\share_name, то созданная ссылка с путем x:\folder - работать не будет