ハードリンクされているファイルかどうかを取得します。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 );
}
ハードリンクでした。