2011-02-18 16 views
22

मुझे कैसे पता चलेगा कि दी गई निर्देशिका रूट ड्राइव है या नहीं?सी # कैसे पता चलेगा कि दिया गया पथ रूट ड्राइव का प्रतिनिधित्व करता है या नहीं?

(पता चल सके कि अपने रास्ते के बराबर होती है से अलग करने के लिए "एक: ',' बी ',' सी ', आदि)

+0

आप जानना चाहते हैं कि दी गई निर्देशिका कुछ विभाजन की मूल निर्देशिका है, है ना? –

+0

हां, यही वह है जिसे मैंने पूछा था। – asmo

उत्तर

30

चेक अगर DirectoryInfo.Parent रिक्त है या नहीं

DirectoryInfo d = new DirectoryInfo(""); 
if(d.Parent == null) { IsRoot = true; } 

आप DirectoryInfo.Root का उपयोग कर रूट भी प्राप्त कर सकते हैं;

3

this का प्रयास करें:

if (Path.GetPathRoot(location) == location) {...} 
+0

उसके पास पहले से ही रास्ता है, वह देखना चाहता है कि यह जड़ है, न कि रूट प्राप्त करें। –

+3

@ टाइटन: यदि रूट प्राप्त करना एक ही स्ट्रिंग देता है, तो यह एक जड़ है। यह सबसे अच्छा तरीका नहीं हो सकता है, लेकिन यह मान्य है। –

+0

@ बेन यह सच है लेकिन यह बहुत कम कुशल है। यह न केवल 2 तारों के साथ काम करने की आवश्यकता है बल्कि उन्हें तुलना भी करता है। –

6

यह बहुत जनक संपत्ति की जाँच की तुलना में अधिक जटिल है।

Determining Whether a Directory Is a Mounted Folder

एक दृष्टिकोण अगर GetVolumeNameForVolumeMountPoint सफल होता है देखने के लिए होगा।

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

+0

मेरा प्रोग्राम है सी # और GetVolumeNameForVolumeMountPoint में एक देशी सी फ़ंक्शन है। वैसे भी DirectoryInfo.Parent पूरी तरह से काम करता प्रतीत होता है। हालांकि टिप के लिए धन्यवाद। – asmo

+1

यह पूरी तरह से काम करता है जब तक आप इसे माउंट पॉइंट के बारे में नहीं पूछते। किस स्थिति में 'DirectoryInfo.Parent' आपको बताएगा कि यह एक उपनिर्देशिका है जब वास्तव में यह किसी अन्य विभाजन की मूल निर्देशिका है। यह जांचने के लिए कोई प्रबंधित फ़ंक्शन नहीं है कि कोई विशेष निर्देशिका इसके विभाजन की जड़ है, इसलिए मैंने मूल Win32 फ़ंक्शन का सुझाव दिया है। –

+0

ओह अब मुझे मिल गया। यह बात बताने के लिए धन्यवाद! – asmo

1

यहाँ एक और तरीका मैंने पाया है:

public static bool IsLogicalDrive(string path) 
{ 
    return Directory.GetLogicalDrives().Contains(path); 
} 

यह एक वास्तव में जाँच करता है, तो दिए गए पथ वर्तमान सिस्टम की तार्किक ड्राइव से एक प्रतिनिधित्व करता है।

+0

सभी विभाजनों का अपना ड्राइव अक्षर नहीं है। http://technet.microsoft.com/en-us/library/cc938934.aspx –

+0

'Directory.GetLogicalDrives' एक स्ट्रिंग []' देता है। 'System.Array'' System.Collections.IList' लागू करता है, लेकिन यह इसमें स्पष्ट इंटरफ़ेस कार्यान्वयन प्रदान करता है: ((.NET 3.5+: https://msdn.microsoft.com/en-us/library/bb336401(v = बनाम .110) .aspx)) ((.NET 2, 3: https://msdn.microsoft.com/en-US/library/system.array.system.collections.ilist.contains(v=vs.85) .aspx)) ((.NET 1.1: https://msdn.microsoft.com/en-us/library/aa310885(v=vs.71)।एएसपीएक्स)) कॉल करने से पहले सरणी को 'IList' पर डाला जाना चाहिए। –

2

इसके अलावा यहाँ एक और तरीका मैंने पाया है: इस समारोह सच रिटर्न

public static bool IsLogicalDrive(string path) 
{ 
    return (new DirectoryInfo(path).FullName == new DirectoryInfo(path).Root.FullName; 
} 

है, तो इसका मतलब है कि दिए गए पथ एक रूट ड्राइव का प्रतिनिधित्व करता है!

+0

क्या 2 ऑब्जेक्ट्स बनाना आवश्यक है? कैसे "वापसी पथ == पथ। गेटपाथ रूट (पथ)" –

+0

@ डेरेल लाइ, जबकि मैं मानता हूं कि 'पथ। गेटपाथ रूट()' कुछ मामलों में अधिक सुविधाजनक विकल्प हो सकता है, इसे सापेक्ष पथ की जड़ नहीं मिलती है। https://docs.microsoft.com/en-us/dotnet/api/system.io.path.getpathroot?view=netframework-4.7 इसके अलावा, चूंकि हम स्ट्रिंग तुलना का उपयोग कर रहे हैं, हम यह सुनिश्चित करना चाहते हैं कि दोनों पक्ष वही स्वरूपण प्राप्त करें। –

+0

उस नोट पर, यहां तक ​​कि 'नया DirectoryInfo (पथ) .Root.FullName' लगातार संगत होने के लिए निश्चित नहीं है क्योंकि यह ड्राइव अक्षर के ऊपरी या निचले केस संस्करण को वापस कर सकता है। एक स्ट्रिंग रूपांतरण बेहतर करें। –

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

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