あるファイルへの変更が、他のファイルへ同期されるようにするには(ハードリンク)
CreateHardLink API () を使用すると、既存ファイルと新規ファイルの間に NTFS ハードリンクを確立します。
ハードリンクは、ショートカットと異なり、すべてのファイルが1つの中身を持つファイルとして動作します。
つまり、1つのファイルを修正すると他のファイルに同期して反映されます。
すべてのファイルを削除しない限り中身は持ち続けます。
MSDNから引用しますと、「ハードリンクを使い、同じ下位ファイルに複数の名前を付けることができます。更新が行われると、ハードリンクは下位ファイルを同期させます」となります。
※ ハードリンクは、Windows 2000以降で、NTFSフォーマットのときのみ使用可能です。
※ ハードリンクは同じ拡張子で作成してください。
以下は、サンプルになります。中身のあるa.txt をあらかじめデスクトップに作成しておいてください。
ハードリンクを作成後、a.txt もしくは ハードリンクファイル を編集して保存し、もう片方のファイルを開いてください。内容が同期されていることがわかります。
※ ハードリンクはファイル数の参照カウントを維持することにより、ファイルが1つでもある限り、中身を保持し続けます!ショートカットより圧倒的に便利です。
■■■ hardlink プロジェクト
■ main.cpp
// Windows 2000以降 ( CreateHardLink のため )
#define _WIN32_WINNT 0x0500
#include <windows.h>
#include <tchar.h>
#include <shlobj.h>
#include <string>
int WINAPI _tWinMain ( HINSTANCE hThisInstance,
HINSTANCE,
_TCHAR *,
int )
{
enum
{
MY_MAX_PATH = 2048
};
_TCHAR szDesktopPath[ MY_MAX_PATH ];
SHGetSpecialFolderPath ( NULL, szDesktopPath, CSIDL_DESKTOPDIRECTORY, TRUE );
_TCHAR szSrcPath[ MY_MAX_PATH ];
lstrcpy ( szSrcPath, szDesktopPath );
lstrcat ( szSrcPath, _TEXT ( "\\a.txt" ) );
_TCHAR szDstPathBuf[ MY_MAX_PATH ];
lstrcpy ( szDstPathBuf, szDesktopPath );
lstrcat ( szDstPathBuf, _TEXT ( "\\a" ) );
// すでにファイルがあれば、ファイル名を変えて、10個まではハードリンクを作成する
// "a00.txt","a01.txt", ... ,"a09.txt"
UINT i = 0;
while ( 10 > i )
{
HANDLE hFindFile;
WIN32_FIND_DATA win32FindData;
std::basic_string < _TCHAR > strPath ( szDstPathBuf );
_TCHAR szNum[ 3 ];
wsprintf ( szNum, _TEXT ( "%02u" ), i );
strPath += szNum;
strPath += _TEXT ( ".txt" );
hFindFile = FindFirstFile ( strPath.c_str (), &win32FindData );
if ( INVALID_HANDLE_VALUE == hFindFile )
{
// ファイルがないので作成
if ( CreateHardLink ( strPath.c_str (), szSrcPath, NULL ) )
{
MessageBox ( NULL,
_TEXT ( "ハードリンクを作成しました" ),
_TEXT ( "確認" ),
MB_OK );
}
else
{
MessageBox ( NULL,
_TEXT ( "ハードリンクの作成に失敗しました" ),
_TEXT ( "エラー" ),
MB_OK | MB_ICONSTOP );
}
return 0;
}
else
{
FindClose ( hFindFile );
}
i++;
}
MessageBox ( NULL,
_TEXT ( "ハードリンクをこれ以上作成できません" ),
_TEXT ( "確認" ),
MB_OK | MB_ICONSTOP );
return 0;
}
|
|