Windows 시스템 프로그래밍: HardLink 및 SoftLink 생성

안녕하세요, 이 게시물에서는 C++를 사용하여 창에서 하드 링크와 소프트 링크를 만드는 방법에 대해 알아봅니다.

Linux에 익숙하다면 "symlink"에 대해 들어봤을 것입니다. 절대 또는 상대 경로의 형태로 에 대한 참조를 포함하는 파일 또는 디렉토리의 별칭을 만드는 데 도움이 됩니다. 그러나 Windows에서는 파일에 대해서만 하드 링크를 만들 수 있습니다. 원본 파일을 삭제하더라도 하드 링크된 파일에 계속 액세스할 수 있습니다.

복사된 파일과 하드 링크된 파일의 차이점은 복사된 파일에서 파일의 독립적인 복사본을 얻게 된다는 것입니다. 즉, 두 파일 모두 서로 연결되어 있지 않습니다. 이제 하드 링크 파일에서 하드 링크 파일의 내용을 변경하면 원래 파일에 반영되며 그 반대의 경우도 마찬가지입니다.

CreateHardLinkA 헤더 파일에서 winbase.h 함수를 사용하여 하드링크를 생성할 수 있습니다.

BOOL CreateHardLinkA(
  LPCSTR                lpFileName,
  LPCSTR                lpExistingFileName,
  LPSECURITY_ATTRIBUTES lpSecurityAttributes
);


다음과 같은 기능 매개변수 설명

  • lpFileName → 새 하드 링크 파일의 이름.

  • lpExistingFileName → 하드 링크를 생성하려는 기존 파일의 이름.

  • lpSecurityAttributes → 하드 링크에 대한 보안 속성. 예약되어 있으며 NULL로 설정해야 합니다.

  • 다음은 파일의 하드 링크를 만들기 위한 전체 코드 스니펫입니다.

    #include <Windows.h>
    #include <string>
    #include <iostream>
    #include <WinBase.h>
    
    int main(int argc, char**argv)
    {
        if (argc < 3) {
            printf("usage: %s <existing file name> <new file name>\n", argv[0]);
            return 1;
        }
    
        /**
          * https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createhardlinka
          */
        BOOL hlBool = CreateHardLinkA(argv[2], argv[1], NULL);
    
        if (hlBool) {
            printf("Hard link created\n");
            return 0;
        }
        else {
            printf("Error Code: %d\n", GetLastError());
            return 1;
        }
    }
    


    이제 소프트 링크 생성에 대해 알아보겠습니다. 소프트 링크(symlink라고도 함)는 단순히 파일의 바로 가기입니다(예, 컨텍스트 메뉴를 통해 이미 생성했습니다 :D). 하드링크와 달리 파일과 디렉토리 모두 생성이 가능하며 원본 파일을 삭제하면 소프트링크를 통해 파일에 접근할 수 없다.

    CreateSymbolicLinkA에서 winbase.h 함수를 사용하여 심볼릭 링크를 만들 수 있습니다.

    BOOLEAN CreateSymbolicLinkA(
      LPCSTR lpSymlinkFileName,
      LPCSTR lpTargetFileName,
      DWORD  dwFlags
    );
    


    다음과 같은 기능 매개변수 설명

  • lpSymlinkFileName → 생성할 심볼릭 링크의 경로

  • lpTargetFileName → 생성할 심볼릭 링크의 타겟 경로

  • dwFlags → 이것은 링크 대상lpTargetFileName이 디렉토리인지 여부를 나타냅니다.
  • 0x0 → 링크 대상이 파일입니다.
  • 0x1 → 링크 대상이 디렉토리입니다.


  • 다음과 같이 코드를 완성하십시오

    #include <Windows.h>
    #include <string>
    #include <iostream>
    #include <WinBase.h>
    #include <fileapi.h>
    #define print printf
    
    int main(int argc, char** argv) {
        if (argc < 3) {
            printf("usage: %s <existing file name> <new file name>\n", argv[0]);
            return 1;
        }
    
        DWORD flags = 0x0; // flag for creating symlink of a file
    
        if (GetFileAttributesA(argv[1]) == FILE_ATTRIBUTE_DIRECTORY) {
            print("dir");
            flags = SYMBOLIC_LINK_FLAG_DIRECTORY; // flag for creatng symlink of directory
        }
    
        /**
          * https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createsymboliclinka
          */
        BOOLEAN slBool = CreateSymbolicLinkA(argv[2], argv[1], flags);
    
        if (slBool) {
            printf("Symlink created\n");
            return 0;
        }
        else {
            DWORD err = GetLastError();
            if (err == 1314) {
                printf("Try again with administrator account\n");
                return 1;
            }
            printf("Error Code: %d\n", err);
            return 1;
        }
    }
    


    참고 관리자 계정으로 프로세스를 실행하지 않고 소프트 링크를 생성하려면 dwFlags 값을 SYMBOLIC_LINK_FLAG_ALLOW_UNPRIVILEGED_CREATE 로 설정할 수 있습니다. 이 플래그를 사용하기 전에 developer mode을 활성화해야 합니다.

    이 게시물을 읽어 주셔서 감사합니다. 링크를 따라 나에게 연락하십시오
  • 이메일: [email protected]
  • 트위터:
  • 페이스북: @tbhaxor
  • GitHub: @tbhaxor
  • 링크드인:
  • 인스타그램:
  • 좋은 웹페이지 즐겨찾기