首页 \ 问答 \ 应用程序如何处理Windows符号链接?(How are Windows symbolic links treated by the apps?)

应用程序如何处理Windows符号链接?(How are Windows symbolic links treated by the apps?)

我认为Windows 10中的符号链接与Linux符号链接的行为类似,即它们对应用程序是透明的。 但是,我对实际行为感到困惑。

作为一个例子,我已经软链接和硬链接相同的CSS文件:

$ mklink softlinked.css Default.css
symbolic link created for softlinked.css <<===>> Default.css

$ mklink /H hardlinked.css Default.css
Hardlink created for hardlinked.css <<===>> Default.css

软硬连接

硬链接行为可预测(与原始文件无法区分)但我不理解软链接。 参见例如:

在此处输入图像描述

此外,当Caret编辑器使用CSS时,硬链接样式表工作正常:

在此处输入图像描述

虽然软链接被破坏了:

在此处输入图像描述

问题是:

  1. 符号链接在Windows上的实际行为如何?
  2. 软链接可以对应用程序透明吗? 透明,我的意思是应用程序总是会看到文件在符号链接路径( ...\symlinked.css )上,并且永远不会解析为原始路径( ...\Default.css )。 是否有一些Windows注册表设置或什么?

I thought that symbolic links in Windows 10 behave similarly to Linux symlinks, i.e., they are transparent to the apps. However, I'm confused by the actual behavior.

As an example, I've both softlinked and hardlinked the same CSS file:

$ mklink softlinked.css Default.css
symbolic link created for softlinked.css <<===>> Default.css

$ mklink /H hardlinked.css Default.css
Hardlink created for hardlinked.css <<===>> Default.css

soft and hard link

The hardlink behaves predictably (is indistinguishable from the original file) but I don't understand the soft linked one. See for example this:

enter image description here

Also, when the CSS is consumed by the Caret editor, the hardlinked stylesheet works fine:

enter image description here

while the softlinked is broken:

enter image description here

The questions are:

  1. How do the symbolic links actually behave on Windows?
  2. Can soft links be made transparent to the apps? By transparent, I mean the app would always see the file as being on the symlinked path (...\symlinked.css) and never resolve to the original path (...\Default.css). Is there some Windows registry settings or something?

原文:https://stackoverflow.com/questions/43090597
更新时间:2021-06-08 10:06

最满意答案

符号链接对使用底层文件系统的应用程序是透明的,例如CreateFile()和朋友,除非应用程序特别努力了解它们。

但是,它们对使用shell命名空间的应用程序(例如标准的“打开文件”对话框)不透明,因为shell将符号链接视为快捷方式,甚至可以修改显示的图标。 对于微软而言,这是否是一个明智的决定在这个阶段是一个有争议的问题,因为它不会改变。 据我所知,它是不可配置的。

在实践中,这通常意味着符号链接将对GUI应用程序和GUI应用程序中的内部文件(DLL,内置模板,配置文件等)透明地行为,但对于用户的文档则不行。

所以你的前两个例子(资源管理器显示文件和Notepad ++的行为)是功能而不是错误; 无论喜欢与否,这都是Windows的工作方式。

您的上一个示例似乎确实是相关应用程序中的错误(或充其量是一个不合需要的设计限制)。 可能值得联系供应商。


您还应该知道创建符号链接需要管理权限,默认情况下它们不能通过网络共享工作。 就个人而言,鉴于所有这些限制,我从未发现它们非常有用。 对于大多数用户任务,我会使用快捷方式,对于大多数系统管理任务,连接点更可靠。


Symlinks are transparent to applications that are using the underlying file system, e.g., CreateFile() and friends, unless the application makes a specific effort to be aware of them.

However, they are not transparent to applications that are using the shell namespace (for example the standard Open File dialog) because the shell treats symlinks as if they were shortcuts, even to the point of modifying the displayed icon. Whether this was a sensible decision on Microsoft's part is a moot point at this stage, since it isn't about to change. So far as I'm aware, it is not configurable.

In practice this usually means that symlinks will behave transparently for non-GUI applications and for internal files (DLLs, built-in templates, configuration files, etc.) in GUI applications, but not for the user's documents.

So your first two examples (the way Explorer displays the files and the behaviour of Notepad++) are features rather than bugs; like it or not, this is the way Windows is designed to work.

Your last example does appear to be a bug (or at best an undesirable design limitation) in the application in question. It might be worth contacting the vendor.


