2010-04-23 43 views
5

मैं इतना है कि अन्य क्लोन सेवाओं फ़ाइल का उपयोग नहीं कर सकते हैं एक फ़ाइल लॉक करने के लिए कोशिश कर रहे हैं के माध्यम से अलग है। मैं फिर फ़ाइल पढ़ता हूं, और फिर समाप्त होने पर फ़ाइल को ले जाता हूं। FileShare.Delete का उपयोग करके मूव की अनुमति है।लॉक किया जा रहा व्यवहार नेटवर्क शेयर

हालांकि बाद में परीक्षण में, हमने पाया है कि इस दृष्टिकोण हम एक साझा नेटवर्क को देख रहे हैं काम नहीं करता। मैं सराहना करता हूं कि मेरा दृष्टिकोण सबसे अच्छा नहीं हो सकता है, लेकिन मेरा विशिष्ट प्रश्न है:

स्थानीय फ़ाइल के विरुद्ध नीचे डेमो क्यों काम करता है, लेकिन नेटवर्क फ़ाइल के खिलाफ नहीं?

जितना अधिक विशिष्ट आप बेहतर हो सकते हैं, क्योंकि मुझे अपनी खोजों में बहुत कम जानकारी मिली है जो इंगित करता है कि नेटवर्क शेयर स्थानीय डिस्क पर अलग-अलग व्यवहार करते हैं।

string sourceFile = @"C:\TestFile.txt"; 
string localPath = @"C:\MyLocalFolder\TestFile.txt"; 
string networkPath = @"\\MyMachine\MyNetworkFolder\TestFile.txt"; 

File.WriteAllText(sourceFile, "Test data"); 

if (!File.Exists(localPath)) 
    File.Copy(sourceFile, localPath); 

foreach (string path in new string[] { localPath, networkPath }) 
{ 
    using (FileStream fsLock = File.Open(path, FileMode.Open, FileAccess.ReadWrite, (FileShare.Read | FileShare.Delete))) 
    { 
     string target = path + ".out"; 
     File.Move(path, target); //This is the point of failure, when working with networkPath 

     if (File.Exists(target)) 
      File.Delete(target); 
    } 

    if (!File.Exists(path)) 
     File.Copy(sourceFile, path); 
} 

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

+0

चेक। – Nayan

+0

अनुमतियां जांच की गई हैं, और ठीक हैं। सक्रिय उपयोगकर्ता के पास निर्देशिका पर पूर्ण नियंत्रण है और साझा करें – MattH

+0

किस तरह का ऑपरेटिंग सिस्टम शेयर प्रदान करता है? –

उत्तर

3

मेरा मानना ​​है कि System.IO.File.Open() Win32 एपीआई समारोह CreateFile का मानचित्रण()। इस समारोह [http://msdn.microsoft.com/en-us/library/aa363858(v=vs.85).aspx] के लिए माइक्रोसॉफ्ट के प्रलेखन में, यह निम्नलिखित का उल्लेख है:

Windows Server 2003 और Windows XP/2000: एक साझा करने उल्लंघन होता है, तो एक प्रयास एक रिमोट पर हटाने के लिए एक फ़ाइल या निर्देशिका को खोलने के लिए किया जाता है कंप्यूटर जब dwDesiredAccess पैरामीटर का मान DELETE एक्सेस ध्वज (0x00010000) है या किसी अन्य एक्सेस ध्वज के साथ किया गया है, और दूरस्थ फ़ाइल या निर्देशिका FILE_SHARE_DELETE के साथ खोला नहीं गया है। इस परिदृश्य में साझाकरण उल्लंघन से बचने के लिए, दूरस्थ फ़ाइल या निर्देशिका को केवल DELETE पहुंच के साथ खोलें, या हटाने के लिए फ़ाइल या निर्देशिका को खोलने के बिना DeleteFile को कॉल करें।

इसके अनुसार, आपको IO.File.Open() में FileAccess पैरामीटर के रूप में DELETE को पास करना होगा। दुर्भाग्यवश, DELETE गणना को एक विकल्प के रूप में शामिल नहीं किया गया था।

यह समस्या केवल Windows 2003 और पूर्व से संबंधित है। मैंने विंडोज 2008 आर 2 एसपी 1 पर अपना कोड परीक्षण किया है, और यह ठीक काम करता है। तो यह संभव है कि यह विंडोज 2008 पर भी काम करेगा। आप साझा फ़ोल्डर में लिखने की अनुमति है, तो

+0

धन्यवाद ब्रायन। यह एक वैध सारांश की तरह लगता है और बताता है कि मैं क्या देख रहा था। – MattH

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

  • कोई संबंधित समस्या नहीं^_^