2009-09-17 18 views
11

Làm cách nào tôi có thể nhận loại tệp bằng C#. ví dụ: nếu id tên tệp "abc.png" và loại tệp sẽ "PNG Image" giống như cột thứ ba "Loại" trong trình khám phá cửa sổ.Nhận loại tệp trong .NET

Trả lời

11

Bạn sẽ cần phải sử dụng các cửa sổ API SHGetFileInfo function

Trong cơ cấu sản lượng, szTypeName chứa tên bạn đang tìm kiếm.

[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; 
}; 

Lưu ý rằng đây chỉ đơn giản là "Tên thân thiện" được lưu trữ trong Windows Registry, nó chỉ là nhãn (nhưng có thể đủ tốt cho tình huống của bạn).

Sự khác biệt giữa szTypeName và szDisplayName được mô tả tại MSDN:

szTypeName: string Null-terminated rằng mô tả các loại tập tin.

szDisplayName: Null-chấm dứt chuỗi chứa tên của tập tin như nó xuất hiện trong cấu trúc hệ thống, hoặc đường dẫn và tên của tập tin đó chứa các biểu tượng đại diện cho các tập tin .

Để xác định chính xác hơn loại tệp, bạn cần đọc đoạn byte đầu tiên của mỗi tệp và so sánh chúng với thông số tệp đã xuất bản. Xem một trang web như Wotsit để biết thông tin về định dạng tệp.

Trang được liên kết cũng chứa đầy đủ mã C# mẫu.

+0

Bạn có thể sửa bài đăng của mình - szTypeName có thông tin chứ không phải szDisplayName. Xem http://msdn.microsoft.com/en-us/library/aa453689.aspx => szDisplayName: Null-chấm dứt chuỗi có chứa tên của tập tin như nó xuất hiện trong vỏ Windows, hoặc đường dẫn và tên của tệp chứa biểu tượng đại diện cho tệp. – bobbymcr

+0

@bobbymcr, Xong, cảm ơn nhận xét. – Ash

10

P/gọi tới SHGetFileInfo và kiểm tra szDisplayName trong cấu trúc trả về. Kết quả sẽ phụ thuộc vào cách bạn đã xác định loại tệp của mình (nghĩa là nó sẽ không phải là tham chiếu tuyệt đối). Nhưng nó sẽ là tốt trong hầu hết các trường hợp. Click here for the c# signature of SHGetFileInfo and example code on pinvoke.net (trang web tuyệt vời như vậy)

Để tham khảo tuyệt đối, bạn sẽ cần một số kiểm tra một vài byte trong tiêu đề nhị phân và so sánh với danh sách đã biết của các byte này - tôi nghĩ đây là cách các hệ thống dựa trên Unix theo mặc định.

+0

Đây là cách tiện ích 'file' trên unix thực hiện, vâng. –

2

Chức năng Win-API SHGetFileInfo() là bạn của bạn. Hãy xem here để biết một số đoạn mã.

20

Bạn sẽ cần P/Gọi tới SHGetFileInfo để nhận thông tin về loại tệp. Đây là mẫu hoàn chỉnh:

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

Câu trả lời này phải là câu trả lời được chấp nhận, vì nó cũng cho thấy cách sử dụng nó, tốt hơn nhiều so với câu trả lời được chấp nhận hiện tại. +1 – Kaitlyn

+0

Tuy nhiên, nó không thực sự hoạt động, khi tôi thay đổi một tệp từ định dạng txt sang png, nó cho tôi biết đó là tệp định dạng PNG. Cấp, tập tin đã trải qua quá trình steganography, và được trích xuất bằng cách sử dụng quá trình đó, nhưng đã được mã hóa. – Kaitlyn

+0

cảm ơn bạn, đã làm việc tuyệt vời! –

Các vấn đề liên quan