2010-01-05 12 views
10

मेरे पास एक ऐसा एप्लिकेशन है जो पुराने डेटा के लिए कुछ फ़ाइलों को देख रहा है। यह सुनिश्चित करने के लिए कि हम अच्छी परियोजनाओं को भ्रष्ट नहीं करते हैं, मैं फ़ाइलों को अस्थायी स्थान पर कॉपी कर रहा हूं। कुछ निर्देशिका जो मैं जांच रहा हूं वे स्रोत-कोड निर्देशिका हैं, और उनके पास .svn फ़ोल्डर्स हैं। हम अपने कोड को प्रबंधित करने के लिए सबवर्जन का उपयोग करते हैं।नव निर्मित फाइलों पर अनधिकृत एक्सेस अपवाद

एक बार जब मैंने सभी फाइलों के माध्यम से खोज की है, तो मैं temp कैश को हटाना चाहता हूं। आसान लगता है, है ना?

किसी कारण से, मेरी सभी .svn निर्देशिका कैश से नहीं हटाए जाएंगी। वे ऐप को दुर्घटनाग्रस्त करते हैं।

कारणों से (यहां जाने के लिए बहुत गहराई), मुझे अस्थायी फ़ोल्डर का उपयोग करना है, इसलिए केवल "मूल फ़ाइल स्कैन करें" राजनीतिक कारणों से प्रश्न से बाहर है।

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

जबकि मैंने आपके स्वच्छता के लिए फ़ंक्शन को एक छोटा सा सरल बना दिया है, तो कोड वास्तव में इस सरल के बारे में है।

List<string> tmpCacheManifest = new List<string>(); 
string oldRootPath = "C:\\some\\known\\directory\\"; 
string tempPath = "C:\\temp\\cache\\"; 

foreach (string file in ListOfFilesToScan) 
{ 
    string newFile = file.Replace(oldRootPath, tempPath); 

    // This works just fine. 
    File.Copy(file, newFile); 

    tmpCacheManifest.add(newFile); 
} 

// ... do some stuff to the cache to verify what I need. 


// Okay.. I'm done.. Delete the cache. 
foreach (string file in tmpCacheManifest) 
{ 
    // CRASH! 
    File.Delete(file); 
} 

* अद्यतन *: अपवाद UnauthorizedAccessException है। पाठ "पथ तक पहुंच" है: \ temp \ cache \ some-sub-dirs \ .svn \ प्रविष्टियां 'अस्वीकार कर दी गई हैं। "

यह XP, XP प्रो और Windows 7.

के तहत होता है * अद्यतन मेरी मान्यता के 2 * कोई भी तोड़फोड़ फाइलों को देखने के लिए प्रयास करता है। हालांकि, मुझे उनकी ज़रूरत है। वह राजनीतिक बकवास का हिस्सा है। मुझे यह दिखाना है कि प्रत्येक फाइल की प्रतिलिपि बनाई गई थी ... wheter यह स्कैन किया गया था या नहीं।

और मुझे एहसास है कि फ़ाइल के लिए सामान्य संदिग्ध क्या हैं। डेलेट। मुझे एहसास है कि अनधिकृत एक्सेस अपवाद का क्या अर्थ है। मेरे पास पहुंच नहीं है। यह एक ब्रेनर है। लेकिन मैंने बस फाइल कॉपी की है। मैं नहीं फ़ाइल तक पहुंच कैसे प्राप्त कर सकता हूं?

* अपडेट 3 * उत्तर "केवल पढ़ने के लिए" ध्वज में था। यहाँ कोड मैं इसे ठीक करने के लिए प्रयोग किया जाता है:

foreach (string file in ListOfFilesToScan) 
{ 
    string newFile = file.Replace(oldRootPath, tempPath); 

    // This works just fine. 
    File.Copy(file, newFile); 

    //// NEW CODE //// 
    // Clear any "Read-Only" flags 
    FileInfo fi3 = new FileInfo(fn); 
    if ((fi3.Attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly) 
    { 
     fi3.Attributes = (FileAttributes)(Convert.ToInt32(fi3.Attributes) - Convert.ToInt32(FileAttributes.ReadOnly)); 
    } 



    tmpCacheManifest.add(newFile); 
} 

// ... do some stuff to the cache to verify what I need. 

+3

अपवाद क्या है? एक फ़ाइल लॉक हो सकता है। –

+0

फ़ाइल। डेलेटे कम से कम सात अलग-अलग अपवाद प्रकार फेंक सकता है। आप कौन सी हो रही है? –

+0

@ रोबोटो, क्या आपका मतलब नहीं है: डब्ल्यूटीई? TCBAFL? –

उत्तर

12

जहां तक ​​मुझे याद है, सबवर्सन फ़ाइलों को अपने .svn उपनिर्देशिकाओं में केवल पढ़ने के लिए चिह्नित करता है।

फ़ाइल को हटाने से पहले केवल-पढ़ने योग्य विशेषता को रीसेट करने का प्रयास करें। मैं वास्तव में किसी भी सी # पता नहीं है, लेकिन एक त्वरित गूगल पता चलता है इस चाल हो सकती: किसी फ़ोल्डर केवल फ़ाइलों को पढ़ने के हैं, तो

File.SetAttributes(file, FileAttributes.Normal); 
+1

मैंने इसका परीक्षण किया है, और अब तक के सभी सुझावों में से यह एकमात्र ऐसा है जो वास्तव में अपवाद का कारण बनता है! – Justin

+0

अच्छी कॉल! मैंने "केवल पढ़ने" पर विचार नहीं किया था। हालांकि, यह अभी भी अपवाद फेंकता है। मैं वास्तव में यहां कुछ परेशान करने वाला हूं। =) – Jerry

