Windows上创建硬链接
[ 2010/09/27 16:33 | by selboo ]
Unix上可以方便的创建软链接和硬链接。可以提供额外的访问文件的接口而无需复制文件,大大减小了重复文件的空间浪费和维护问题,也减少了大文件复制的开销。
Windows上只能创建硬链接(快捷方式有点类似软链接,不过还是有不小的区别的),要求Win2000以上,而且只能在NTFS分区上用,也不能跨分区创建链接。但起码比没有好。
下面这个程序就是用来创建硬链接的。建立以后,修改一下其中一个文件,看一下另一个是不是也一起变了。^_^
用法:编译以后,比如生成nthl.exe。
nthl 目标链接 原始文件
如果发生错误,会输出错误信息。
源代码:
[code]/* nthl.cpp */
/**
* 创建硬链接
*
* @author XieZhenye
*
*/
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT<br/
Windows上只能创建硬链接(快捷方式有点类似软链接,不过还是有不小的区别的),要求Win2000以上,而且只能在NTFS分区上用,也不能跨分区创建链接。但起码比没有好。
下面这个程序就是用来创建硬链接的。建立以后,修改一下其中一个文件,看一下另一个是不是也一起变了。^_^
用法:编译以后,比如生成nthl.exe。
nthl 目标链接 原始文件
如果发生错误,会输出错误信息。
源代码:
[code]/* nthl.cpp */
/**
* 创建硬链接
*
* @author XieZhenye
*
*/
#ifdef _WIN32_WINNT
#undef _WIN32_WINNT<br/
NTFS 下的硬链接(hard link)与软链接(symbolic link)
[ 2010/02/02 11:18 | by selboo ]
在 Linux 使用的 ext2 等文件系统里,都有 hard link 与 symbolic link 的功能,这个功能简单的说就是让我们可以用多个路径去访问同一个文件或者目录.比如说让 /vmlinuz 和 /boot/vmlinuz-2.6.7-1-38 表示的是同一个文件.但 hard link 和 symbolic link 还是有区别的(废话).
Hard link 表示,它和原文件名指向的是存储设备上同一个文件内容.就好像这个文件内容有多个文件名一样,每个文件名有相等地位.删除其中任何一个之后,事实上文件内容并不会被删除掉,仍然可以用其他的名称来访问这个文件.只有当最后一个指向这个文件内容的文件名被删除掉之后,文件内容才被删除.也就是说,一个文件的 hard link 跟此文件本来的名称并没有任何本质上的区别.需要注意的是,因为每个分区(partition)上都可能有相同的存储位置地址,所以 hard link 必须跟被 link 的文件在同一个分区上.另外,目录不支持 hard link. Symbolic link 也称 soft link,它类似于 Windows 里的快捷方式 .lnk 文件.它本身是一个单独的文件,而这个文件的内容是它所指向的文件的路径.一般的程序存取 symbolic link 时存取的并不是它本身的内容,而是它所指向的文件的内容.当某个文件被删除掉后,它的 symbolic link 就无法存取到这个文件了,因为文件本身已经被删除了.也就是说,一个文件的 symbolic link 跟此文件的文件名或者内容都是完全不同的两个东西.Symbolic link 可以链接任何本地可以访问到的文件或者目录路径.
以上这些是我对 hard link 和 symbolic link 的理解,我试图用跟文件系统无关和尽量通俗易懂的语言来解释这两个概念.但如果你是一个软件开发者或者系统管理员或者仅仅是想知道更详细的东西,强烈建议你去看看这个帖子.
OK,概念解释清楚了.那么,NTFS 3.0 (Windows 2000 使用的 NTFS 的版本)事实上是支持 hard link 和 symbolic link 的,虽然 Windows 里没有比较容易使用的相关工具,而且 Explorer 对待 symbolic link 也有很奇怪的行为.
在 Windows 2000 及以上版本里可以使用 fsutil hardlink create 这个复杂的命令来创建一个 hard link,用法倒是很简单:
fsutil hardlink create <新文件名> <现有文件名>
也可以使用 GNU utilities for Win32 中的 ln 来创建 hard link.这是一些 GNU 工具的 Win32 移植版本,非常好用.另外 Cygwin 里的 ln 不但可以创建 hard link 也可以创建 symbolic link (在 Windows 里就是快捷方式 .lnk 文件).
当然,如果你想在自己的程序里创建 hard link,那也是很容易的,只需要一个很简单的 API 函数:
BOOL CreateHardLink(
LPCTSTR lpFileName,
LPCTSTR lpExistingFileName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
前两个参数的意思就不用解释了,最后一个参数的用途暂时保留,必须为 NULL.
对于 symbolic link,NTFS 只支持对目录的 symbolic link,微软把它称作 junction.但是对于文件的 symbolic link,微软也有提供解决方案,那就是快捷方式(Shortcut,.lnk 文件).不过 symbolic link 和快捷方式不是一个层次上的东西,前者是底层文件系统的功能,后者是应用层的功能.
在“管理工具”中的“计算机管理”里的“磁盘管理”里我们可以将一个卷装载到一个 NTFS 卷上的某个空目录里,这实际上就是为被装载卷的根目录建立一个以该空目录名为名的 symbolic link.也可以用命令行工具 MOUNTVOL 来完成这项工作.
遗憾的是 Windows 并没有提供对 NTFS 的 symbolic link 完整支持的工具.“计算机管理”或者 MOUNTVOL 只能对某个卷的根目录创建 symbolic link,而不是对任意目录.幸运的是我们可以使用 Sysinternals 提供的带有源代码的免费命令行工具 junction.exe 来全功能的完成对 NTFS symbolic link 的管理.当然,微软也还不至于太莫名其妙,它在 Windwos 2000 Resource Kit 里提供了一个命令行工具 linkd.exe 来完成这件事.不过它的查看 symbolic link 信息的功能不如 junction,因为不支持通配符和子目录扫描.
需要注意的是,Explorer 对待 symbolic link 有一个很奇怪的行为.那就是,在 Explorer 里一个 symbolic link 跟被它 link 的目录没有区别,删除这个 symbolic link 将会删除被 link 的目录下的所有文件!而著名的强大的方便的扩展性强的(原谅我在这里用了这么多修饰词,我确实太喜欢 TC 了.)文件管理工具 Total Commander 则没有这个问题.
文中的某些基本概念和知识来源于以下两个页面:
http://answers.google.com/answers/threadview?id=341355
http://phorum.study-area.org/viewtopic.php?t=12235
感谢提供这两个页面内容的各位.
Hard link 表示,它和原文件名指向的是存储设备上同一个文件内容.就好像这个文件内容有多个文件名一样,每个文件名有相等地位.删除其中任何一个之后,事实上文件内容并不会被删除掉,仍然可以用其他的名称来访问这个文件.只有当最后一个指向这个文件内容的文件名被删除掉之后,文件内容才被删除.也就是说,一个文件的 hard link 跟此文件本来的名称并没有任何本质上的区别.需要注意的是,因为每个分区(partition)上都可能有相同的存储位置地址,所以 hard link 必须跟被 link 的文件在同一个分区上.另外,目录不支持 hard link. Symbolic link 也称 soft link,它类似于 Windows 里的快捷方式 .lnk 文件.它本身是一个单独的文件,而这个文件的内容是它所指向的文件的路径.一般的程序存取 symbolic link 时存取的并不是它本身的内容,而是它所指向的文件的内容.当某个文件被删除掉后,它的 symbolic link 就无法存取到这个文件了,因为文件本身已经被删除了.也就是说,一个文件的 symbolic link 跟此文件的文件名或者内容都是完全不同的两个东西.Symbolic link 可以链接任何本地可以访问到的文件或者目录路径.
以上这些是我对 hard link 和 symbolic link 的理解,我试图用跟文件系统无关和尽量通俗易懂的语言来解释这两个概念.但如果你是一个软件开发者或者系统管理员或者仅仅是想知道更详细的东西,强烈建议你去看看这个帖子.
OK,概念解释清楚了.那么,NTFS 3.0 (Windows 2000 使用的 NTFS 的版本)事实上是支持 hard link 和 symbolic link 的,虽然 Windows 里没有比较容易使用的相关工具,而且 Explorer 对待 symbolic link 也有很奇怪的行为.
在 Windows 2000 及以上版本里可以使用 fsutil hardlink create 这个复杂的命令来创建一个 hard link,用法倒是很简单:
fsutil hardlink create <新文件名> <现有文件名>
也可以使用 GNU utilities for Win32 中的 ln 来创建 hard link.这是一些 GNU 工具的 Win32 移植版本,非常好用.另外 Cygwin 里的 ln 不但可以创建 hard link 也可以创建 symbolic link (在 Windows 里就是快捷方式 .lnk 文件).
当然,如果你想在自己的程序里创建 hard link,那也是很容易的,只需要一个很简单的 API 函数:
BOOL CreateHardLink(
LPCTSTR lpFileName,
LPCTSTR lpExistingFileName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
前两个参数的意思就不用解释了,最后一个参数的用途暂时保留,必须为 NULL.
对于 symbolic link,NTFS 只支持对目录的 symbolic link,微软把它称作 junction.但是对于文件的 symbolic link,微软也有提供解决方案,那就是快捷方式(Shortcut,.lnk 文件).不过 symbolic link 和快捷方式不是一个层次上的东西,前者是底层文件系统的功能,后者是应用层的功能.
在“管理工具”中的“计算机管理”里的“磁盘管理”里我们可以将一个卷装载到一个 NTFS 卷上的某个空目录里,这实际上就是为被装载卷的根目录建立一个以该空目录名为名的 symbolic link.也可以用命令行工具 MOUNTVOL 来完成这项工作.
遗憾的是 Windows 并没有提供对 NTFS 的 symbolic link 完整支持的工具.“计算机管理”或者 MOUNTVOL 只能对某个卷的根目录创建 symbolic link,而不是对任意目录.幸运的是我们可以使用 Sysinternals 提供的带有源代码的免费命令行工具 junction.exe 来全功能的完成对 NTFS symbolic link 的管理.当然,微软也还不至于太莫名其妙,它在 Windwos 2000 Resource Kit 里提供了一个命令行工具 linkd.exe 来完成这件事.不过它的查看 symbolic link 信息的功能不如 junction,因为不支持通配符和子目录扫描.
需要注意的是,Explorer 对待 symbolic link 有一个很奇怪的行为.那就是,在 Explorer 里一个 symbolic link 跟被它 link 的目录没有区别,删除这个 symbolic link 将会删除被 link 的目录下的所有文件!而著名的强大的方便的扩展性强的(原谅我在这里用了这么多修饰词,我确实太喜欢 TC 了.)文件管理工具 Total Commander 则没有这个问题.
文中的某些基本概念和知识来源于以下两个页面:
http://answers.google.com/answers/threadview?id=341355
http://phorum.study-area.org/viewtopic.php?t=12235
感谢提供这两个页面内容的各位.