【发布时间】:2010-12-02 19:54:46
【问题描述】:
我知道我可以将 UNC 路径映射到本地驱动器号。但是,我想知道是否有办法将 UNC 路径映射到本地文件夹。我有一个程序,它有一个硬编码到程序中的特定文件夹,我想尝试创建一个映射到 UNC 路径的同名文件夹,以便可以从网络共享访问数据。这是可行的吗?具体来说,这是在 Windows 2003 服务器上。
【问题讨论】:
我知道我可以将 UNC 路径映射到本地驱动器号。但是,我想知道是否有办法将 UNC 路径映射到本地文件夹。我有一个程序,它有一个硬编码到程序中的特定文件夹,我想尝试创建一个映射到 UNC 路径的同名文件夹,以便可以从网络共享访问数据。这是可行的吗?具体来说,这是在 Windows 2003 服务器上。
【问题讨论】:
是的,有一种方法可以将 UNC 路径映射到本地文件夹:
C:\>mklink /D Develop \\obsidian\Develop
symbolic link created for Develop <<===>> \\obsidian\Develop
这是因为我希望 build 服务器使用我自己 PC 的 Develop 文件夹作为其 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]
【讨论】:
fsutil behavior query SymlinkEvaluation 您可能只需要根据符号链接的配置启用其中一些。例如。 fsutil behavior set SymlinkEvaluation R2R:1。这让我的 .net 程序能够comply。
这完全符合 OP 的要求 - 映射到网络共享的 Windows 2003 的符号链接。经过数小时查看其他人并对其进行测试后,我发现这是唯一可以与网络共享一起使用的组件。
此实用程序适用于 XP 和 2003 映射到网络共享并创建符号链接:http://schinagl.priv.at/nt/ln/ln.html#symboliclinksforwindowsxp
现在把它放在你放在路径上的目录中,你就可以使用senable.exe(和symlink.sys)和ln.exe创建符号链接(你需要从上面的站点以及它对 Visual C++ 运行时 DLL 的依赖)。
将这两个额外的文件放入您拥有senable.exe 的同一目录中,并确保它们都在路径上。
@echo off
SET DIR=%~dp0%
@powershell -NoProfile -ExecutionPolicy unrestricted -Command "& '%DIR%Symlink.ps1' %*"
pushd "%DIR%"
"%DIR%senable.exe" start
popd
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 需要什么):
我创建了一个巧克力包,可以为您完成所有这些工作:http://chocolatey.org/packages/win2003-mklink
与常规符号链接不同,您不能简单地删除文件夹来删除符号链接文件夹。如果这样做,它将删除它指向的真实文件夹。所以使用时要格外小心。
【讨论】:
senable.exe install)并符号链接路径(ln -s //host/share/folder name)。
ln.exe 似乎有一个相当严格的许可证,它禁止重新分发。 schinagl.priv.at/nt/ln/license.txt
您不能直接执行此操作,但如果您创建一个符号链接,您应该能够将其指向映射的驱动器号。
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 或Hard-links。您只能将其作为Symbolic 链接进行,这基本上是一种快捷方式。
因此,如果某个程序需要访问与服务器上相同的本地文件夹,对不起,不走运! Windows 不是 Linux,我们不要忘记 :-(
【讨论】:
你不能直接映射它,不。您可以尝试实现一个作为文件系统的一部分注册的 Shell 命名空间扩展,以便您可以在需要的地方对其进行根目录,然后让它在内部访问 UNC 路径。实现起来不是一件容易的事,但它应该会给你你正在寻找的最终结果。
【讨论】:
经过多次尝试,我终于发现您无法按照我想要的方式进行操作。我尝试了使用 Server 2008 中的mklink 功能的符号链接,但事实证明.NET System.IO api 无法识别符号链接。
因此,如果您对符号链接的文件夹执行Directory.GetFiles(),则会引发错误。
【讨论】:
fsutil behavior query SymlinkEvaluation 您可能只需要根据符号链接的配置启用其中一些。例如。 fsutil behavior set SymlinkEvaluation R2R:1
假设您想将\\moo\cow 映射到C:\cow_files,并且还没有一个名为 moo 的服务器(如果有的话,您可以直接共享文件夹,所以我假设没有),您可以:
编辑主机文件(或您的实际 DNS,如果可以)以将 moo 映射到带有 C:\cow_files 的机器。 (或者如果该目录对于需要映射的客户端是本地的,则到 localhost。)
在该机器上将C:\cow_files 分享为cow。
然后您应该能够映射到 \\moo\cow 并获取您需要的文件,除非我遗漏了什么(这是可能的 :))。
【讨论】: