Programming Windows Maniacs - プログラミング ウィンドウズ マニアックス ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて  
ホーム >> OS >> Windows®2000 >> あるファイルへの変更が、他のファイルへ同期されるようにするには(ハードリンク)

あるファイルへの変更が、他のファイルへ同期されるようにするには(ハードリンク)

  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;
}
  ■ ご利用に際して ■ 更新履歴 ■ お問い合わせ ■ このホームページについて Copyright © 2014 A.Morita