我知道我可以将 UNC 路径映射到本地驱动器号。但是,我想知道是否有办法将 UNC 路径映射到本地文件夹。我有一个程序,它有一个硬编码到程序中的特定文件夹,我想尝试创建一个映射到 UNC 路径的同名文件夹,以便可以从网络共享访问数据。这是可行的吗?具体来说,这是在 Windows 2003 服务器上。
7 回答
是的,有一种方法可以将 UNC 路径映射到本地文件夹:
C:\>mklink /D Develop \\obsidian\Develop
symbolic link created for Develop <<===>> \\obsidian\Develop
这是因为我希望构建服务器使用我自己的 PCDevelop
文件夹作为其Develop
文件夹:
10/20/2012 11:01 AM <SYMLINKD> Develop [\\obsidian\Develop]
你有它。
MKLINK [[/D] | [/H] | [/J]] Link Target
/D Creates a directory symbolic link. Default is a file
symbolic link.
/H Creates a hard link instead of a symbolic link.
/J Creates a Directory Junction.
Link specifies the new symbolic link name.
Target specifies the path (relative or absolute) that the new link
refers to.
注意:在我的实际情况下,我需要另一个级别的重定向,因为我正在使用的程序意识到这Develop
是一个符号链接,指向远程机器,并且拒绝遵守。我告诉程序闭嘴并通过给它一个指向本地资源的连接来执行它所告诉的事情。
10/20/2012 11:06 AM <JUNCTION> Develop [C:\Develop2\]
10/20/2012 11:01 AM <SYMLINKD> Develop2 [\\obsidian\Develop]
这完全符合 OP 的要求 - 映射到网络共享的 Windows 2003 的符号链接。经过数小时查看其他人并对其进行测试后,这是我发现的唯一可以与网络共享一起使用的组件。
Windows XP 的符号链接驱动程序
此实用程序适用于 XP 和 2003 映射到网络共享并创建符号链接:http ://schinagl.priv.at/nt/ln/ln.html#symboliclinksforwindowsxp
现在把它放在你放在路径上的目录中,你就可以使用senable.exe
(with symlink.sys
) 和创建符号链接ln.exe
(你需要从上面的站点以及它对 Visual C++ 运行时 DLL 的依赖)。
额外奖励:伪造 MkLink
将这两个额外的文件放入您拥有的同一目录中,senable.exe
并确保它们都在路径上。
mklink.cmd:
@echo off
SET DIR=%~dp0%
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "& '%DIR%Symlink.ps1' %*"
pushd "%DIR%"
"%DIR%senable.exe" start
popd
符号链接.ps1:
param (
[string]$symlinktype,
[string]$link,
[string]$target
)
$scriptpath = $MyInvocation.MyCommand.Path
$ScriptDir = Split-Path $scriptpath
$senable = Join-Path "$ScriptDir" senable.exe
$ln = Join-Path "$ScriptDir" ln.exe
pushd "$ScriptDir"
& cmd /c "$senable" install
popd
& cmd /c "$ln" -s "$target" "$link"
笔记:
您需要在 Windows 2003 上安装以下其他项目(非 R2,我不完全确定 R2 需要什么):
- Microsoft .NET Framework 2.0 服务包 1
- Windows 映像组件
- Windows Server 2003 服务包 2
- Windows Management Framework Core(这带来了 PowerShell 2)
巧克力包装
我创建了一个巧克力包,它将为您完成所有这些工作: http: //chocolatey.org/packages/win2003-mklink
重要的提示
与常规符号链接不同,您不能简单地删除文件夹来删除符号链接文件夹。如果这样做,它将删除它指向的真实文件夹。所以使用时要格外小心。
您不能直接执行此操作,但如果您创建符号链接,您应该能够将其指向映射的驱动器号。
net use e: \\\\shares\folder
# 您需要将其设置为持久性,否则下次重新启动将破坏它。
使用cmd
您想要链接的位置浏览:
cd c:\folder
mklink /d name e:\
现在任何访问c:\folder\name\
都将访问\\\\shares\folder\
根据 Microsoft,您不能将远程计算机(服务器)上的共享文件夹映射到本地文件夹。
例如,这将不起作用:
- 服务器上的共享文件夹:
\\\Server\share1
- 本地机器上的映射共享:
c:\MyProgram\Some_Useful_Files_Here
正如微软所说,你不能mklink
在远程机器上做;至少不是为Junction
or Hard-links
。您只能将其作为Symbolic
链接进行,这基本上是一种快捷方式。
因此,如果某个程序需要访问与服务器上相同的本地文件夹,很抱歉没有运气!Windows 不是 Linux,我们不要忘记 :-(
你不能直接映射它,不。您可以尝试实现一个已注册为文件系统一部分的 Shell 命名空间扩展,以便您可以在需要的地方对其进行根目录,然后让它在内部访问 UNC 路径。实现起来并不是一件微不足道的事情,但它应该会给你你正在寻找的最终结果。
经过多次尝试,我终于发现您无法按照我想要的方式进行操作。我使用 Server 2008 中的功能尝试了符号链接mklink
,但事实证明 .NET System.IO
api 无法识别符号链接。
因此,如果您Directory.GetFiles()
对符号链接的文件夹执行 a 操作,则会引发错误。
假设您要映射\\moo\cow
到C:\cow_files
,并且还没有一个名为 moo 的服务器(如果有的话,您可以直接共享文件夹,所以我假设没有),您可以:
编辑主机文件(或您的实际 DNS,如果可以)以映射
moo
到上面的机器C:\cow_files
。(或者如果该目录对于需要映射的客户端是本地的,则为 localhost。)C:\cow_files
在cow
该机器上共享。
然后您应该能够映射\\moo\cow
并获取您需要的文件,除非我错过了某些东西(这是可能的:))。