2009-05-26 4 views
7

प्रक्रिया बढ़ी है और मैंने यह सुनिश्चित किया कि पथ वीएस डीबगर में सही था (मैं पर्यावरण का उपयोग कर रहा हूं। गेटफोल्डरपैथ (पर्यावरण। स्पेशलफोल्डर सिस्टम) इसे हार्ड कोडिंग नहीं कर रहा है) लेकिन फाइल.इक्सिस्ट अभी भी झूठी वापसी करते हैं।.NET File.Exists Windows System32 Drivers फ़ोल्डर में काम नहीं करता है?

मुझे जिस कारण की आवश्यकता है, यह सुनिश्चित करने के लिए एक कामकाज है कि कुछ तृतीय पक्ष ड्राइवर स्थापित हैं क्योंकि उनकी रजिस्ट्री सेटिंग्स को अनइंस्टॉल करने पर हटाया नहीं गया है।

मुझे पता है कि वर्चुअलाइजेशन के माध्यम से रीडायरेक्ट किए जाते हैं लेकिन क्या यह फ़ाइल के अस्तित्व की जांच के लिए भी सच है?

+0

मेरे लिए ठीक काम करता है। आपका पर्यावरण क्या है? – Noldorin

उत्तर

10

हां, वर्चुअलाइजेशन बहुत कम स्तर पर होता है। File.Exists विधि मूल रूप से Win32 CreateFile विधि को कॉल करता है और त्रुटियों के लिए जांच करता है। CreateFile को वाह उपप्रणाली द्वारा पुनर्निर्देशित किया जाता है।

आप कॉल करने से पहले अस्थायी रूप से वर्चुअलाइजेशन अक्षम कर सकते हैं।

[DllImport("kernel32", CharSet=CharSet.Unicode, SetLastError=true)] 
public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr oldValue); 

[DllImport("kernel32", CharSet=CharSet.Unicode, SetLastError=true)] 
public static extern bool Wow64RevertWow64FsRedirection(IntPtr oldValue); 
बेशक

पूरा आप बंद के रूप में पर वर्चुअलाइजेशन के साथ फाइल होने की जाँच करने के साथ ही होगा होने के लिए। रजिस्ट्री प्रविष्टियों की जांच के लिए भी यही लागू होता है।

public static bool FileExists(string path) 
{ 
    if(File.Exists(path)) return true; 
    IntPtr oldValue = IntPtr.Zero; 
    try 
    { 
     if(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432") == null) 
      return false; 

     Wow64DisableWow64FsRedirection(ref oldValue); 
     if(File.Exists(path)) return true; 

     return false; 
    } 
    finally 
    { 
     if(oldValue != IntPtr.Zero) 
      Wow64RevertWow64FsRedirection(ref oldValue);    
    } 
} 

अद्यतन: तुम भी क्योंकि XP ​​के पुराने संस्करणों (पूर्व SP2 मेरा मानना ​​है कि) उन तरीकों के संपर्क में न वाह पुनर्निर्देशन अक्षम करने से पहले OS संस्करण जांच करने की आवश्यकता हो सकती है।

अपडेट 2: 64-बिट के लिए ओएस चेक जोड़ा गया। ओएस के सभी 64-बिट संस्करण इन तरीकों को लागू करते हैं और 64-बिट ओएस पर चलने पर आपको केवल सैट को अक्षम करने की आवश्यकता होती है।

+0

तो कोशिश/अंत में मुझे अभी भी ओएस संस्करण की जांच करने की आवश्यकता है? मुझे लगता है कि अंत में ब्लॉक फेंक देगा अगर यह समर्थित नहीं है। – Davy8

+0

हां - आखिरकार ब्लॉक अभी भी Wow64XXX विधि को कॉल करता है। –

2

क्या आपकी प्रक्रिया 32 बिट या 64 बिट है? और ड्राइवर 64 या 32 हैं? मुझे जो मिल रहा है वह यह है कि शायद आपका होस्ट ओएस आपको इसके बजाय Wow64 फ़ोल्डर में रीडायरेक्ट करता है।

0

यह एक वर्चुअलाइजेशन मुद्दा है - फ़ाइल बस वहां नहीं है। आपको वर्चुअलाइज्ड फ़ाइलों वाले फ़ोल्डर में इसकी तलाश करनी होगी।

0

यदि आपके पास अधिकार हैं, तो आप अपने कोड में उसी स्थान पर फ़ाइल बनाने का प्रयास क्यों नहीं करते हैं, और देखें कि यह कहां समाप्त होता है? जैसा कि किसी अन्य द्वारा सुझाया गया है, विंडोज़ कुछ सेटिंग्स के आधार पर आपकी कॉल को रीडायरेक्ट कर सकता है।

इसके अलावा, आप निर्देशिकाइन्फो करने का प्रयास कर सकते हैं और यह देखने के लिए फ़ाइलों को समझा सकते हैं कि कुछ भी परिचित दिखता है या नहीं।

2

क्या आपने अपने ऐप के लिए disabling folder virtualization कोशिश की है?

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
    <assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0"> 
    <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
     <security> 
      <requestedPrivileges> 
       <requestedExecutionLevel level="asInvoker" uiAccess="false"/> 
      </requestedPrivileges> 
     </security> 
    </trustInfo> 
</assembly> 

हालांकि, अगर आप उन फ़ोल्डर आप request admin ability करना होगा करने के लिए लिखने की ज़रूरत: आप एक प्रकट युक्त फ़ाइल को जोड़ने की आवश्यकता होगी। ऐसा करने के लिए, xml में level="asInvoker" से level="requireAdministrator" बदलें।

संबंधित मुद्दे