Windows 下对目录建立软链接
在Linux下,可以很方便的通过ln命令创建对文件和对文件夹的软链接。在Windows下,通过快捷方式,可以创建到文件和文件夹的链接,但是这软链接不是一个层面的上东西。软链接是底层文件系统层面的,而快捷方式为应用层面的。
对文件夹,只能创建软链接,用junction这个小工具可以帮忙,用法如下:junction <junction directory> <junction target>
即第一个参数为要创建的连接点目录,第二个为源目录。如要将D:\temp\jboss.app.test 创建一个软链接到d:\temp\jboss\test.war下,语法如下:
junction d:\temp\jboss\test.war D:\temp\jboss.app.test
创建之后,访问d:\temp\jboss\test.war和方法d:\temp\jboss.app.test是一样的,应用程序遍历jboss下的所有文件和文件夹时,test.war会被认为是一个正常的文件夹了。
junction下载地址:http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx
参考文档:http://wenku.baidu.com/view/a92e496448d7c1c708a14548.html
##################################################################################
以下为引用文章http://tilt.lib.tsinghua.edu.cn/node/480
Windows 下也能创建硬链接和软链接(符号链接)
来源地址: http://www.blogjava.net/Unmi/archive/2007/11/26/163055.html
首先简单理解一下硬链接和符号链接(软链接)的区别(此文中的符号链接和软链接指同一概念):
硬连接指向的是节点(inode),而软连接指向的是路径(path) 。
最初的文件名与所有的硬链接地位是对等的,比如为文件 a 建立了硬链接 b、c、d。那么a、b、c、d之中只要有一个文件未删除,这个文件就可通未删除的名称访问的。你也可以认为每个文件都可认为至少有一个硬链接,就是说a也是一个硬链接。
软链接特性上有些类似于快捷方式,比如为原文件 a 建立了软链接 b、c、d。删除b、c 或 d 访问到 a,但是只要删除了 a,软链接就不可用了。但是 windows 下的快捷方式只能在资源管理器中有用,它只是一个 lnk 文件,如果是一个目录的快捷方式,它是不能通过 cd 命令或路径进入。
硬链接文件有两个限制(Unix/Linux 和 Windows 也都如此)
1、不允许给目录创建硬链接;
2、只有在同一文件系统中的文件之间才能创建链接。
更详细区别请见:硬链接和符号链接的区别,具体不多述,本文的内容关键在 Windows 下如何建立软硬链接。
熟悉过 Unix/Linux 都应该知道,Unix/Linux 用 ln 建立硬链接,ln -s 建立软链接,那么 Windows 下是如何做到的呢?
一: Windows 下创建硬链接,只能适用于 NTFS 文件系统。使用命令 fsutil hardlink
语法
fsutil hardlink create NewFileName ExistingFileName
参数
create 建立现有文件和新文件之间的 NTFS 硬链接。NTFS 硬链接与 POSIX 硬链接相似。
NewFileName 指定要将创建硬链接的文件。
ExistingFileName 指定要从中创建硬链接的文件。
当然,如果你想在自己的程序里创建硬链接,那也是很容易的,只需要一个很简单的 API 函数:
BOOL CreateHardLink(
LPCTSTR lpFileName,
LPCTSTR lpExistingFileName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
);
适用于 Win2000 及以上版本的系统,前两个参数的意思就不用解释了,最后一个参数的用途暂时保留,必须为 NULL。
二:Windows 下创建软链接
NTFS只支持对目录的软链接,微软把它称作 junction。但是对于文件的软链接,微软也有提供解决方案,那就是快捷方式(Shortcut,.lnk 文件)。不过软链接和快捷方式不是一个层次上的东西,前者是底层文件系统的功能,后者是应用层的功能。Windows 下目录的快捷方式用 dir 看起来是个文件。
在 http://www.microsoft.com/technet/sysinternals/FileAndDisk/Junction.mspx 下载 junction.exe。junction 的命令语是:
junction LinkDirectory ExistingDirectory
例如:
junction d:\link c:\winnt
将为c:\winnt 建立一个链接目录 d:\link,C和D分区都要是 NTFS 格式,在资源管理器和 dir 列示中 d:\link 都以目录的面目存在的。d:\link 就像是 c:\winnt 的一个引用一般,删除 d:\link 目录中的内容也就是删除了 c:\winnt 中的内容,但删除 d:\link 本身是不会影响到 c:\winnt 的。
相应的,在程序中也有一个 API 函数 CreateSymbolicLink 支持创建软链接,不过来得太晚了,要 Windows VISTA 和 Windows Server 2008 那样的版本才支持,先还是别想了,API 原型是:
BOOL WINAPI CreateSymbolicLink(
__in LPCWSTR lpSymlinkFileName,
__in LPCWSTR lpTargetFileName,
__in DWORD dwFlags
);
参数:
lpSymlinkFileName 要创建的符号链接名称.
lpTargetFileName 符号链接所对应目标的名称.
dwFlags 标识目标是文件还是目录. 取值0x0 代表是文件,SYMBOLIC_LINK_FLAG_DIRECTORY或0x1 代表是目录
三:其他方法
也可以使用 GNU utilities for Win32 中的 ln 来创建硬链接。这是一些 GNU 工具的 Win32 移植版本,非常好用。另外 Cygwin 里的 ln 不但可以创建硬链接也可以创建符号链接(在 Windows 里就是快捷方式 .lnk 文件)。
实际需求引出:Web 应用中上传文到 WEB 下的某个子目录中,这样可以直接通过网页链接的方式访问到这些文件。但是会出现的问题就是,每当完全重新部署应用时,如果忘了把存上传文件的目录进行备份,那么原有上传文件就全没了。原来项目部署在 Unix 下的做法是,把那个上传目录作为另一个目录的符号链接,实际存储文件的目录不在 WEB 应用目录下,重新部署时只要重建这个符号链接即可,不会有覆盖文件的危险。当然在 Unix/Linux 是好解决,只要用 ln -s 命令就行,然而对于 Windows 系统却要想点办法,为目录建立快捷的方式是行不通的,目录的链接只会当 lnk 文件对待,在 Explorer 中可以双击打开,但对于网页链接或者 cd 命令是无法正确定位的。于是思考起如何在 Windows 下创建符号连接的问题,才有了上文。
题外:对于以上的需求,可以在 Web 应用外部事先建立好一个目录,赋上相应的权限。然后在应用的配置文件中记下这个目录的绝对路径,上传时往其中写文件没问题,关键浏览时,因为文件在应用之后,不能直接通过网址浏览到,就需要通过一个程序去读取相应的文件,发送到浏览器之前必须设置根据文件类型设置响应 MINE 类型,这个 MINE 类型可以在上传时记载在库的。
现在觉得这种方法还优于用符号链接的方式,至为无需每次完整发布后重创建符号链接,而且实际中也出现过完全重部署后,目标目录中文件完全丢失的情况。
参考:
1. NTFS 下的硬链接(hard link)与符号链接(symbolic link)
2. 原来Windows下面也有硬链接
3. Windows上创建硬链接
4. MSDN CreateSymbolicLink Function
5. MSDN CreateHardLink Function
6. ln命令详细用法
Windows 下对目录建立软链接的更多相关文章
- windows下利用iis建立网站网站并实现局域共享
博客园 首页 新随笔 联系 管理 订阅 随笔- 54 文章- 9 评论- 0 Windows下利用IIS建立网站并实现局域网共享 https://blog.csdn.net/qq_4148541 ...
- 在Linux下和Windows下遍历目录的方法及如何达成一致性操作
最近因为测试目的需要遍历一个目录下面的所有文件进行操作,主要是读每个文件的内容,只要知道文件名就OK了.在Java中直接用File类就可以搞定,因为Java中使用了组合模式,使得客户端对单个文件和文件 ...
- Windows下使用Xshell建立反向隧道
反向隧道是一个进行内网穿透的简单而有用的方法.在Linux下通过OpenSSH和AutoSSH可以很容易地建立稳定的反向隧道.但是在Windows下,还能看到有人特意装个Cygwin来运行这些工具…… ...
- Windows下用Codeblocks建立一个最简单的DLL动态链接库
转自:http://blog.csdn.net/wangwei_cq/article/details/8187576 来源:http://hi.baidu.com/hellosim/item/9ae4 ...
- windows 下操作目录(使用DOS命令)
Attrib 更改单个文件或目录的属性.该命令设置或删除指派给文件或目录的只读.系统.存档.隐藏以及压缩属性. 含有下列参数的 attrib 命令仅当使用故障恢复控制台时才可用.含有不同参数的 att ...
- docker windows下挂载目录和文件
我们利用docker启动项目的时候不能直接修改容器中的内容,只能在 run 的时候挂载到本地目录或者文件来进行修改. 例子:(路径可以忽略斜杠和反斜杠,我这边使用windows的路径没有报错.do ...
- [Python]处理windows下多级目录文件,上传到Linux服务器
#-*- coding: utf-8 -*- __author__ = 'tsbc' import sys reload(sys) sys.setdefaultencoding('utf-8') im ...
- windows 下提取目录下所有文件的文件名
tree D:/dir /f >D:/filenames.txt 提取D盘dir目录下所有文件名,写入文件filenames.txt
- 在windows下用vagrant建立lnmp开发环境
1.安装vagrant,vitrualbox 2.下载homestead的box包,并添加到vagrant 下载地址: https://atlas.hashicorp.com/laravel/boxe ...
随机推荐
- compile,build和execute的区别
一个c程序的生成要经历以下步骤: 1.编写文本代码,生成c或cpp文件,这时候它还是文本的: 2.编译,就是compile,由c编译程序对你写的代码进行词法和句法分析,发现并报告错误,有错时编译不能通 ...
- poj3384Feng Shui(半平面交)
链接 将边长向内推进r,明显这样把第一个圆的圆心放在新的边长是肯定是最优的,与原本边相切,然后再找新多边上的最远的两点即为两圆心. #include <iostream> #include ...
- jquery+ajax(用ajax.dll)实现无刷新分页
利用ajax.dll那种方式的无刷新,在这就不说了,新朋友可以看下我的另一片文件http://www.cnblogs.com/dachuang/p/3654632.html 首先,这里用的是jquer ...
- css处理浏览器兼容问题
浏览器的兼容: _ ie6认识 格式:_width:100px;要写在最后面来覆盖前面的. * ie6和ie7都认识 格式:* width:100px;要写在最后面来覆盖前面的. \0 ie8认识 ...
- java语法糖3 深入剖析Java中的装箱和拆箱
装箱 在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i = new Integer(10); 而在从Java SE5开始就提供了自动装箱的特性, ...
- shell脚本中获取本机ip地址的方法
ipaddr='172.0.0.1' ipaddr=$(ip addr | awk '/^[0-9]+: / {}; /inet.*global/ {print gensub(/(.*)\/(.*)/ ...
- openid4java 使用记录[转载]
[文章来源:http://r-j-r-a5438-163-com.iteye.com/blog/611351] 在项目中使用了openid4java进行开发,在开发过程中碰到过一些问题,在网上也找了很 ...
- 20160805_Win7x64刻录CentOS6.4x64启动光盘
使用的软件为:UltraISO.v.9.6.2.3059.exe Win7 x64 刻录 CentOS6.4 x64 启动盘,有提示错误信息. 网上查了一下,是 AHCI 的驱动没有安装.来到 联想t ...
- hiho_1067_最近公共祖先2
题目大意 给出一棵家谱树,树中的节点都有一个名字,保证每个名字都是唯一的,然后进行若干次查询,找出两个名字的最近公共祖先. 题目链接最近公共祖先 分析 数据量大,根据题目提示,采用Tarjan + 并 ...
- x265
1.编译库 https://bitbucket.org/multicoreware/x265/src/tip/build/README.txt?at=default 2.无法定位程序输入点x265_e ...