2010-05-28 13 views
18

यदि कोई फ़ाइल बनाने में कुछ गलत हो जाता है, तो मैं एक अस्थायी फ़ाइल में लिख रहा हूं और फिर गंतव्य पर जा रहा हूं। की तरह कुछ: निर्देशिका:File.Move लक्ष्य निर्देशिका से अनुमतियों का वारिस नहीं है?

 var destination = @"C:\foo\bar.txt"; 
     var tempFile = Path.GetTempFileName(); 
     using (var stream = File.OpenWrite(tempFile)) 
     { 
      // write to file here here 
     } 

     string backupFile = null; 
     try 
     { 
      var dir = Path.GetDirectoryName(destination); 
      if (!Directory.Exists(dir)) 
      { 
       Directory.CreateDirectory(dir); 
       Util.SetPermissions(dir); 
      } 

      if (File.Exists(destination)) 
      { 
       backupFile = Path.Combine(Path.GetTempPath(), new Guid().ToString()); 
       File.Move(destination, backupFile); 
      } 

      File.Move(tempFile, destination); 

      if (backupFile != null) 
      { 
       File.Delete(backupFile); 
      } 
     } 
     catch(IOException) 
     { 
      if(backupFile != null && !File.Exists(destination) && File.Exists(backupFile)) 
      { 
       File.Move(backupFile, destination); 
      } 
     } 

समस्या यह है कि नई 'bar.txt "इस मामले में" \ foo सी' से अनुमतियों को इनहेरिट नहीं करता है। फिर भी अगर मैं सीधे "सी: \ foo" में एक्सप्लोरर/नोटपैड इत्यादि के माध्यम से एक फाइल बना देता हूं तो कोई समस्या नहीं है, इसलिए मेरा मानना ​​है कि अनुमतियां "सी: \ foo" पर सही ढंग से सेट की गई हैं।

अद्यतन

मिले Inherited permissions are not automatically updated when you move folders, हो सकता है यह रूप में अच्छी तरह फ़ाइलों के लिए लागू होता है। अब फ़ाइल अनुमतियों के अद्यतन को मजबूर करने के लिए एक तरीका तलाश रहे हैं। क्या ऐसा करने का एक बेहतर तरीका है?

उत्तर

26

मिले मैं इस था क्या जरूरत:

var fs = File.GetAccessControl(destination); 
fs.SetAccessRuleProtection(false, false); 
File.SetAccessControl(destination, fs); 

इस फाइल अनुमति रीसेट करता है वारिस के।

+2

क्या आपको फ़ाइल को पहले से ही स्थानांतरित करने के बाद ऐसा करना होगा? इस मामले में यह अब परमाणु नहीं है - अनुमतियों से पहले फ़ाइल को पढ़ने और पढ़ने के लिए कोई जोखिम हो सकता है – Neil

+1

@ नील हाँ, यह कदम के बाद होगा और हाँ यह अब परमाणु नहीं बनायेगा। –

+3

@ जोसेफकिंग्री। धन्यवाद, इससे मुझे मदद मिली। लेकिन, मैं मूव के परिणामस्वरूप किसी भी स्पष्ट अनुमति को हटाना चाहता था। कोड की बस कुछ और पंक्तियां। http://stackoverflow.com/a/12821819/486660 – Jim

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