2009-11-09 14 views
8

मैंने एसओ की खोज की है लेकिन कुछ भी नहीं मिला है।निर्देशिका। डेलेट काम नहीं करता है। एक्सेस से इनकार कर दिया गया लेकिन विंडोज एक्सप्लोरर के तहत यह ठीक है

यह क्यों काम नहीं करता है?

Directory.Delete(@"E:\3\{90120000-001A-0000-0000-0000000FF1CE}-C"); 

ऊपर की रेखा अपवाद को फेंक देगा "एक्सेस अस्वीकार कर दी गई है"। मेरे पास व्यवस्थापक rigths है और मैं एक्सप्लोरर के साथ डीआईआर हटा सकते हैं।

यह कुछ वर्जित वर्णों की तरह दिखता है? लेकिन विंडोज एक्सप्लोरर इसे संभाल सकता है। मैं ऐसे नामों के साथ निर्देशिका कैसे हटा सकता हूं?

+2

क्या निर्देशिका खाली है? क्या आपने sysinternal उपकरण के साथ "पता लगाने" की कोशिश की? – Arthur

+0

हां, डीआईआर खाली है। मैंने sysinternals के बारे में नहीं सोचा था। Thx, मैं जल्द ही और अधिक परीक्षण करने की कोशिश करूंगा (लेकिन शायद किसी को पहले "बग" पकड़ लेंगे)। – binball

+3

मान लीजिए कि निर्देशिका केवल पढ़ी जाती है? निर्देशिका। हटाए जाने पर विफल रहता है, अनुमतियों के बावजूद (http://msdn.microsoft.com/en-us/library/fxeahc5f.aspx के नीचे देखें) –

उत्तर

16

आपके इनपुट के लिए धन्यवाद, यह मुझे समाधान की त्वरित खोज में मदद करता है।

फिल जैसा कि बताया जा "Directory.Delete विफल रहता है अगर ऐसा है, परवाह किए बिना अनुमति के (msdn.microsoft.com/en-us/library/... के नीचे देखें)"

इसके अलावा Unable to remove Read-Only attribute from folder माइक्रोसॉफ्ट का कहना है:

आप विंडोज एक्सप्लोरर का उपयोग कर फ़ोल्डर से केवल-पढ़ने योग्य विशेषता को हटाने में असमर्थ हो सकते हैं। इसके अलावा, कुछ प्रोग्राम त्रुटि संदेश प्रदर्शित कर सकते हैं जब आप फ़ाइलों को फ़ोल्डर में सहेजने का प्रयास करते हैं।

निष्कर्ष: हमेशा सभी डीआईआर हटाएं, फाइल विशेषताएँ अलग-अलग होने से पहले सामान्य होते हैं। नीचे दिए गए कोड तो समस्या का समाधान:

System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"E:\3\{90120000-0021-0000-0000-0000000FF1CE}-C1"); 

if (dir.Exists) 
{ 
    setAttributesNormal(dir); 
    dir.Delete(true); 
} 

. . . 

function setAttributesNormal(DirectoryInfo dir) { 
    foreach (var subDir in dir.GetDirectories()) 
     setAttributesNormal(subDir); 
    foreach (var file in dir.GetFiles()) 
    { 
     file.Attributes = FileAttributes.Normal; 
    } 
} 
+0

जब मैं इसे आज़माता हूं तो मुझे 'पहुंच से वंचित' मिलता है। मेरा एप्लिकेशन एक ऐसी प्रक्रिया को कॉल करता है जो निर्देशिका बनाता है। बाद के चरण में, मुझे निर्देशिका को हटाने की आवश्यकता है और मुझे 'पहुंच से वंचित' मिलता है। कोई समाधान? – rajkiran

+0

सफलता! जब मैंने 'setAttributesNormal' फ़ंक्शन' के अंत में निम्न पंक्ति जोड़ दी: 'dir.Attributes = FileAttribute.Normal' –

2

क्या आपने DirectoryInfo कक्षा का एक नया उदाहरण बनाने की कोशिश की है, और फिर हटाए जाने से पहले मौजूद जांच की है? कोड इस तरह दिखेगा:

 System.IO.DirectoryInfo dir = new System.IO.DirectoryInfo(@"E:\3\{90120000-001A-0000-0000-0000000FF1CE}-C"); 
     if (dir.Exists) 
      dir.Delete(true); 

इसके अलावा, कृपया है कि आप (उपयोगकर्ता अनुप्रयोग चल) फ़ोल्डर तक पहुँच गया है। यदि यह नेटवर्क मैप किए गए ड्राइव है, तो उसे एप्लिकेशन चलाने वाले उपयोगकर्ता द्वारा हटाया जा सकता है।

