Linux有一个名为namespaces的功能,它允许您将文件系统的不同“视图”提供给不同的进程。在Windows术语中,如果您有一个始终从C:\floyd\floyd.ini
加载其配置的旧程序“floyd”,这将非常有用。如果Windows有名称空间,你可以编写一个包装器脚本来创建一个运行floyd
的命名空间,这样当Alice运行脚本时,floyd会在C:\floyd
存在的环境中启动但是实际上指的是C:\Users\Alice\Floyd
。
现在您可能会想,“好的,只需使用软链接或硬链接,并为C:\floyd
添加C:\Users\Alice
别名。”但是对于命名空间,Bob也可以运行启动脚本,但是他的floyd实例(在同一台计算机上,同时运行)会看到C:\floyd
的内容,例如C:\Users\Bob\Program Settings\Floyd Config
(或我们喜欢的任何其他路径。
您可以在具有命名空间的Linux上执行此操作。 Windows上有类似或类似的东西吗?如果它需要编写一个C程序就可以了,如果它只适用于最新版本的Windows,那就没关系。
答案 0 :(得分:3)
NTFS硬链接实际上是reparse points的一个简单案例。重新分析点是键入的,并且可以包括更高级的行为。例如,它们还用于“离线存储”(文件与二级存储的透明迁移)。因此,您还可以通过创建新的重新分析类型来使用重新分析点来实现每用户符号链接。
重新分析点类型甚至有一个明确的“名称代理”位,(如果设置)表示这些类型的重新分析点是某种符号链接。
您甚至可以在路径中拥有多个重新分析点。因此,符号名称空间中的文件仍然可以迁移到辅助存储 - 您只需要在路径中有两个重新分析点。
答案 1 :(得分:1)
我认为Virtual Store会自动为尝试写入非标准目录的旧程序执行此操作。因此,旧程序将写入用户和程序特定的目录,而不是C:\floyd
。
答案 2 :(得分:0)
你可以使用硬链接,但只能使用NTFS。 http://en.wikipedia.org/wiki/Hard_link
我认为Windows每个进程都没有虚拟FS视图。
答案 3 :(得分:0)
最相关的可能是特殊的环境文件夹,例如%temp%,%appdata%,%localappdata%。并不是说它们是等价的,但它们实现了同样的目的。
您可以定义自己的环境变量,然后使用'%myspecialplace%\ myfile.txt'来访问它们。
答案 4 :(得分:0)
这听起来像Windows Vista的file system virtualization。例如,它可以静默地将c:\Program Files\Floyd
重定向到c:\Users\<username>\AppData\Local\VirtualStore\Program Files\Floyd
。但是,文件系统虚拟化几乎不像Linux命名空间那样可配置。从我从阅读中可以看出,文件系统虚拟化应该在32位交互式进程打开时应用,以便编写只能由管理员写入的文件,文件夹或注册表项。 (因此,您通常会在c:\Program Files
下找到一些只读文件,在c:\Users\<username>\AppData\Local\VirtalStore
下找到一些每用户可写文件。)
application virtualization产品也可能会这样做,尽管这些产品通常更复杂,更昂贵。
答案 5 :(得分:0)
作为一个可怕的kludge(我在这里预订编程地狱的通道)你可以使用NamedPipe for C:\ Floyd将IO操作映射到特定于当前进程用户的文件吗?
我知道它并不漂亮,我对Windows上的NamedPipes(其他方言中的FIFO)知之甚少,不知道这有多可行。
丹
答案 6 :(得分:0)
e.g。 http://www.msigeek.com/4819/file-re-direction-using-correctfilepaths-shim-to-fix-broken-applications
但我认为它不是每个用户可配置的,尽管根据环境变量替换,目标可能因用户而异。
但是,大多数程序都会在注册表中存储配置,在这种情况下RegOverridePredefKey可以解决问题。
答案 7 :(得分:0)
我想到了几件事。
首先,您可以创建一个文件系统过滤器驱动程序(或使用现成的驱动程序,例如我们的CallbackFilter产品),它将所有来自应用程序的文件系统调用重定向到其他位置。这接近您提到的虚拟化,但这不会改变驱动器号列表。这种方法既强大又不平凡,所以首先要看其他选项。
另一种选择是: 存在多个产品(Thinstall,Molebox,如果内存服务),“包装”应用程序将其文件I / O重定向到其他位置。还有一些SDK也可以这样做,但我根本不记得它的名字。
答案 8 :(得分:0)
缺乏良好的解决方案。为简单起见,我无法改进使用NTFS软链接(联结) - 正如您正确指出的那样,如果您需要每用户配置,这会产生问题。正如MSalters正确地说的那样,所有NTFS软链接和硬链接都只是重新分析点的特殊情况,所以如果你不介意挖掘NTFS中的一些工作,你可以通过补充新的重新分析类型做一些更通用的事情。
(在试验NTFS软链接时,Junction非常有用:http://technet.microsoft.com/en-us/sysinternals/bb896768.aspx)
你可以采取直接的方法 - 给每个用户(或你的程序初始化,如果你只关心一个软件)一个登录脚本,在他们的用户目录中设置适当的联结(并确保你清理它然后)。但它笨拙。
一般来说,正确的Windows方法是将内容放入%localappdata%(来自Vista on)以及更常见的%userprofile%系统变量指向的文件夹中。 Win文件系统虚拟化旨在确保它适用的情况。