среда, 13 мая 2009 г.

Создание символической ссылки на папку или файл

Собственно, вещь полезная :) Кто не знает - в Far Manager'е это можно сделать нажав Alt+F6. А на C#-пе вот так:




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.

2 комментария:

  1. а как проверить является ли файл символической ссылкой?

    ОтветитьУдалить
  2. Если верить этому 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 - работать не будет

    ОтветитьУдалить