C # - วิธีรับไฟล์โปรแกรม (x86) ใน Windows 64 บิต


153

ฉันกำลังใช้:

FileInfo(
    System.Environment.GetFolderPath(
        System.Environment.SpecialFolder.ProgramFiles) 
    + @"\MyInstalledApp"

เพื่อตรวจสอบว่าโปรแกรมตรวจพบในเครื่องผู้ใช้ (ไม่เหมาะ แต่โปรแกรมที่ฉันกำลังมองหาคือ kludge แบบเก่าที่ถูกต้องของแอปพลิเคชัน MS-DOS และฉันไม่สามารถคิดวิธีอื่นได้)

ใน Windows XP และ Windows Vista รุ่น 32 บิตทำงานได้ดี อย่างไรก็ตามใน x64 Windows Vista โค้ดจะส่งคืนโฟลเดอร์ x64 Program Files ในขณะที่ติดตั้งแอปพลิเคชันใน Program Files x86 มีวิธีที่จะส่งคืนพา ธ ไปยัง Program Files x86 โดยทางโปรแกรมโดยไม่ต้องเดินสายไฟอย่างยากลำบาก "C: \ Program Files (x86)" หรือไม่?


9
เป็นที่น่าสังเกตว่าสิ่งนี้จะส่งคืน "ไฟล์โปรแกรม" เฉพาะในแอปพลิเคชัน 64 บิตบนระบบปฏิบัติการ 64 บิต หากคุณรวบรวมแอปพลิเคชันของคุณเป็น x86 โดยเฉพาะมันจะส่งคืน "ไฟล์โปรแกรม (x86)" ในระบบปฏิบัติการ 64 บิตโดยใช้รหัสนี้
VitalyB

คำตอบ:


230

ฟังก์ชั่นด้านล่างจะส่งคืนProgram Filesไดเรกทอรีx86 ในการกำหนดค่า Windows ทั้งสามนี้:

  • Windows 32 บิต
  • โปรแกรม 32 บิตทำงานบน Windows 64 บิต
  • โปรแกรม 64 บิตทำงานบน Windows 64 บิต

 

static string ProgramFilesx86()
{
    if( 8 == IntPtr.Size 
        || (!String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))))
    {
        return Environment.GetEnvironmentVariable("ProgramFiles(x86)");
    }

    return Environment.GetEnvironmentVariable("ProgramFiles");
}

1
ทุกคนสามารถแสดงความคิดเห็นว่าการทำงานในสภาพแวดล้อมที่แปลเป็นภาษาท้องถิ่นหรือไม่? ขอบคุณล่วงหน้า ...
Tom

ทำไมการทดสอบนี้: 8 == IntPtr.Size
Florian

1
@Florian เป็นการทดสอบเพื่อตรวจสอบกระบวนการ 64 บิต
JaredPar

10
ทำไมไม่เพียงEnvironment.Is64BitOperatingSystemหรือEnvironment.Is64BitProcess?
osvein

7
@anustart นี่เป็นคำตอบในปี 2008 ก่อนที่วิธีการเหล่านั้นจะพร้อมใช้งานใน. NET 4.0
Rotem

135

หากคุณใช้. NET 4 จะมีการแจกแจงโฟลเดอร์พิเศษProgramFilesX86 :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

2
สิ่งนี้มีผลอย่างไรกับระบบปฏิบัติการ 32 บิต มันส่งคืน "c: \ Program files" ที่ไม่มี x86 หรือไม่
Marcel Gosselin

6
ใช่. มันจะส่งคืนไฟล์ c: \ program บนไฟล์ x86 และ c: \ program (x86) บน Windows 64 บิต
นาธาน

2
ทดสอบด้วยตัวเอง - บน Server 2003 32 บิตนี่จะส่งคืนสตริงว่างสำหรับฉัน: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProgramFilesX86));
David Eison

4
ส่งคืนสตริงว่างใน Windows XP (32 บิต) ด้วยเช่นกัน
Patrick McDonald

12
สถานะเอกสารของ Microsoft: "บนระบบ x86 ผ่านสมาชิก ProgramFilesX86 ไปยัง Environment.GetFolderPath วิธีการคืนค่า String.Empty ให้ใช้สมาชิก ProgramFiles แทนคุณสามารถกำหนดได้ว่า Windows เป็นระบบปฏิบัติการแบบ 32 บิตหรือไม่โดยเรียกคุณสมบัติ Environment.Is64BitOperatingSystem ."
goodies4uall


