2009-09-17 15 views
11

मैं C# का उपयोग कर फ़ाइल का प्रकार कैसे प्राप्त कर सकता हूं। उदाहरण के लिए यदि फ़ाइल नाम आईडी "abc.png" और फ़ाइल का प्रकार "पीएनजी छवि" विंडो एक्सप्लोरर में तीसरे कॉलम "टाइप" के समान होगा।फ़ाइल प्रकार प्राप्त करें .NET

उत्तर

11

आप खिड़कियों एपीआई SHGetFileInfo function

उपयोग करने के लिए उत्पादन संरचना में की आवश्यकता होगी, szTypeName नाम आप देख रहे हैं शामिल हैं।

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] 
public struct SHFILEINFO 
{ 
    public IntPtr hIcon; 
    public int iIcon; 
    public uint dwAttributes; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
    public string szDisplayName; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] 
    public string szTypeName; 
}; 

ध्यान दें कि यह केवल वर्तमान "दोस्ताना नाम" Windows रजिस्ट्री में संग्रहीत के रूप में है, यह सिर्फ एक लेबल है (लेकिन शायद अपनी स्थिति के लिए काफी अच्छा है)।

szTypeName और szDisplayName के बीच का अंतर MSDN पर वर्णित है:

szTypeName: अशक्त-समाप्त स्ट्रिंग कि फ़ाइल के प्रकार का वर्णन है।

szDisplayName: अशक्त-समाप्त स्ट्रिंग यह विंडोज खोल में प्रकट होता है, या फ़ाइल कि फ़ाइल का प्रतिनिधित्व आइकन होता है का पथ और नाम के रूप में फ़ाइल का नाम मौजूद है।

फ़ाइल प्रकार के अधिक सटीक निर्धारण के लिए आपको प्रत्येक फ़ाइल के बाइट्स के पहले हिस्से को पढ़ने और प्रकाशित फ़ाइल विनिर्देशों के विरुद्ध तुलना करने की आवश्यकता होगी। फ़ाइल स्वरूपों की जानकारी के लिए Wotsit जैसी साइट देखें।

लिंक किए गए पृष्ठ में पूर्ण उदाहरण C# कोड भी शामिल है।

+0

आप अपनी पोस्ट को सही करना चाहेंगे - szTypeName में जानकारी है, szDisplayName नहीं। Http://msdn.microsoft.com/en-us/library/aa453689.aspx => szDisplayName देखें: नल-टर्मिनेटेड स्ट्रिंग जिसमें फ़ाइल का नाम होता है जैसा कि यह विंडोज शैल में दिखाई देता है, या पथ और नाम फ़ाइल जिसमें फ़ाइल का प्रतिनिधित्व करने वाला आइकन शामिल है। – bobbymcr

+0

@bobbymcr, हो गया, टिप्पणी के लिए धन्यवाद। – Ash

10

पी/SHGetFileInfo पर आक्रमण करें, और लौटाई गई संरचना में szDisplayName की जांच करें। नतीजा इस बात पर निर्भर करेगा कि आपके फाइल प्रकार किस प्रकार परिभाषित हैं (यानी यह एक पूर्ण संदर्भ नहीं होगा)। लेकिन ज्यादातर मामलों में यह ठीक होना चाहिए। Click here for the c# signature of SHGetFileInfo and example code on pinvoke.net (यह भयानक साइट है)

एक पूर्ण संदर्भ के लिए आपको बाइनरी हेडर में कुछ बाइट्स की जांच करने की आवश्यकता होगी और इन बाइट्स की एक ज्ञात सूची के विरुद्ध तुलना की जाएगी - मुझे लगता है कि यह यूनिक्स-आधारित सिस्टम कैसे करता है डिफ़ॉल्ट रूप से।

+0

इस प्रकार यूनिक्स पर 'file' उपयोगिता यह करता है, हां। –

2

विन-एपीआई फ़ंक्शन SHGetFileInfo() आपका मित्र है। कुछ कोड स्निपेट के लिए here देखें।

20

फ़ाइल प्रकार की जानकारी प्राप्त करने के लिए आपको SHGetFileInfo पर P/Invoke करने की आवश्यकता होगी। यहां एक पूर्ण नमूना है:

using System; 
using System.Runtime.InteropServices; 

static class NativeMethods 
{ 
    [StructLayout(LayoutKind.Sequential)] 
    public struct SHFILEINFO 
    { 
     public IntPtr hIcon; 
     public int iIcon; 
     public uint dwAttributes; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] 
     public string szDisplayName; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] 
     public string szTypeName; 
    }; 

    public static class FILE_ATTRIBUTE 
    { 
     public const uint FILE_ATTRIBUTE_NORMAL = 0x80; 
    } 

    public static class SHGFI 
    { 
     public const uint SHGFI_TYPENAME = 0x000000400; 
     public const uint SHGFI_USEFILEATTRIBUTES = 0x000000010; 
    } 

    [DllImport("shell32.dll")] 
    public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); 
} 

class Program 
{ 
    public static void Main(string[] args) 
    { 
     NativeMethods.SHFILEINFO info = new NativeMethods.SHFILEINFO(); 

     string fileName = @"C:\Some\Path\SomeFile.png"; 
     uint dwFileAttributes = NativeMethods.FILE_ATTRIBUTE.FILE_ATTRIBUTE_NORMAL; 
     uint uFlags = (uint)(NativeMethods.SHGFI.SHGFI_TYPENAME | NativeMethods.SHGFI.SHGFI_USEFILEATTRIBUTES); 

     NativeMethods.SHGetFileInfo(fileName, dwFileAttributes, ref info, (uint)Marshal.SizeOf(info), uFlags); 

     Console.WriteLine(info.szTypeName); 
    } 
} 
+2

यह उत्तर स्वीकार्य उत्तर होना चाहिए, क्योंकि यह भी दिखाता है कि इसका उपयोग कैसे किया जाए, वर्तमान स्वीकृत उत्तर से काफी बेहतर है। +1 – Kaitlyn

+0

हालांकि, यह वास्तव में काम नहीं करता है, जब मैंने फ़ाइल को txt से png प्रारूप में बदल दिया है, तो यह मुझे बताता है कि यह एक पीएनजी प्रारूप फ़ाइल है। अनुमोदित, फ़ाइल स्टेग्नोग्राफ़ी प्रक्रिया के माध्यम से चला गया था, और उस प्रक्रिया का उपयोग करके निकाला गया था, लेकिन एन्क्रिप्टेड था। – Kaitlyn

+0

धन्यवाद, बहुत अच्छा काम किया! –

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