4

我面临着非常奇怪的问题:

我在 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

请注意:这不是输入错误,它们指的是相反的文件夹(这是 microsoft 对于 64 位操作系统的决定),您可以阅读https://msdn.microsoft.com/en-us/library/aa384187.aspx详细解释。

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

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

重要提示:在本地系统用户下启动应用程序时会遇到此问题(即应用程序已由窗口服务启动),当用户显式启动应用程序时不会有任何问题,因为在这种情况下,用户应用程序数据文件夹对于 64 位和 32 位应用程序将是相同的。

4

4 回答 4

1

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

如果您都做不到,请创建一个 32 位应用程序,该应用程序只查找应用程序数据路径,然后从您的 C# 应用程序运行它。32 位应用程序可以用 C、C# 或 Java 编写。

于 2015-02-11T21:33:38.540 回答
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");

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

于 2015-02-11T07:34:59.587 回答
0

您是否使用“快捷方式”关键字指向 appdata 目录,例如 %APPDATA%?您能否使用直接路径,例如 @"C:\Users\%username%\AppData\Local"

于 2015-02-11T07:04:55.887 回答
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获取32bit应用数据...

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");
        ...
于 2019-04-22T18:24:59.067 回答