如何使用c#代码从64位机器上的64位应用程序获取32位应用程序数据文件夹

时间:2015-02-11 06:53:29

标签: c# .net windows appdata localsystem

我面临一个非常奇怪的问题:

我在64位Windows Server 2008 R2计算机上获得了64位c#.net应用程序,它由Windows服务调用,并在本地系统用户下启动,此外,这个64位c#.net应用程序启动32位java应用程序和这个java应用程序有应用程序数据文件夹到C:\ Windows \ SysWOW64 \ config \ systemprofile \ AppData。 64位c#.net应用程序的应用程序数据文件夹到C:\ Windows \ System32 \ config \ systemprofile \ AppData

因此对于32位应用程序应用程序数据文件夹(在本地系统用户的情况下): - C:\ Windows \ SysWOW64 \ config \ systemprofile \ AppData

对于64位应用程序应用程序数据文件夹(在本地系统用户的情况下): - C:\ Windows \ System32 \ config \ systemprofile \ AppData

请注意:这不是他们引用相反文件夹的错误输入(这是微软对64位操作系统的决定),您可以阅读https://msdn.microsoft.com/en-us/library/aa384187.aspx以获取详细说明。 < / p>

现在,我需要从64位应用程序将少量文件写入32位应用程序数据文件夹,因为这些文件将被32位Java应用程序使用。

所以,我需要知道如何使用c#.net从64位应用程序获取32位app数据文件夹。

重要说明:在本地系统用户下启动应用程序时会遇到此问题(即应用程序已通过窗口服务启动),当用户明确启动应用程序时,不会出现任何问题在这种情况下,用户应用程序数据文件夹对于64位和32位应用程序将是相同的。

4 个答案:

答案 0 :(得分:1)

首先检查您是否确实在64位操作系统上运行64位进程。如果是这样,你自己构建路径。否则,您只需检索系统路径并附加目标路径即可。

String path;
//detect if the current application is 64 bit and running on a 64 bit system
//NOTE: needs .NET Framework 4 to work
if (Environment.Is64BitOperatingSystem && Environment.Is64BitProcess)
{
    path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "SysWOW64");
}
else
{
    path = Environment.GetFolderPath(Environment.SpecialFolder.System);
}
//append your target path
path = Path.Combine(path, @"config\systemprofile\AppData");

请注意,使用EnvironmentIs64BitOperatingSystemEnvironment.Is64BitProcess至少需要.NET-Framework 4。

答案 1 :(得分:1)

最简单的解决方案是将C#应用程序重建为32位,或者使用64位Java。

如果您不能这样做,请创建一个32位应用程序,除了查找应用程序数据路径之外什么都不做,然后从C#应用程序运行它。 32位应用程序可以用C,C#或Java编写。

答案 2 :(得分:0)

您使用&#34;快捷方式&#34;指向appdata目录的关键字,例如%APPDATA%?你可以使用直接路径,例如@&#34; C:\ Users \%username%\ AppData \ Local&#34;

答案 3 :(得分:0)

这是与上面#2相同的答案(通过Sebastian Baumhekel),但已纠正了一些错误。我在Win 7上有相同的问题。正如某些人指出的那样,这可能并不适合将来的操作系统。但是它解决了我当前的问题。

当您以本地系统用户身份运行 32位Windows服务并询问该文件夹时,问题出在 64位Win7 上:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

它返回 64位版本(使用System32):

C:\Windows\System32\config\systemprofile\AppData\

主要澄清点(如OP所述):

SysWOW64 获取 32位应用程序数据...

System32 获取 64位应用程序数据...

这是来自OP链接:

https://docs.microsoft.com/en-us/windows/desktop/WinProg64/file-system-redirector

我只是浪费了4个小时的生命,所以我想澄清一下!

    public 32bitWindowsServiceOn64bitWindows()
    { 
        // Note: this service is configured to run as "Local System" user...

        string appdata;

        // need to do this, because this runs as Local System user... 
        // which gets the wrong SpecialFolder.ApplicationData (ie, System32 for 64bit apps) should be SysWOW64 (for 32bit apps)

        if (Environment.Is64BitOperatingSystem && Environment.Is64BitProcess)
        {
            // the application is a 64 bit app
            appdata = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "System32");
        }
        else
        {
            // the application is a 32 bit app
            appdata = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "SysWOW64");
        }
        // Append your target path. Do you want Local or Roaming?
        appdata = Path.Combine(appdata, @"config\systemprofile\AppData\Roaming\MyApp");
        //appdata = Path.Combine(appdata, @"config\systemprofile\AppData\Local\MyApp");
        ...