विंडोज 64 बिट पर प्रोग्राम फाइल्स (x86) कैसे प्राप्त करें


153

मैं उपयोग कर रहा हूँ:

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

यह निर्धारित करने के लिए कि क्या किसी उपयोगकर्ता मशीन पर एक प्रोग्राम का पता चला है (यह आदर्श नहीं है, लेकिन मैं जिस प्रोग्राम की तलाश कर रहा हूं वह एमएस-डॉस एप्लिकेशन का एक सही पुराना कीचड़ है, और मैं दूसरी विधि के बारे में नहीं सोच सकता)।

Windows XP और Windows Vista के 32-बिट संस्करणों पर यह ठीक काम करता है। हालाँकि, x64 विंडोज विस्टा पर कोड x64 प्रोग्राम फाइल्स फोल्डर को लौटा देता है, जबकि एप्लीकेशन प्रोग्राम फाइल्स x86 में स्थापित है। क्या प्रोग्राम फाइल x86 के रास्ते को हार्ड वायरिंग के बिना "C: \ Program Files (x86)" पर वापस लाने का कोई तरीका है?


9
यह ध्यान देने योग्य है कि यह "प्रोग्राम फाइलों" को केवल 64 बिट ओएस पर 64 बिट एप्लिकेशन में देता है। यदि आप अपने आवेदन को विशेष रूप से x86 के रूप में संकलित करते हैं तो यह इस कोड का उपयोग करके 64 बिट ओएस पर "प्रोग्राम फाइलें (x86)" लौटाएगा।
विटालिबी

जवाबों:


230

नीचे दिए गए कार्य x86 Program Filesनिर्देशिका को इन तीनों विंडोज कॉन्फ़िगरेशन में वापस कर देंगे :

  • 32 बिट विंडोज
  • 32 बिट प्रोग्राम 64 बिट विंडोज पर चल रहा है
  • 64 बिट प्रोग्राम 64 बिट विंडो पर चल रहा है

 

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

    return Environment.GetEnvironmentVariable("ProgramFiles");
}

1
क्या कोई टिप्पणी कर सकता है कि क्या यह स्थानीय वातावरण में काम करता है? अग्रिम धन्यवाद ...
टॉम

यह परीक्षण क्यों: 8 == IntPtr.Size?
फ्लोरियन

1
@Florian यह 64 बिट प्रक्रिया के लिए जाँच करने के लिए एक परीक्षण है
JaredPar

10
सिर्फ Environment.Is64BitOperatingSystemया क्यों नहीं Environment.Is64BitProcess?
ऑसविन

7
@anustart 2008 में इसका जवाब दिया गया था, इससे पहले कि वे तरीके .NET 4.0 में उपलब्ध थे।
रोटेम

135

यदि आप .NET 4 का उपयोग कर रहे हैं, तो एक विशेष फ़ोल्डर एन्यूमरेशन ProgramFilesX86 है :

Environment.GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)

2
यह 32 बिट ओएस पर कैसे व्यवहार करता है? क्या यह x86 के बिना "c: \ Program फ़ाइलें" लौटाता है?
मार्सेल गोसलिन

6
हाँ। यह x86 पर c: \ program files और 64-बिट विंडो पर c: \ program files (x86) को लौटाएगा।
नाथन

2
इसे स्वयं टेस्ट करें - सर्वर 2003 32 बिट पर, यह मेरे लिए खाली स्ट्रिंग लौटाता है: Console.WriteLine ("X86:" + System.Environment.GetFolderPath (System.Environment.SpecialFolder.ProfFilesX86));
डेविड ईसन

4
Windows XP (32 बिट) पर खाली स्ट्रिंग भी लौटाता है
पैट्रिक मैकडोनाल्ड

12
Microsoft के दस्तावेज़ीकरण में कहा गया है: "एक x86 सिस्टम पर, ProgramFilesX86 के सदस्य को पर्यावरण में भेजना ।GetFolderPath विधि String.Empty पर लौटती है। इसके बजाय ProgramFiles के सदस्य का उपयोग करें। आप यह निर्धारित कर सकते हैं कि Windows 32-बिट ऑपरेटिंग सिस्टम है जिसे Environment.Is64BitOperatingSystem संपत्ति कहा जाता है। । "
goodies4uall


14

हालाँकि, ध्यान दें कि ProgramFiles(x86) वातावरण चर केवल तभी उपलब्ध है जब आपका अनुप्रयोग 64-बिट चल रहा हो।

यदि आपका एप्लिकेशन 32-बिट चल रहा है, तो आप केवल ProgramFilesपर्यावरण चर का उपयोग कर सकते हैं जिसका मूल्य वास्तव में "प्रोग्राम फाइल्स (x86)" होगा।


आधी हकीकत। हालांकि, यह स्पष्ट है कि उनका आवेदन 32-बिट के रूप में चल रहा है, अन्यथा GetFolderPath () पहले से ही किसी भी तरह से सही एक्सपीरिया वापस कर देगा।
तोमसर

बहुत मददगार! यह सिर्फ मुझे काम के घंटे बचाया! और मेरे कोड का उपयोग करने से लोगों को बचाया। यह बहुत अच्छा है जब चीजें बॉक्स से बाहर निकलती हैं!
डेविड सिल्वा स्मिथ

9

एक रास्ता "ProgramFiles (x86)" पर्यावरण चर को देखने के लिए होगा:

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

5

मैं एक एप्लिकेशन लिख रहा हूं जो विंडोज 7 के लिए x86 और x64 दोनों प्लेटफॉर्म पर चल सकता है और नीचे दिए गए वैरिएबल को क्वेरी करके किसी भी प्लेटफॉर्म पर सही प्रोग्राम फाइल्स फोल्डर पाथ को खींचता है।

Environment.GetEnvironmentVariable("PROGRAMFILES")

वास्तव में, इसे स्वीकार्य उत्तर के रूप में भी चिह्नित किया जाना चाहिए। यह तर्क परीक्षण करने से बहुत बेहतर है। हालांकि, यह ऐप के संकलित बिट-प्रकार के लिए उपयुक्त फ़ोल्डर को वापस कर देगा। मतलब, अगर आपने 32 बिट में ऐप संकलित किया है, तो यह 32 बिट ओएस पर "प्रोग्राम फाइल्स" और 64 बिट ओएस पर "प्रोग्राम फाइल्स (x86)" लौटाएगा। उत्तम!
शिष्यमाइकल

सावधान रहें: सवाल यह है कि "विंडोज 64 बिट पर प्रोग्राम फाइल्स (x86) कैसे प्राप्त करें" और "रनिंग एप्लिकेशन का सही प्रोग्राम फाइल फ़ोल्डर कैसे प्राप्त करें"। तो यह जवाब, जो कार्यक्षमता के मामले में सही है, सवाल का प्रासंगिक जवाब नहीं है।
टेडेबस

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 बिट असेंबली अनचेक करेंगे:

32 बिट प्रक्रिया पर 32-बिट कोड के लिए JIT

64 बिट प्रक्रिया पर 32-बिट कोड के लिए JIT

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.