我面临一个非常奇怪的问题:
我在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位应用程序将是相同的。
答案 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");
请注意,使用EnvironmentIs64BitOperatingSystem
和Environment.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");
...