わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。

ハードリンクかどうかを取得する

ハードリンクされているファイルかどうかを取得します。GetFileInformationByHandleで取得した情報の、 nNumberOfLinksが2以上であればハードリンクされているファイルと判定できます。

#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <windows.h>
#include <Shlobj.h>



/*
	ハードリンクかどうか
*/
BOOL IsHardLink
(
	LPCWSTR pFilePath
)
{
	BOOL bHardLink = FALSE;

	/*
		ファイルのオープン(コピー元)
	*/
	HANDLE hFile = CreateFile(
			  pFilePath
			, 0
			, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE
			, NULL
			, OPEN_EXISTING
			, 0
			, NULL
		);
	if ( INVALID_HANDLE_VALUE != hFile ) {

		BY_HANDLE_FILE_INFORMATION tByHandleInfomation;

		// ファイル情報を取得する
		::GetFileInformationByHandle( hFile, &tByHandleInfomation );
		if ( 1 < tByHandleInfomation.nNumberOfLinks ) {

			// ハードリンクでした。
			bHardLink = TRUE;
		}

		// ファイルのクローズ
		::CloseHandle( hFile );
	}

	// ハードリンクかどうかを返す
	return( bHardLink );
}



/*
	ハードリンクかどうかを調べる
*/
int _tmain
(
	  int argc
	, _TCHAR* argv[]
)
{
	// std::wcoutのロケールを設定
	std::wcout.imbue( std::locale( "", std::locale::ctype ) );

	// ハードリンクかどうかを調べる
	BOOL bIsHardLink = IsHardLink( L"c:¥¥test¥¥test1.txt" );
	if ( FALSE != bIsHardLink ) {

		// ハードリンクでした。
		std::wcout << L"ハードリンクでした。" << std::endl;
	}
	else {

		// ハードリンクではなかった。
		std::wcout << L"ハードリンクではなかった。" << std::endl;
	}

	// 正常終了
	return( 0 );
}



実行結果

ハードリンクでした。






わびさびサンプルソース

WindowsやHTML5などのプログラムのサンプルコードやフリーソフトを提供します。