2010-08-22 34 views
12

Tôi đang tìm một tệp bên trong thư mục hệ thống. Vấn đề là khi sử dụngNhận thư mục syswow64 bằng ứng dụng 32-bit

Environment.SystemDirectory 

Trên một máy x64, tôi vẫn nhận được thư mục System32, thay vì thư mục Systemwow64.

tôi cần để có được những "System32" thư mục trên máy x86, và thư mục "SystemWow64" trên x64

Bất kỳ ý tưởng?

EDIT: Để tìm SysWow64 tôi đang sử dụng "GetSystemWow64Directory". (Xem thêm thông tin ở đây:. pinvoke Chú ý là với các máy phi x64 - kết quả là '0' Hy vọng điều này sẽ giúp người

+0

có thể trùng lặp http://stackoverflow.com/questions/3094520/how-to-retreive-correct-path-of-either-system32-or- syswow64 – Kiquenet

Trả lời

9

Sử dụng SHGetSpecialFolderPath chức năng:

[DllImport("shell32.dll")] 
public static extern bool SHGetSpecialFolderPath(IntPtr hwndOwner, [Out]StringBuilder lpszPath, int nFolder, bool fCreate); 

string GetSystemDirectory() 
{ 
    StringBuilder path = new StringBuilder(260); 
    SHGetSpecialFolderPath(IntPtr.Zero,path,0x0029,false); 
    return path.ToString() 
} 

Sẽ trả lại System32 trên x86 và SysWow64 trên x64

10

Sử dụng Environment.GetFolderPath(Environment.SpecialFolder.SystemX86) thay

+0

I don ' t có SystemX86 trong enum của tôi (chỉ có "hệ thống", trả về thư mục system32). Tôi đang ở dưới .net 2.0 – Nissim

+1

Nếu bạn đang nhận được "System32" trong quy trình 32 bit trên máy 64 bit, có vẻ như bạn có chuyển hướng hệ thống tệp của Windows (http://msdn.microsoft.com /en-us/library/aa384187 (VS.85).aspx) đã tắt. Trường hợp đó như thế nào? Bạn có thể gọi 'Wow64EnableWow64FsRedirection' để đảm bảo rằng nó được bật (xem http://msdn.microsoft.com/en-us/library/aa365744(VS.85).aspx). –

+1

'SystemX86' được thêm vào' Environment.SpecialFolder' enum trong phiên bản 4 của .NET Framework. Xem [tại đây] (http://msdn.microsoft.com/en-us/library/system.environment.specialfolder%28v=vs.110%29.aspx). – Spooky

3

gì chương trình 32-bit của bạn nghĩ là System32 là. thực sự SysWOW64 - không ứng dụng mã 32-bit có bất kỳ kiến ​​thức rõ ràng của 64-bit, đó là những gì WOW64 chuyển hướng là dành cho

+0

Chính xác. Tôi chỉ muốn lấy thư mục hệ thống mặc định, nhưng tôi luôn nhận được thư mục system32 – Nissim

+0

@Nissim: System32 là thư mục mặc định. Nó chỉ là một nơi khác trong quy trình 32bit so với 64bit. Có lẽ nếu bạn nói * tại sao * bạn cần thông tin này, chúng tôi có thể giúp đỡ nhiều hơn (tức là mở rộng câu hỏi của bạn). – Richard

+0

Tôi cần lấy mã exe IIS để xác định phiên bản IIS. Tôi đang làm điều này bằng cách định vị tệp và truy xuất thông tin đó thông qua FileVersionInfo. Nhưng khi tôi đang sử dụng Path.Combine (Environment.SystemDirectory, @ "inetsrv \ inetinfo.exe") tôi nhận được FileNotFoundException. Đây không phải là vấn đề quan trọng, vì nếu thử nghiệm này không thành công, tôi sẽ truy xuất thông tin này thông qua các nguồn khác, nhưng vẫn ... – Nissim

0

Tôi đã gặp vấn đề tương tự. Các giải pháp là đặt mục tiêu nền tảng là x86 thay vì AnyCPU hoặc x64 trong thuộc tính dự án trong Visual Studio. Trong trường hợp này, đường dẫn sẽ là "C:\Windows\system32" nhưng nó thực sự chuyển hướng đến "C:\Windows\SysWOW64" Bạn có thể kiểm tra điều này bằng cách đặt bất kỳ tệp nào trong thư mục "C: \ Windows \ SysWOW64" và sau đó sử dụng lệnh File.Exists để kiểm tra xem tệp có được tìm thấy trong thư mục đó không:

File.Exists(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.System), sFileName)); 

Hoặc

File.Exists(Path.Combine(Environment.SystemDirectory, sFileName)); 

enter image description here

+1

Và sau đó bạn sẽ mất tất cả những lợi thế của 64 bit ... touché – Nissim

Các vấn đề liên quan