2011-12-25 25 views
7

हम एक निर्देशिका जो एक नेटवर्क निर्देशिका के भीतर है का उपयोग लेकिन गलत परिणाम प्राप्त (सी #/विंडोज) करने की कोशिश:कैसे Windows नेटवर्क ड्राइव करने के लिए फिर से कनेक्ट करने के लिए मजबूर करने

var exists = Directory.Exists("Z:\\Sessions\\Data1"); 

"Z" नेटवर्क निर्देशिका है, " सत्र "एक निर्देशिका है जहां एक रिकॉर्डिंग सॉफ्टवेयर लगातार निर्देशिका बनाता है (उदाहरण के लिए" डेटा 1 ") और इसमें कुछ डेटा डालता है। ऐसा लगता है कि विंडोज डेटा 1 के बारे में गलत स्थिति को कैश करता है: विधि गलत होती है। लेकिन जब मैं एक्सप्लोरर के माध्यम से निर्देशिका तक पहुंचता हूं तो यह यहां है। जब मैं एक्सप्लोरर के साथ निर्देशिका तक पहुंचने के बाद विधि (निर्देशिका.इक्सिस्ट) चलाता हूं, तो यह सच हो जाता है। बेशक मैं गारंटी दे सकता हूं कि निर्देशिका वास्तव में पहले प्रयास में मौजूद है।

इस व्यवहार का कारण क्या है? मैं इसमें क्या कर सकता हूँ?

संपादित करें: ऐसा लगता है कि विंडोज़ नेटवर्क ड्राइव को रिमोट कंप्यूटर से कनेक्ट नहीं कर सका। जब मैं एक्सप्लोरर के साथ निर्देशिका में नेविगेट करने का प्रयास करता हूं तो यह स्वचालित रूप से ड्राइव को कनेक्ट करने का प्रयास करता है।

तो सवाल बदलता है: क्या .NET के माध्यम से पुन: कनेक्ट करने का प्रयास करने के लिए विंडोज़ को मजबूर करने का कोई तरीका है?

समाधान: Reconnecting a disconnected network drive

+0

यदि आप कमांड प्रॉम्प्ट से 'DIR' कमांड के साथ निर्देशिका तक पहुंचते हैं, तो क्या आपको सही जानकारी मिलती है? यही है: 'डीआईआर जेड: \ सत्र \ डेटा 1'। –

+0

नहीं, कमांड प्रॉम्प्ट के माध्यम से निर्देशिका तक पहुंचने से नेटवर्क ड्राइव कनेक्शन रीफ्रेश नहीं होता है। कृपया मेरा संपादन देखें ... – nepa

उत्तर

0

इस व्यवहार के लिए कारण क्या है?

documentation से

उद्धरण:

आप एक न्यूनतम केवल पढ़ने के लिए निर्देशिका की अनुमति, में नहीं है, तो मौजूद है विधि अवास्तविक लौटाते हैं।


मैं इसके बारे में क्या कर सकते हैं?

सुनिश्चित करें कि आप एक ऐसे खाते के तहत अपना .NET एप्लिकेशन चला रहे हैं जिसमें कम से कम केवल इस फ़ोल्डर तक पहुंचने की अनुमति है। ध्यान दें कि यदि आप इसे एएसपी.NET एप्लिकेशन में लिख रहे हैं तो शायद यह मामला नहीं होगा, इस पर निर्भर करता है कि आपने अपने खाते को निष्पादित करने के लिए अपने वेब सर्वर को किस खाते में कॉन्फ़िगर किया है, इस खाते को अनुमति देने के लिए आवश्यक कदम उठाएं।

+0

ओपी के रूप में उल्लिखित, "जब मैं एक्सप्लोरर के साथ निर्देशिका तक पहुंचने के बाद विधि (निर्देशिका.इक्सिस्ट) चलाता हूं, तो यह सच हो जाता है।" - जिसका मतलब है कि सबसे अधिक संभावना है कि यह कैशिंग की समस्या है अनुमतियाँ –

+1

@ यूजीन मेवेव्स्की 'एल्डोस्कोप, जब आप एक्सप्लोरर का उपयोग करते हैं तो आप इसे अपने खाते के अंतर्गत चला रहे हैं। जब आप एएसपी.नेट आवेदन चला रहे हैं तो यह एक पूरी तरह से अलग खाते के तहत चलाया जा सकता है। तो मुझे लगता है कि ओपी ने यह परीक्षण करने के लिए किया था कि निर्देशिका मौजूद है, समान स्थितियों पर नहीं किया गया था: पहले मामले में उसने अपना खाता इस्तेमाल किया था जबकि दूसरे में दूसरे खाते का उपयोग किया जाता था (हम केवल अनुमान लगा सकते हैं कि कौन सा इस चरण में ओपी ने अपने आवेदन के बारे में बिल्कुल 0 संदर्भ प्रदान किया)। –

+0

मेरे द्वारा बनाई गई कुछ खोजों के कारण प्रश्न बदल गया, कृपया मेरे संपादन देखें। – nepa

2

मैं भी एक दूरस्थ ड्राइव का उपयोग करता हूं और कनेक्ट करने में कुछ सेकंड लगते हैं, इसलिए मैं बस प्रतीक्षा करता हूं और हर बार काम करता हूं। यदि यह कनेक्ट नहीं होता है, तो यह एक ईमेल भेजेगा और मैं इसे जांचूंगा।

 logger.Info("Create Z: drive "); 
     System.Diagnostics.Process process = new System.Diagnostics.Process(); 
     System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); 
     startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; 
     startInfo.FileName = "cmd.exe"; 
     startInfo.Arguments = @"/C net use z: \\" + Tools.servername + @"\SHARE_NAME_HERE /user:USER_NAME_HERE PASSWORD_HERE"; 
     process.StartInfo = startInfo; 
     process.Start(); 
     logger.Info("Z: drive created "); 

     // wait get Z: 
     int xtimestimeout = 5; 
     while (!Directory.Exists(@"Z:\") & (xtimestimeout > 0)) 
     { 
      Application.DoEvents(); 
      SetBalloonTip(@"Program", @"connecting... please wait"); 
      ShowBalloon(); 
      logger.Info("Creating Z:... waiting..."); 
      Application.DoEvents(); 
      System.Threading.Thread.Sleep(3000); 
      xtimestimeout -= 1; 
     } 

     // check for sucessfull creation of Z: in server Z:\somedirectory 
     if (!Directory.Exists(@"Z:\")) 
     { 
      SendEmail2("Oh my... help!", "drive Z: not created <<< CHECK!"); 
      logger.Info("Z: email sent because of not created"); 
     } 
     logger.Info("Z: drive created successfully."); 
+0

ठीक है, कोई मेरा जवाब -1 के साथ ध्वजांकित करता है। मुझे समझ में नहीं आता क्यों क्योंकि मेरे पास भी वही स्थिति है जैसा प्रश्न और यह कोड हल करता है। यह कोड काम करता है और केवल .NET कोड का उपयोग करता है, बाहरी लाइब्रेरी को उस समाधान के रूप में नहीं जिसे समाधान के रूप में चिह्नित किया गया था। –

+0

चिंता न करें, मैंने इसे वोट दिया है। यह वास्तव में एक अच्छा समाधान है, ठीक वही है जो मैं करने की कोशिश कर रहा हूं। लेकिन मैं भी नहीं चाहता कि cmd विंडो दिखाई दे। हालांकि, मैंने आपके कोड का परीक्षण नहीं किया है, लेकिन यह आशाजनक लग रहा है। धन्यवाद। – xmen

1

मुझे यकीन है कि जो mpr.dll समाधान लिंक के संस्करण ऊपर के साथ काम करता नहीं हूँ, लेकिन मैं Win7 उपयोग कर रहा हूँ और एक अलग संस्करण (हालांकि समान) है। इस प्रविष्टि बिंदु है:

[DllImport("mpr.dll", SetLastError = true, EntryPoint = "WNetRestoreSingleConnectionW", CharSet = CharSet.Unicode)] 
    internal static extern int WNetRestoreSingleConnection(IntPtr windowHandle, 
                  [MarshalAs(UnmanagedType.LPWStr)] string localDrive, 
                  [MarshalAs(UnmanagedType.Bool)] bool useUI); 
तो

:

IntPtr hWnd = new IntPtr(0); 
int res = WNetRestoreSingleConnection(hWnd, <your drive path>, false); 

आप अपनी खुद की त्रुटि जाँच/हैंडलिंग जोड़ना होगा।

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

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