आशा है कि इससे मदद मिलती है!

+0

सेट की अनुमति के बावजूद पहुंच को अस्वीकार कर रहा था, यह वही है जो मैं कर रहा था, और यह काम नहीं करता था। –

2

निर्देशिका में आप जिस निर्देशिका में काम कर रहे हैं उसके आधार पर, आपको शायद फ़ाइलों को हटाने के लिए व्यवस्थापक पहुंच की आवश्यकता होगी। इसका परीक्षण करने के लिए, अपने ऐप को एक्सप्लोरर से व्यवस्थापक के रूप में चलाएं और देखें कि यह काम करता है (.exe पर राइट-क्लिक करें और "व्यवस्थापक के रूप में चलाएं" चुनें)।

यदि यह काम करता है, तो आपके आवेदन निष्पादित होने पर आपको व्यवस्थापकीय विशेषाधिकार प्राप्त करने होंगे। आप अपने आवेदन मेनिफेस्ट में निम्नलिखित जोड़कर ऐसा कर सकते हैं:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3"> 
    <security> 
    <requestedPrivileges> 
     <requestedExecutionLevel level="requireAdministrator" /> 
    </requestedPrivileges> 
    </security> 
</trustInfo> 
+0

यह समस्या को हल नहीं करता है, हालांकि यह आमतौर पर एक्सेस समस्याओं के लिए करता है। –

0

मैं इस लक्षण था, और यह वास्तव में ही Explorer.exe कि निर्देशिका ताला लगा हुआ था।मैं handle.exe का उपयोग कर इस पाया है, लेकिन एक भी powershell उपयोग कर सकते हैं जो प्रक्रिया फ़ाइल ताला लगा है लगता है:

$lockedFile = "C:\Windows\System32\wshtcpip.dll" 
Get-Process | foreach{$processVar = $_; $_.Modules | foreach { if ($_.FileName -like "${lockedFile}*") { $processVar.Name + " PID:" + $processVar.id + " [" + $_.Filename + "]"}}} 

फिर आप चाहे वह प्रक्रिया शान या नहीं रोकने की कोशिश करने का फैसला किया है; यह फ़ाइल ताला लगा किसी भी प्रक्रियाओं को बंद करने की कोशिश करने के powershell स्क्रिप्ट को संशोधित करने के लिए आसान होगा:

$lockedFile = "C:\directory_I_want_to_delete" 
Get-Process | foreach{$processVar = $_; $_.Modules | foreach { if ($_.FileName -like "${lockedFile}*") { write-host $processVar.Name + " PID:" + $processVar.id + " [" + $_.Filename + "]" ; write-host "Killing process..." ; stop-process -pid $processVar.id -force }}} 
5

मैं binball के कोड का इस्तेमाल किया और निर्देशिका भी सामान्य करने के लिए जिम्मेदार बताते हैं स्थापित करने के लिए एक लाइन जोड़ दिया।

if (dir.Exists) 
    { 
     setAttributesNormal(dir); 
     dir.Delete(true); 
    }  

function setAttributesNormal(DirectoryInfo dir) 
    { 
     foreach (var subDir in dir.GetDirectories()) 
     { 
      setAttributesNormal(subDir); 
      subDir.Attributes = FileAttributes.Normal; 
     } 
     foreach (var file in dir.GetFiles()) 
     { 
      file.Attributes = FileAttributes.Normal; 
     } 
    } 
+0

जब मैं इसे आज़माता हूं तो मुझे 'पहुंच से वंचित' मिलता है। मेरा एप्लिकेशन एक ऐसी प्रक्रिया को कॉल करता है जो निर्देशिका बनाता है। बाद के चरण में, मुझे निर्देशिका को हटाने की आवश्यकता है और मुझे 'पहुंच से वंचित' मिलता है। कोई समाधान? – rajkiran

+0

सुनिश्चित करें कि प्रक्रिया फ़ाइलों के लिए कोई खुला कनेक्शन नहीं छोड़ती है, अन्यथा आप मुद्दों में भाग लेंगे। मुझे यकीन है कि आपके पास पूर्ण नियंत्रण, जैसे पूर्ण नियंत्रण, आदि है ... – Chuck

+0

मैं सुझाव दूंगा क्योंकि यह एक निर्देशिका रिकर्सिव ऑपरेशन है, आपको 'subDir.Attributes = FileAttributes.Normal' लाइन को अंत में ले जाना चाहिए उस समारोह में लक्ष्य निर्देशिका भी शामिल होगी और इसे पुनरावर्ती रूप से निष्पादित किया जाएगा। – Jeremy

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

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