You should also be aware that creating a symlink requires administrative privilege, and by default they don't work at all over network shares. Personally, given all these limitations, I've never found them very useful. For most user tasks I would use shortcuts instead, and for most system administration tasks junction points are more reliable.

相关问答

更多

符号链接背后有什么?(What is there behind a symbolic link?)

这不是关于UNIX / Linux,而是关于文件系统的实现 - 但是,Unix / Linux在内核级使用inode,文件系统实现有inode(至少是虚拟的)。 在一般情况下,符号链接只是文件(顺便说一下,目录也是文件),它们具有: “inode”中的标志 file-type告诉系统该文件是“符号链接” file-content:指向目标的路径 - 换句话说:符号链接仅仅是一个文件,其中包含inode中带有标志的文件名。 虚拟文件系统也可以具有符号链接,因此,请检查FUSE或其他文件系统实现源。 ...

创建符号链接而不是复制文件(Create Symbolic Links rather than copy files)

Herrmann Schinagl的ln.exe ( 这里 )正是你要做的 - 比较,链接相同的文件并复制不同的文件。 插图说明了符号链接,内部和外部连接的所有复杂细节。 'DeLorean Copy'应该是正确的方法。 Herrmann Schinagl's ln.exe (here) does exactly what you are trying to do - compare, link identical files and copy different ones. All intric ...

Vagrant中的符号链接和同步文件夹(Symbolic links and synced folders in Vagrant)

出于安全考虑,Virtualbox不允许共享文件夹上的符号链接。 要启用符号链接,需要将以下行添加到Vagrantfile中的vm提供程序配置块中: config.vm.provider "virtualbox" do |v| v.customize ["setextradata", :id, "VBoxInternal2/SharedFoldersEnableSymlinksCreate/v-root", "1"] end 此外,在Windows vagrant up需要在具有管理员权 ...

在Windows上列出非符号链接(Listing non symbolic link on Windows)

