첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
------------------------------------------------------------------------------------------------------------------------------------------------------
728x90
728x170

■ FindMimeFromData API 함수를 사용해 파일 서명 기반으로 파일 MIME 타입을 구하는 방법을 보여준다.

TestProject.zip
0.00MB

▶ 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
그리드형(광고전용)
Posted by icodebroker
,