在C#中使用硬链接

在日常工作中,我们经常会有拷贝文件的需求。相应的,我们也经常会有在编程语言里面调用拷贝文件的时候,比如C#中的System.IO.File.Copy。然而,拷贝一个大文件常常需要比较多时间和额外的硬盘空间,有时候,在某些情况下(哪些情况我们之后会谈到)我们可以考虑使用建立文件硬链接的方式。

硬链接,英文名HardLink。区别于软链接SoftLink,硬链接的一些使用规则如下:

  • 硬链接只能对文件使用,不能作用于文件夹
  • 硬链接只能在NTFS分区使用
  • 硬链接所建立的链接和源文件不能跨逻辑分区,换句话说,我们不能在C盘建立一个硬链接到D盘的某个文件
  • 硬链接和源文件指向同样的硬盘地址,不同于快捷方式,删除源文件之后,硬链接依然有效。同样也不同于拷贝,修改硬链接的文件内容同时也会影响源文件。这就要求在使用硬链接之前考虑清楚使用场景
  • Windows从Vista之后支持硬链接

从这些规则我们可以得知,硬链接和拷贝最大的不同在于,硬链接就像多了一个指针一样,对硬链接文件内容的修改同样会反应到源文件上面,所以如果我们拷贝文件之后会对文件做出修改,那就不适合用硬链接。如果我们拷贝文件的目的在于打包部署等,那么用硬链接是很合算的操作。

那么说了那么多,究竟应该怎么在C#里面建立硬链接呢?很可惜,C#本身既不支持硬链接,也不支持软链接。要想在C#中使用,我们只有通过DllImport调用未托管代码。

[DllImport("Kernel32", CharSet = CharSet.Unicode)]
public extern static bool CreateHardLink(string linkName, string sourceName, IntPtr attribute);

需要的时候,直接调用就可以

		static void Main(string[] args)
        {
            using (var sw = new ScopeStopWatch())
            {
                var b = CreateHardLink(@"d:\newdata", @"D:\data", IntPtr.Zero);                                
            }            
        }

        class ScopeStopWatch : IDisposable
        {
            private System.Diagnostics.Stopwatch m_watch = new System.Diagnostics.Stopwatch();
            public ScopeStopWatch()
            {
                m_watch.Start();
            }

            public void Dispose()
            {
                m_watch.Stop();
                Console.WriteLine("used time is {0}", m_watch.ElapsedMilliseconds);
            }
        }

其中,data是一个5G的文件,如果使用拷贝,需要三分钟以上,然而用建立硬链接的方式,只需要几毫秒就可以搞定,同时我们可以随意的删除源文件。

怎么样,体会到硬链接的优点了吧,不过硬链接也不要随便乱用,请记住它的使用限制:

  • 仅能在NTFS下面使用
  • 修改硬链接文件内容会影响源文件
  • 不能跨逻辑分区

猜你喜欢

转载自blog.csdn.net/deatharthas/article/details/102536572