14

อย่างไรก็ตามโปรดทราบว่าProgramFiles(x86)ตัวแปรสภาพแวดล้อมจะใช้ได้เฉพาะเมื่อแอปพลิเคชันของคุณใช้ 64- บิตเท่านั้น

หากแอปพลิเคชันของคุณใช้ 32- บิตคุณสามารถใช้ProgramFilesตัวแปรสภาพแวดล้อมซึ่งค่าจะเป็น "Program Files (x86)"


จริงเพียงพอ แต่ก็เป็นที่ชัดเจนว่าแอพลิเคชันของเขาจะทำงานเป็น 32 บิตมิฉะนั้น GetFolderPath () จะได้รับการกลับ x86 โฟลเดอร์ที่เหมาะสมอยู่แล้ว
tomasr

มีประโยชน์มาก! เพียงแค่ช่วยฉันชั่วโมงทำงาน! และช่วยให้ผู้คนไม่ต้องใช้รหัสของฉัน มันยอดเยี่ยมเมื่อทุกอย่างออกมานอกกรอบ!
David Silva Smith

9

วิธีหนึ่งคือการมองหาตัวแปรสภาพแวดล้อม "ProgramFiles (x86)":

String x86folder = Environment.GetEnvironmentVariable("ProgramFiles(x86)");

5

ฉันกำลังเขียนแอปพลิเคชันซึ่งสามารถทำงานได้ทั้งบนแพลตฟอร์ม x86 และ x64 สำหรับ Windows 7 และการสืบค้นตัวแปรด้านล่างเพียงดึงเส้นทางโฟลเดอร์แฟ้มโปรแกรมที่ถูกต้องบนแพลตฟอร์มใด ๆ

Environment.GetEnvironmentVariable("PROGRAMFILES")

จริง ๆ แล้วควรทำเครื่องหมายเป็นคำตอบที่ยอมรับได้เช่นกัน นี่ดีกว่าการทดสอบตรรกะอย่างมาก อย่างไรก็ตามมันจะส่งคืนโฟลเดอร์ที่เหมาะสมสำหรับการรวบรวมแอพประเภทบิต หมายความว่าหากคุณรวบรวมแอปในแบบ 32 บิตมันจะส่งคืน "ไฟล์โปรแกรม" ในระบบปฏิบัติการ 32 บิตและ "ไฟล์โปรแกรม (x86)" ในระบบปฏิบัติการ 64 บิต ที่สมบูรณ์แบบ!
DiscipleMichael

ระวัง: คำถามคือ "วิธีรับไฟล์โปรแกรม (x86) ใน Windows 64 บิต" และไม่ใช่ "วิธีรับโฟลเดอร์ไฟล์โปรแกรมที่ถูกต้องของแอปพลิเคชันที่ทำงานอยู่" ดังนั้นคำตอบนี้ถูกต้องในแง่ของการใช้งานไม่ใช่คำตอบที่เกี่ยวข้องกับคำถาม
tedebus

0

หนึ่งซับโดยใช้วิธีการใหม่ใน. NET จะส่งคืนโฟลเดอร์โปรแกรมไฟล์ x86 เสมอ

Environment.Is64BitOperatingSystem ? Environment.GetEnvironmentVariable("ProgramFiles(x86)") : Environment.GetEnvironmentVariable("ProgramFiles"))


0

รหัส C #:

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

เอาท์พุท:

C: \ Program Files (x86)

บันทึก:

เราจำเป็นต้องบอกคอมไพเลอร์ว่าไม่ต้องการแพลตฟอร์มการสร้างที่เฉพาะเจาะจง

Go to Visual Studio > Project Properties > Build > Uncheck "Prefer 32 bit"

เหตุผล:

โดยค่าเริ่มต้นสำหรับโครงการ. NET ส่วนใหญ่คือ "ต้องการ CPU 32 บิตใด ๆ "

เมื่อคุณยกเลิกการเลือกชุดประกอบ 32 บิตจะ:

JIT เป็นรหัส 32 บิตในกระบวนการ 32 บิต

JIT เป็นรหัส 32 บิตในกระบวนการ 64 บิต

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.