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
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.
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.
Đây là cách tiện ích 'file' trên unix thực hiện, vâng. –
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ã.
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);
}
}
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
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
cảm ơn bạn, đã làm việc tuyệt vời! –
- 1. Node.js - Hệ thống tệp nhận loại tệp
- 2. Thư viện NET để phát hiện loại tệp/mime
- 3. Có API trong .net để đọc tệp tài liệu nhận xét XML
- 4. Tạo tệp PDF trong .NET
- 5. Tệp tạm thời trong .Net
- 6. Loại an toàn trong .net là gì?
- 7. Có loại "ReferenceComparer" nào trong .NET không?
- 8. Loại tệp .net nào cần được loại trừ khỏi kiểm soát nguồn?
- 9. Cách nhận loại tệp trên Mac OS X?
- 10. Nhận loại lớp trong CoffeeScript
- 11. Thiếu nhận xét khối trong VB .NET?
- 12. Nhận danh sách Encoding trong .NET 1.1
- 13. Tệp không đồng bộ IO trong .Net
- 14. số nhận dạng loại đồng nhất cho tệp docx
- 15. Làm cách nào để xác định loại nội dung của tệp trong .NET?
- 16. Sao chép tệp nguyên tử trong .NET
- 17. Tải lên các tệp lớn trong .NET
- 18. ASP .NET C# nhận tất cả văn bản từ một tệp trong đường dẫn web
- 19. Tải tệp lên: Cách loại trừ loại MIME bằng cách sử dụng xác nhận?
- 20. Sử dụng tệp Java JAR trong .NET
- 21. xem tệp docx trong C# .NET
- 22. Xóa an toàn tệp trong C# .NET
- 23. Tạo một tệp XAML bên trong .Net
- 24. Ẩn các loại được liệt kê trong Assembly.GetTypes in .net
- 25. Tệp loại đầu vào chấp nhận không hiển thị các tệp PPS
- 26. ACTION_GET_CONTENT: Cách nhận tệp kết thúc khi tìm kiếm nhiều loại tệp?
- 27. Net Nhận tên thuộc tính
- 28. Làm cách nào để phát hiện loại tệp dll? (COM, .NET, WIN32)
- 29. Cách nhận Loại từ TypeInfo trong WinRT?
- 30. Nhận loại Mô hình trong MVC Xem
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
@bobbymcr, Xong, cảm ơn nhận xét. – Ash