2009-01-13 18 views
66

मेरे पास एक रास्ता है और मुझे यह निर्धारित करने की आवश्यकता है कि यह निर्देशिका या फ़ाइल है या नहीं।.NET कैसे जांचें कि पथ एक फ़ाइल है या नहीं?

क्या यह निर्धारित करने का सबसे अच्छा तरीका है कि पथ एक फ़ाइल है या नहीं?

string file = @"C:\Test\foo.txt"; 

bool isFile = !System.IO.Directory.Exists(file) && 
         System.IO.File.Exists(file); 

एक निर्देशिका के लिए मैं तर्क को उलट दूंगा।

string directory = @"C:\Test"; 

bool isDirectory = System.IO.Directory.Exists(directory) && 
          !System.IO.File.Exists(directory); 

यदि दोनों मौजूद नहीं हैं तो मैं शाखा नहीं जाऊंगा। तो मान लें कि वे दोनों मौजूद हैं।

+0

http://stackoverflow.com/a/17198139/128506 की – HAL9000

+0

संभावित डुप्लिकेट (http://stackoverflow.com/questions/1395205/better-way-to-check-if-a-path-is-a-file-or-a- निर्देशिका) – DavidRR

उत्तर

101

उपयोग:

System.IO.File.GetAttributes(string path) 

और जाँच लौटे FileAttributes परिणाम मूल्य FileAttributes.Directory शामिल है कि क्या:

bool isDir = (File.GetAttributes(path) & FileAttributes.Directory) 
       == FileAttributes.Directory; 
+14

बस सुनिश्चित करें कि आप इसे कोशिश/पकड़ में करते हैं, क्योंकि पथ भी मौजूद नहीं हो सकता है। – LBushkin

+0

क्या होता है यदि पथ में वाइल्डकार्ड हैं? मुझे एक अवैध चरित्र तर्क मिलता है, लेकिन अगर मैं वाइल्डकार्ड का उपयोग करता हूं और यह मेरे उपयोगकर्ताओं के लिए एक वैध मार्ग है? –

10

आप कुछ इंटरॉप कोड के साथ ऐसा कर सकते हैं:

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] 
    [return: MarshalAsAttribute(UnmanagedType.Bool)] 
    public static extern bool PathIsDirectory([MarshalAsAttribute(UnmanagedType.LPWStr), In] string pszPath); 

आगे कुछ टिप्पणियों को स्पष्ट करने के लिए ...

इस में अप्रबंधित कोड का परिचय किसी भी अधिक inherintly अन्य में से किसी की तुलना में खतरनाक नहीं है फ़ाइल या I/O संबंधित कॉल .NET में हैं क्योंकि वे ultimatley सभी अप्रबंधित कोड में कॉल करते हैं।

यह स्ट्रिंग का उपयोग कर एक एकल फ़ंक्शन कॉल है। आप इस फ़ंक्शन को कॉल करके कोई भी नया डेटा प्रकार और/या स्मृति उपयोग शुरू नहीं कर रहे हैं। हां, आपको अप्रबंधित कोड पर उचित रूप से साफ करने के लिए भरोसा करने की आवश्यकता है, लेकिन आखिरकार आप I/O संबंधित कॉलों पर निर्भरता रखते हैं।

संदर्भ के लिए, परावर्तक से File.GetAttributes (स्ट्रिंग पथ) को कोड है:

public static FileAttributes GetAttributes(string path) 
{ 
    string fullPathInternal = Path.GetFullPathInternal(path); 
    new FileIOPermission(FileIOPermissionAccess.Read, new string[] { fullPathInternal }, false, false).Demand(); 
    Win32Native.WIN32_FILE_ATTRIBUTE_DATA data = new Win32Native.WIN32_FILE_ATTRIBUTE_DATA(); 
    int errorCode = FillAttributeInfo(fullPathInternal, ref data, false, true); 
    if (errorCode != 0) 
    { 
     __Error.WinIOError(errorCode, fullPathInternal); 
    } 
    return (FileAttributes) data.fileAttributes; 
} 

जैसा कि आप देख, यह भी अप्रबंधित कोड के लिए बुला रहा है क्रम में फ़ाइल विशेषताओं को पुनः प्राप्त करने सकते हैं, इसलिए अप्रबंधित कोड को खतरनाक होने के बारे में बहस अवैध हैं। इसी प्रकार, प्रबंधित कोड में पूरी तरह से रहने के बारे में तर्क। ऐसा करने के लिए कोई प्रबंधित कोड कार्यान्वयन नहीं है। यहां तक ​​कि अन्य उत्तरों के रूप में File.GetAttributes() को कॉल करने के लिए भी असम्बद्ध कोड को कॉल करने के समान "मुद्दे" हैं और मेरा मानना ​​है कि पथ एक निर्देशिका है या नहीं, यह निर्धारित करने के लिए यह अधिक विश्वसनीय तरीका है।

