728x90
728x170
■ FindMimeFromData API 함수를 사용해 파일 서명 기반으로 파일 MIME 타입을 구하는 방법을 보여준다.
▶ Program.cs
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace TestProject
{
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Import
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 데이터에서 MIME 찾기 - FindMimeFromData(bindContext, url, bufferByteArray, size, mimeProposed, mimeFlag, mime, reserverd)
/// <summary>
/// 데이터에서 MIME 찾기
/// </summary>
/// <param name="bindContext">바인딩 컨텍스트</param>
/// <param name="url">URL</param>
/// <param name="bufferByteArray">버퍼 바이트 배열</param>
/// <param name="size">크기</param>
/// <param name="mimeProposed">제안 MIME</param>
/// <param name="mimeFlag">MIME 플래그</param>
/// <param name="mime">MIME</param>
/// <param name="reserverd">예약</param>
/// <returns>처리 결과</returns>
[DllImport("urlmon", CharSet = CharSet.Auto)]
private extern static uint FindMimeFromData
(
uint bindContext,
[MarshalAs(UnmanagedType.LPStr)] string url,
[MarshalAs(UnmanagedType.LPArray)] byte[] bufferByteArray,
uint size,
[MarshalAs(UnmanagedType.LPStr)] string mimeProposed,
uint mimeFlag,
out uint mime,
uint reserverd
);
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region MIME 타입 구하기 - GetMIMEType(filePath)
/// <summary>
/// MIME 타입 구하기
/// </summary>
/// <param name="filePath">파일 경로</param>
/// <returns>MIME 타입</returns>
private static string GetMIMEType(string filePath)
{
if(!File.Exists(filePath))
{
throw new FileNotFoundException($"{filePath} not found");
}
byte[] bufferByteArray = new byte[256];
using(FileStream fileStream = new FileStream(filePath, FileMode.Open))
{
if(fileStream.Length >= 256)
{
fileStream.Read(bufferByteArray, 0, 256);
}
else
{
fileStream.Read(bufferByteArray, 0, (int)fileStream.Length);
}
}
try
{
uint mimeTypeValue;
FindMimeFromData(0, null, bufferByteArray, 256, null, 0, out mimeTypeValue, 0);
IntPtr mimeTypeValueHandle = new IntPtr(mimeTypeValue);
string mimeType = Marshal.PtrToStringUni(mimeTypeValueHandle);
Marshal.FreeCoTaskMem(mimeTypeValueHandle);
return mimeType;
}
catch
{
return "unknown/unknown";
}
}
#endregion
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
string mimeType = GetMIMEType("d:\\source.jpg");
Console.WriteLine(mimeType);
}
#endregion
}
}
※ PC에 설치된 urlmon.dll이 32비트 버전이어서 32비트 버전으로 컴파일해서 실행해야 한다.
728x90
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON] Directory 클래스 : GetAccessControl 정적 메소드를 사용해 디렉토리 권한 체크하기 (0) | 2022.10.23 |
---|---|
[C#/COMMON/.NET6] File 클래스 : Create 정적 메소드를 사용해 디렉토리 쓰기 가능 여부 구하기 (0) | 2022.10.23 |
[C#/COMMON/.NET6] 64비트 운영 체제 여부 구하기 (0) | 2022.10.22 |
[C#/COMMON/.NET6] 64비트 운영 체제 여부 구하기 (0) | 2022.10.22 |
[C#/COMMON/.NET6] 64비트 프로세스 여부/64비트 운영 체제 여부 구하기 (0) | 2022.10.21 |
[C#/COMMON] PrincipalPermission 클래스 : Demand 메소드를 사용해 관리자 권한 요구하기 (0) | 2022.10.21 |
[C#/COMMON] WebClient 클래스 : 쿠키 컨테이너를 갖는 웹 클라이언트 사용하기 (0) | 2022.10.21 |
[C#/COMMON/.NET6] char 구조체 : IsNumber/IsDigit 정적 메소드 비교하기 (0) | 2022.10.21 |
[C#/COMMON/.NET6] NetworkInterface 클래스 : GetAllNetworkInterfaces 정적 메소드를 사용해 호스트 IP 주소 구하기 (0) | 2022.10.21 |
[C#/COMMON/.NET6] NetworkInterface 클래스 : GetAllNetworkInterfaces 정적 메소드를 사용해 네트워크 주소 배열 구하기 (0) | 2022.10.21 |