重定向文件系统

时间:2014-12-28 18:58:41

标签: c# .net filesystems

好的,所以我确定之前已经问过这个问题,但我似乎无法正确地说出问题以获得任何答案。

我尝试做的是通过c#启动应用程序,然后让所有对SHGetFolderPathEnvironment.GetFolder(int .net)的调用返回备用路径我指定的。

我尝试使用USERPROFILE作为示例将ProcessStartInfo.EnvironmentalVariables设置为某个任意目录,但它没有用。它将环境变量USERPROFILE设置为正确的值,但调用SHGetFolderPathEnvironment.GetFolder仍会返回先前的值。

关于我如何能够在那里获得全部方式的任何想法?

这是我为此编写的测试应用

class Program
{
    static void Main(string[] args)
    {
        if (args.Any(x => x.Contains("x")))
        {
            // Read vars
            Console.WriteLine("a=" + Environment.GetEnvironmentVariable("a"));// a=tacos
            Console.WriteLine("USERPROFILE=" + Environment.GetEnvironmentVariable("USERPROFILE")); //USERPROFILE=F:\UP
            Console.WriteLine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)); // C:\Users\Username
            Console.WriteLine();
            var allvars = Environment.GetEnvironmentVariables();
            foreach (var key in allvars.Keys)
            {
                Console.WriteLine("{0} - {1}", key, allvars[key]);
            }
            Console.WriteLine("Done Second Process");
        }
        else
        {
            // Start new process
            var proc = new System.Diagnostics.ProcessStartInfo(Assembly.GetEntryAssembly().Location);
            proc.Arguments = "x";
            proc.EnvironmentVariables["a"] = "tacos";
            proc.EnvironmentVariables["USERPROFILE"] = @"F:\UP";
            proc.UseShellExecute = false;
            proc.RedirectStandardInput = true;
            proc.RedirectStandardOutput = true;
            proc.RedirectStandardError = true;
            var p = Process.Start(proc);
            do
            {
                Thread.Sleep(10);
                Console.Out.Write(p.StandardOutput.ReadToEnd());
            }
            while (!p.HasExited);
            //catch any leftovers in redirected stdout
            Console.Out.Write(p.StandardOutput.ReadToEnd());
            Console.WriteLine("Any Key");
            Console.ReadKey();
            Console.WriteLine("Exiting...");
        }
    }
}

1 个答案:

答案 0 :(得分:2)

据我所知,Windows不是为chroot风格的行为而设计的。你得到的最接近的是文件系统虚拟化,但是a)与SHGetFolderPath无关,而b)是在不考虑通用性的情况下实现的。所以我不认为你真正想要的是什么。