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