您的代码中存在一些问题: 你需要延迟扩展,因为你在同一个带括号的代码块中设置(写入) 和扩展(读取)变量count (即for /F %%a loop); 在你的for /F %%a循环中,你需要声明选项"eol=| delims=" ,以免在名称以...开头的文件中遇到麻烦; (由于默认的eol=;选项会被忽略)和名称中有空格的那些(你会在第一个空格之前只收到一个位置,因为默认的delims 空间和TAB以及默认的选项tokens=1 (有关详细信息,请参阅for /? ); dir /B仅返回 ...

符号链接到Python3不起作用(在Windows上)(Symbolic Link to Python3 doesn't work (on Windows))

事情比Windows更糟(或更好)。 在传统的Windows安装中,Python可执行文件使用注册表,环境或可执行文件的目录来查找其安装路径。 这意味着一个符号链接将打破搜索.. 但是,在Windows上处理多个安装的标准方式是Python> 3.3附带的py.exe启动程序。 如果为所有用户安装了安装程序,或者至少要求安装程序为所有用户安装启动程序(推荐) ,它将以默认路径(我的3.6版本安装在Windows目录中)提供。 现在没有更多的配置,如果你没有传递一个版本选项,你可以启动python ...

Windows到可执行文件的符号链接的快捷方式(Windows shortcut to a symbolic link to an executable)

你仍然可以做无用的批处理文件。 在它内部使用CALL ,以便控制台窗口在启动应用程序后立即关闭。 此外,现在不在Windows计算机上,但可以创建CMD.exe的快捷方式,并在其中传递命令? 在出现控制台窗口的情况下,您可以与CALL一起执行此操作。 You can still do the useless batch file. Use CALL inside of it so the console window closes immediately after starting your a ...

在Linux和Windows之间进行处理时如何处理符号链接?(How to deal with symbolic links when going between Linux and Windows?)

使用httpd和mod_wsgi设置配置,该配置具有适用于静态媒体的Alias指令。 Instead, of running a server on Windows just to test for IE, you can run a server from on an IP that identifies your machine on your network. Just run python manage.py runserver ad.dr.re.ss:8000 To find the ...

是否有API可用于查询市场中Windows Phone 7应用程序的深层链接?(Is an API available to query Deep links for Windows Phone 7 apps in the marketplace?)

要查询市场,您可以使用Zune桌面软件使用的服务(您可以使用fiddler查看它所调用的服务以获取有关应用程序的数据)。 例如,如果要在市场中搜索应用程序的XYZ,则以下URL将返回可以解析的XML数据并显示数据。 http://catalog.zune.net/v3.2/en-US/apps?q=XYZ&clientType=WinMobile%207.0&store=zest To query marketplace, you can use service which Zune deskto ...

应用程序如何处理Windows符号链接?(How are Windows symbolic links treated by the apps?)

符号链接对使用底层文件系统的应用程序是透明的,例如CreateFile()和朋友,除非应用程序特别努力了解它们。 但是,它们对使用shell命名空间的应用程序(例如标准的“打开文件”对话框)不透明,因为shell将符号链接视为快捷方式,甚至可以修改显示的图标。 对于微软而言,这是否是一个明智的决定在这个阶段是一个有争议的问题,因为它不会改变。 据我所知,它是不可配置的。 在实践中,这通常意味着符号链接将对GUI应用程序和GUI应用程序中的内部文件(DLL,内置模板,配置文件等)透明地行为,但对于用 ...

Makefile和符号链接(Makefile and symbolic links)

我认为错误消息中的execvp是关键。 我相信在尝试找到ln命令本身时 ,有太多级别的符号链接。 例: all: ln -nsf /tmp/foo /tmp/foo /tmp/foo/ln x y 使用此Makefile错误运行“make”: make: execvp: /tmp/foo/ln: Too many levels of symbolic links 那么,你的Makefile如何调用ln呢? 你的PATH等是什么? [更新] 我敢打赌,Makefile会弄乱你的P ...

相关文章

更多

最新问答

更多
  • 如何从远程文件拉取文件而不覆盖本地文件?(How do I pull files from remote without overwriting local files?)
  • Reactjs:状态改变时重新渲染iframe(Reactjs: re-renders iframes when state changed)
  • 奇怪的网址,以及跟随php页面流程的困难(odd url, and difficulty in following the php page flow)
  • 标签活动无效(Tab Activity is not working)
  • JavaME合适的语法编译器建议?(JavaME-suitable grammar compiler recommendations?)
  • 指定参数(Specifying arguments)
  • 可以通过Ruby插件或控制台覆盖Sketchup中的键盘快捷键吗?(Can one override keyboard shortcuts in Sketchup through the a Ruby Plugin or Console?)
  • 计算Java EE Web App中用户数的最佳方法(Best way to count number of users in a Java EE web App)
  • 无法使用templateUrl加载cordova中的外部模板(unable to load external templates in cordova with templateUrl)
  • PHPExcel:写入期间无法使用缓存(PHPExcel: Unable to use cache during write)
  • 在javascript中嵌套这个指针(nested this pointer in javascript)
  • 谁跟领航致远培训过,有问题问下啊
  • 控制器要求在入门时下载(Controller ask to download on entry)
  • 未能通过conda安装Asyncio(Failure to install Asyncio via conda)
  • 如何查找已完成项目的总长度?(How to find length of total completed items?)
  • 如何检查OleInitialize是否已被调用?(How to check if OleInitialize has already been called?)
  • SQL在特定范围内返回列中具有最大值的行(SQL Returning rows with max value in column, within a specific range)
  • preg_match从url获取id(preg_match get the id from url)
  • 如何在运算符中为make方程转换perl变量?(How to convert a perl variable in a operator for make equations?)
  • 在导航上方添加空格/标题。(Add a white space/ header above navigation.)
  • MeetingItem已保存;(MeetingItem saved; but change now shown in Calendar)
  • c#vb:我们应该使用System.Lazy进行资源密集型任务吗?(c# vb: Should we use System.Lazy for resource-intensive task? (when threading is not needed))
  • 为什么在armeabi代码中使用armeabi-v7a代码?(Why use armeabi-v7a code over armeabi code?)
  • 获取请求的自定义标头(Java HTTP)(Fetching a custom header of a request (Java HTTP))
  • 是否可以在嵌套的if语句中从varchar转换为numeric以动态评估参数?(Is it possible to convert from varchar to numeric within a nested if statement in order to dynamically evaluate a parameter?)
  • 如何将Html.ActionLink转换为链接到Ajax调用的按钮?(How to convert from Html.ActionLink to a button linked to Ajax call?)
  • 应用程序如何处理Windows符号链接?(How are Windows symbolic links treated by the apps?)
  • html,js,css在jsfiddle中工作,但不在sharepoint中(html, js, css works in jsfiddle but not in sharepoint)
  • 从Ruby脚本调用Elasticsearch Rest API(Calling Elasticsearch Rest API from Ruby script)
  • 如何将嵌套setTimeouts转换为承诺(How to convert nested setTimeouts to promises)