+0

समझ गया !! अंत में ... दूसरा दुर्घटना एक और विषमता के कारण था, इस मुद्दे पर नहीं। – Jerry

-2

समझने नहीं है जो आप इतना है, लेकिन क्या 777 या 775. करने के लिए इसे chmoding के बारे में क्या करना चाहते हैं: -/

संपादित करें:

विंडोज़ पर आपके नोटिस किया गया। आपको अनुमतियां बदलनी होंगी। पता नहीं कैसे विंडोज़ करता है: -/

0

सबसे पहले: "क्रैश" का अर्थ अपवाद है, है ना? कौनसा? क्या आप इसे पकड़ सकते हैं और इसे दिखा सकते हैं?

दूसरी बात: आप उपवर्तन भंडार की प्रतिलिपि बना रहे हैं, हालांकि आप उपवर्तन मेटाडेटा की परवाह नहीं करते हैं? यही एसवीएन निर्यात है (लक्ष्य में कोई। एसवीएन निर्देशिका)।

पहले प्रश्न का उत्तर वह है जो आपको वास्तव में प्रदान करने की आवश्यकता है। हो सकता है कि कुछ .svn पकड़ लेता है और कुछ फ़ाइलों को ताला लगा देता है। TortoiseSVN शायद (आपको अच्छा ओवरले आइकन देने के लिए ..)?

2

समस्या सिर्फ मैं देख रहा हूँ इस हिस्से में होगा:

// ... do some stuff to the cache to verify what I need.

आप फ़ाइल को खोलने और बंद करने के लिए भूल जाते हैं करते हैं, तो आप अभी भी यह करने के लिए विशेष उपयोग किया है, और इस तरह नष्ट नहीं कर सकते बाद में

+0

सहमत हुए। यदि आप 'फाइलस्ट्रीम' ऑब्जेक्ट्स से निपट रहे हैं, तो उन पर 'बंद करें' को कॉल करना सुनिश्चित करें (जो 'निपटान' कहते हैं)। उन्हें 'उपयोग' ब्लॉक में बस लपेटना बेहतर होगा। –

+2

यह कारण नहीं होगा - यदि आप ऐसा करते हैं तो आप अन्य प्रक्रियाओं को फ़ाइल को हटाने से रोकते हैं, हालांकि यदि एक ही प्रक्रिया फ़ाइल को हटाने का प्रयास करती है तो कोई समस्या नहीं है, क्योंकि हैंडल/लॉक एक ही प्रक्रिया के स्वामित्व में है। मैंने इसका परीक्षण किया है और यह अपवाद नहीं करता है। – Justin

2

लगता है कि आपने फ़ाइल को नष्ट करने के लिए पहुँच नहीं है ...

system.io.file.delete

ऊपर के लिंक आप UnauthorizedAccessException जब कहते हैं:

फोन करने वाले की आवश्यकता नहीं है अनुमति।

-or-

पथ एक निर्देशिका है।

-or-

पथ केवल पढ़ने-योग्य फ़ाइल निर्दिष्ट करता है।

यह उनमें से एक है।

+0

उसके पास फ़ाइल को हटाने के लिए पहुंच होनी चाहिए क्योंकि उसे फ़ाइल को पहली जगह बनाने के लिए उपयोग था। – Justin

+0

ठीक है, उसने खुद कहा कि यह अपवाद है कि फेंक रहा है, मुझे नहीं पता कि कैसे। –

1

अनुमति अनुमति की तरह लगता है। मुश्किल है, हालांकि फ़ाइल के रूप में आपके पास स्पष्ट रूप से लेखन पहुंच है।

केवल एक चीज जिसे मैं सोच सकता हूं कि फ़ाइल में अभी भी एक हैंडल खोला गया है (जैसा कि अन्य ने शायद आपके में कुछ सुझाव दिया है कैश भाग में सामान)।

+0

उसके पास फ़ाइल को हटाने के लिए पहुंच होनी चाहिए क्योंकि उसे फ़ाइल को पहली जगह बनाने के लिए उपयोग था। – Justin

+0

@ क्रैगेन मैं वास्तव में पहले ही कह चुका हूं कि मेरी प्रतिक्रिया में ... – James

0

, Directory.Delete नहीं हटेगा और अपवाद आप कर रहे हैं बढ़ा मिल रहा।

Process.Start("cmd.exe", "/c " + @"rmdir /s/q C:\Test\TestDirectoryContainingReadOnlyFiles"); 

(एक आग नहीं करने के लिए एक सा परिवर्तन: इस पेज के भविष्य आगंतुकों के लिए, मैं एक सरल उपाय है जो हमें सभी फ़ाइलों के माध्यम से recurse और उनके केवल पढ़ने के लिए विशेषता को बदलने की आवश्यकता नहीं है मिल गया है सीएमडी विंडो क्षणिक रूप से, जो पूरे इंटरनेट पर उपलब्ध है)

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