संपादित करें @ क्रिस्टियन के द्वारा सीएएस के बारे में टिप्पणी का उत्तर देने के लिए। मेरा मानना ​​है कि GetAttributes सुरक्षा मांग को एकमात्र कारण बनाता है क्योंकि इसे फ़ाइल के गुणों को पढ़ने की आवश्यकता है, इसलिए यह सुनिश्चित करना चाहता है कि कॉलिंग कोड को ऐसा करने की अनुमति है। यह अंतर्निहित ओएस चेक (यदि कोई है) के समान नहीं है। आप हमेशा पथ/निर्देशक कॉल के चारों ओर एक रैपर फ़ंक्शन बना सकते हैं, जो पथ आईडी डायरेक्टरी पर है, यदि आवश्यक हो तो कुछ सीएएस अनुमतियों की भी मांग करें।

+2

यह पता लगाने के लिए काम की आवंटन की तरह लगता है अगर एक पथ एक फ़ाइल या निर्देशिका है। –

+0

यह कितना काम है? आप एक आयातित फ़ंक्शन घोषित करते हैं और फिर इसे कॉल कर सकते हैं जैसे कि यह मूल विधि थी। –

+2

मुझे नहीं पता कि यह क्यों डाउनवॉटेड है, हालांकि केवल .NET कार्यक्षमता का उपयोग करके प्रबंधित कोड में रहना बहुत आसान होगा। –

7

निर्देशिका मान लिया जाये कि मौजूद है ...

bool isDir = (File.GetAttributes(path) & FileAttributes.Directory) 
        == FileAttributes.Directory; 
+0

यदि पथ मौजूद नहीं है, तो GetAttributes -1 वापस आ जाएगा। –

+1

डॉक्स इंगित करते हैं कि फ़ाइल मौजूद नहीं है तो यह अपवाद फेंक देगा। http://msdn.microsoft.com/en-us/library/system.io.file.getattributes.aspx – tvanfosson

+0

अपने परीक्षण के आसपास गलत तरीका है - कि isDir होना चाहिए isFile नहीं ... – Alnitak

3

इस की जाँच करें:

/// <summary> 
/// Returns true if the given file path is a folder. 
/// </summary> 
/// <param name="Path">File path</param> 
/// <returns>True if a folder</returns> 
public bool IsFolder(string path) 
{ 
    return ((File.GetAttributes(path) & FileAttributes.Directory) == FileAttributes.Directory); 
} 

http://www.jonasjohn.de/snippets/csharp/is-folder.htm से

2

पढ़ें फ़ाइल विशेषताएँ: निर्देशिका ध्वज के लिए

FileAttributes att = System.IO.File.GetAttributes(PATH_TO_FILE); 

चेक।

1

यह देखते हुए कि एक विशेष पथ स्ट्रिंग एक निर्देशिका और दोनों फ़ाइल का प्रतिनिधित्व नहीं कर सकती है, तो निम्न ठीक काम करता है और अन्य परिचालनों के लिए दरवाजा खुलता है।

bool isFile = new FileInfo(path).Exists; 
bool isDir = new DirectoryInfo(path).Exists; 

आप, फाइल सिस्टम के साथ काम कर रहे हैं FileInfo और DirectoryInfo का उपयोग कर तार का उपयोग करने से बहुत सरल है।

+0

देखें 0xA3 के लिए सही जवाब, थोड़ा बेहतर कॉल इमो। – nawfal

45

मुझे लगता है कि यह सबसे आसान तरीका है, जहाँ आप केवल दो चेकों की जरूरत है:

string file = @"C:\tmp"; 
if (System.IO.Directory.Exists(file)) 
{ 
    // do stuff when file is an existing directory 
} 
else if (System.IO.File.Exists(file)) 
{ 
    // do stuff when file is an existing file 
} 
+0

मैंने आपको डाउनवोट नहीं किया, लेकिन यह स्वीकार्य उत्तर निश्चित रूप से "सरल" है और केवल एक कॉल की आवश्यकता है (दो नहीं)। –

+0

अच्छा, यह निर्भर करता है, मैं व्यक्तिगत रूप से स्वीकार करता हूं कि डीआईआर = System.IO.Directory.Exists (फ़ाइल) स्वीकार किए गए समाधान से "सरल" होना चाहिए। –

+9

इस दृष्टिकोण का लाभ यह है कि यह तब भी काम करता है जब फाइल सिस्टम में कोई मिलान प्रविष्टि न हो (दूसरे शब्दों में, यह न तो फ़ोल्डर है और न ही फ़ाइल है); उस अर्थ में, यह "सरल" है। संयोग से, ओपी ने "एक रास्ता" कहा, और "एक रास्ता जो अस्तित्व में जाना जाता है" नहीं। – Tao

-2

हम्म, यह Files वर्ग (java.nio में) की तरह दिखता है वास्तव में एक स्थिर isDirectory विधि है। तो, मुझे लगता है कि आप वास्तव में निम्नलिखित इस्तेमाल कर सकते हैं: [? बेहतर तरीका अगर एक पथ एक फ़ाइल या एक निर्देशिका है जांच करने के लिए]

Path what = ... 
boolean isDir = Files.isDirectory(what); 
+4

एक .NET समाधान की तलाश में है। –

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