정리

'File Information'에 해당되는 글 1건

  1. [Win32 API] File Information 확인 (1)

[Win32 API] File Information 확인 (1)

저장소/VC++
파일 정보를 확인해야 할 일이 얼마나 있을까?
그나마 많이 확인하는 것이 Attribute나 Size, Version 이정도?
혹시나 필요할 일이 생길까 싶어서 정리한다.

#include 
#pragma comment(lib, "version.lib")

#include 


typedef struct _Lang_And_Code_Page
{
	WORD	wLanguage;
	WORD	wCodePage;
}
LANGANDCODEPAGE, *LPLANGANDCODEPAGE;


int GetFileInformation(LPCTSTR _lpszFilePath, LPCTSTR _lpszInfoString, LPTSTR _lpszBuf, DWORD _cchBuf)
{
	if( NULL == _lpszFilePath	||
		NULL == _lpszInfoString	||
		NULL == _lpszBuf		)
	{
		return -1;
	}

	DWORD dwHandle = 0;
	DWORD dwSize = 0;

	dwSize = ::GetFileVersionInfoSize(_lpszFilePath, &dwHandle);
	if(0 == dwSize)
		return -1;

	BYTE* pBlockData = new BYTE[dwSize];
	ZeroMemory(pBlockData, dwSize);

	if(FALSE == ::GetFileVersionInfo(_lpszFilePath, dwHandle, dwSize, pBlockData))
	{
		delete [] pBlockData;

		return -1;
	}

	UINT uLangCodePage = 0;
	LPLANGANDCODEPAGE pLangCodePage = NULL;

	if(FALSE == ::VerQueryValue(pBlockData, _T("\\VarFileInfo\\Translation"), (LPVOID*)&pLangCodePage, &uLangCodePage))
	{
		delete [] pBlockData;

		return -1;
	}

	//
	int nRet = 0;
	TCHAR szResource[50] = {0,};
	TCHAR* pszBuffer = NULL;
	UINT uBufSize = 0;

	for(UINT i = 0 ; i < (uLangCodePage / sizeof(LANGANDCODEPAGE)) ; i++ )
	{
		StringCchPrintf(szResource, 50, _T("\\StringFileInfo\\%04x%04x\\%s"), pLangCodePage[i].wLanguage, pLangCodePage[i].wCodePage, _lpszInfoString);

		if(::VerQueryValue(pBlockData, szResource, (LPVOID*)&pszBuffer, &uBufSize))
			StringCchCopy(_lpszBuf, _cchBuf, pszBuffer);
		else
			nRet = -1;
	}

	delete [] pBlockData;

	return nRet;
}
이렇게 하면 몇몇 정보는 얻어올 수 있지만 파일 등록정보에서 확인할 수 있는 모든 정보를 확인하지는 못한다.
for문과 같은 처리는 파일 정보가 여러 언어로 되어있을 때 확인하기 위해 사용되는건가?
GetFileVersionInfoSizeEx와 GetFileVersionInfoEx에 첫 번째 인자로 Flag를 받게끔 되어있는데 이와 연관되어있을듯 하다.
MSDN을 대충 해석하고 참고해서 만든 것인데 아무래도 설명이 필요할 것 같다.
GetFileVersionInfoSizeEx와 GetFileVersionInfoEx에 대한 내용을 포함해서 나머지 부분은 다음에 다시...