Win32API フルパスを取得する GetFullPathName

相対パスからフルパスを取得する

DWORD GetFullPathName(
  LPCTSTR lpFileName,  // ファイル名
  DWORD nBufferLength, // パス名を格納するバッファのサイズ
  LPTSTR lpBuffer,     // パス名を格納するバッファ
  LPTSTR *lpFilePart   // パス内のファイル名のアドレス
);

参考: http://msdn.microsoft.com/ja-jp/library/cc429325.aspx


  1. lpFileNameには、ファイル名やディレクトリ名の相対パスまたは絶対パスを指定する
  2. lpFilePartは不要な場合、NULLを指定しても良い
  3. 戻り値は、成功した場合はlpBufferに書き込まれた文字数。失敗した場合はゼロ。

#include <stdio.h>
#include <windows.h>

int main()
{
	char szFullPath[MAX_PATH] = {'\0'};
	char *szFilePart;

	DWORD dwRet = GetFullPathName(
		"..\\test.txt", /* ファイル名を相対パスで指定 */
		sizeof(szFullPath)/sizeof(szFullPath[0]),
		szFullPath,
		&szFilePart);

	if (dwRet != 0) {
		printf("FullPath : %s\n", szFullPath);
		printf("FullPath Length : %u\n", dwRet);
		printf("FilePart : %s\n", szFilePart);
	} else {
		printf("GetFullPathName failed.");
	}

	return 0;
}






Windowsでは Cランタイムの stdlib.h にもフルパスを取得するための「_fullpath」という関数がある。

char *_fullpath( 
   char *absPath,
   const char *relPath,
   size_t maxLength 
);

参考: http://msdn.microsoft.com/ja-jp/library/506720ff(VS.80).aspx
#include <stdlib.h>
#include <stdio.h>
#include <windows.h>

int main()
{
	char szFullPath[MAX_PATH] = {'\0'};
	char *szFilePart;

	_fullpath(szFullPath, 
		"..\\test.txt", 
		sizeof(szFullPath)/sizeof(szFullPath[0]));

	printf("FullPath : %s\n", szFullPath);

	return 0;
}