자리 표시자 파일을 지원하는 클라우드 동기화 엔진 빌드

동기화 엔진은 일반적으로 원격 호스트와 로컬 클라이언트 간에 파일을 동기화하는 서비스입니다. Windows의 동기화 엔진은 종종 Windows 파일 시스템을 통해 사용자에게 해당 파일을 제공하고 파일 탐색기. Windows 10 버전 1709 이전에는 Windows의 동기화 엔진 지원이 파일 탐색기 탐색 창, Windows 시스템 트레이 및 파일 시스템 필터 드라이버와 같은 시나리오에 구애받지 않는 임시 화면으로 제한되었습니다.

Windows 10 버전 1709(Fall Creators Update라고도 함)는 클라우드 파일 API도입했습니다. 이 API는 동기화 엔진에 대한 지원을 공식화하는 새로운 플랫폼입니다. 클라우드 파일 API는 개발자와 최종 사용자에게 많은 새로운 이점을 제공하는 방식으로 동기화 엔진을 지원합니다.

클라우드 파일 API에는 다음과 같은 네이티브 Win32 API 및 WinRT(Windows 런타임) API가 포함되어 있습니다.

  • 클라우드 필터 API: 이 네이티브 Win32 API는 사용자 모드와 파일 시스템 사이의 경계에서 기능을 제공합니다. 이 API는 자리 표시자 파일 및 디렉터리 만들기 및 관리를 처리합니다.
  • Windows.Storage.Provider 네임스페이스: 이 WinRT API를 사용하면 애플리케이션이 클라우드 스토리지 공급자를 구성하고 동기화 루트를 운영 체제에 등록할 수 있습니다.

참고 항목

클라우드 파일 API는 현재 UWP 앱에서 클라우드 동기화 엔진 구현을 지원하지 않습니다. 클라우드 동기화 엔진은 데스크톱 앱에서 구현되어야 합니다.

지원되는 기능

클라우드 파일 API는 클라우드 동기화 엔진을 빌드하기 위한 다음과 같은 기능을 제공합니다.

자리 표시자 파일

  • 동기화 엔진은 파일 시스템 헤더에 대해 1KB의 스토리지만 사용하고 정상적인 사용 조건에서 자동으로 전체 파일로 수화되는 자리 표시자 파일을 만들 수 있습니다. 자리 표시자 파일은 Windows Shell의 앱 및 최종 사용자에게 일반적인 파일로 제공됩니다.
  • 자리 표시자 파일은 Windows 커널에서 Windows 셸까지 수직으로 통합되며, 자리 표시자 파일과의 앱 호환성은 일반적으로 문제가 되지 않습니다. 파일 시스템 API, 명령 프롬프트 또는 데스크톱 또는 UWP 앱을 사용하여 자리 표시자 파일에 액세스하든, 파일은 추가 코드 변경 없이 수화되며 해당 앱은 정상적으로 파일을 사용할 수 있습니다.
  • 파일은 다음 세 가지 상태로 존재할 수 있습니다.
    • 자리 표시자 파일: 파일의 빈 표현이며 동기화 서비스를 사용할 수 있는 경우에만 사용할 수 있습니다.
    • 전체 파일: 파일이 암시적으로 수화되었으며 공간이 필요한 경우 시스템에서 탈수될 수 있습니다.
    • 고정된 전체 파일: 파일은 사용자가 파일 탐색기 통해 명시적으로 하이드레이션되었으며 오프라인에서 사용할 수 있도록 보장됩니다.

다음 이미지는 자리 표시자, 전체 및 고정된 전체 파일 상태가 파일 탐색기 표시되는 방법을 보여 줍니다.

Example of three file states in File Explorer

표준화된 동기화 루트 등록

  • 동기화 루트를 등록하는 것은 간단하고 표준화됩니다. 여기에는 다음 스크린샷과 같이 파일 탐색기 탐색 창에서 브랜드 노드를 만드는 것이 포함됩니다. 루트는 개별 최상위 항목으로 만들거나 부모 그룹화의 자식으로 만들 수 있습니다.

    Example of a sync root entry in File Explorer

셸 통합

  • 상태 아이콘:
    • 클라우드 파일 API는 파일 탐색기 Windows 데스크톱에 표시된 표준화된 자동 하이드레이션 상태 아이콘을 제공합니다.
    • 하이드레이션 상태에 사용되는 표준 Windows 상태 아이콘 외에도 추가 서비스별 속성에 대한 사용자 지정 상태 아이콘을 제공할 수 있습니다.
    • 레거시 아이콘 오버레이 셸 확장을 바꿉니다.
  • 진행률 표시:
    • 수화에 몇 초 이상 걸리는 자리 표시자 파일을 열면 수화 진행률이 표시됩니다. 진행률은 컨텍스트에 따라 몇 가지 위치에 표시됩니다.
      • 복사 엔진 대화 상자 창에서
      • 인라인 진행률이 파일 탐색기 파일 옆에 표시됩니다.
      • 사용자의 특정 지침에 따라 파일을 열지 않으면 사용자에게 알리고 의도하지 않은 하이드레이션 작업을 제어하는 방법을 제공하는 알림 메시지가 표시됩니다.
  • 썸네일 및 메타데이터:
    • 자리 표시자 파일에는 다양한 서비스 제공 미리 보기 및 확장 파일 메타데이터가 있어 사용자에게 원활한 파일 탐색기 환경을 제공할 수 있습니다.
  • 파일 탐색기 탐색 창:
    • 동기화 루트를 클라우드 파일 API에 등록하면 동기화 루트(아이콘 및 사용자 지정 이름 포함)가 파일 탐색기 탐색 창에 표시됩니다.
  • 파일 탐색기 상황에 맞는 메뉴:
    • 동기화 루트를 클라우드 파일 API에 등록하면 사용자가 파일의 하이드레이션 상태를 제어할 수 있는 파일 탐색기 상황에 맞는 메뉴에 여러 동사(메뉴 항목)가 자동으로 제공됩니다.
    • 데스크톱 브리지 호환되는 API를 사용하여 상황에 맞는 메뉴의 이 섹션에 추가 동사를 추가할 수 있습니다.
  • 파일 하이드레이션의 사용자 제어:
    • 사용자가 파일을 명시적으로 하이드레이션하지 않더라도 사용자는 항상 파일 하이드레이션을 제어합니다. 배경 수분 공급에 대한 대화형 알림이 표시되어 사용자에게 경고하고 옵션을 제공합니다. 다음 이미지는 하이드레이션 파일에 대한 알림 메시지를 보여 줍니다. Example of an interactive toast shown for background file hydration
    • 사용자가 대화형 알림을 통해 파일에 수분을 공급하지 못하도록 앱을 차단하는 경우 설정 자동 파일 다운로드 페이지에서 앱을 차단 해제할 수 있습니다. Screenshot of the automatic file downloads setting
  • 복사 엔진 작업 후크(Windows 10 Insider Preview 빌드 19624 이상 버전에서 지원됨):
    • 클라우드 스토리지 공급자는 동기화 루트 내에서 파일 작업을 모니터링하기 위해 셸 복사 후크를 등록할 수 있습니다.
    • 공급자는 동기화 루트 레지스트리 키 아래의 CopyHook 레지스트리 값을 COM 로컬 서버 개체의 CLSID로 설정하여 복사 후크를 등록합니다. 이 로컬 서버 개체는 IStorageProviderCopyHook 인터페이스를 구현합니다.
  • 파일 공유(Windows 11 버전 21H2 이상 버전에서 지원됨):
    • 클라우드 스토리지 공급자는 사용자가 동기화 루트 아래의 클라우드 파일에서 "공유" 명령을 선택할 때 호출되는 공유 처리기를 등록할 수 있습니다.
    • 공급자는 동기화 루트 레지스트리 키 아래의 ShareHandler 레지스트리 값을 COM 로컬 서버 개체의 CLSID로 설정하여 공유 처리기를 등록합니다. 이 로컬 서버 개체는 IExplorerCommand 인터페이스를 구현합니다.

데스크톱 브리지

  • 클라우드 파일 API를 사용하는 동기화 엔진은 구현 요구 사항으로 데스크톱 브리지 사용하도록 설계되었습니다.

클라우드 미러 샘플

클라우드 미러 샘플클라우드 파일 API를 사용하는 솔루션을 빌드하는 방법을 보여 줍니다. 프로덕션 코드로 사용할 수 없습니다. 강력한 오류 처리가 부족하며 가능한 한 쉽게 이해할 수 있도록 작성되었습니다. 로컬 디스크에 로컬 폴더를 미러 클라우드 미러라고 합니다. 클라우드 파일 서버를 나타내기 위한 서버 폴더와 동기화 루트 경로를 지정하기 위한 클라이언트 폴더를 지정합니다. TestStorageProviderDisplayName이라는 파일 탐색기 탐색 창에 최상위 노드가 나타나고 이 노드는 지정된 클라이언트 폴더에 매핑됩니다.

동기화와 관련하여 완전히 개발된 클라우드 파일 동기화 공급자가 구현해야 하는 항목은 다음과 같습니다.

  • 동기화 루트 파일이 자리 표시자일 때 서비스는 하이드레이션을 위해 파일의 내용을 복사해야 합니다. 이는 샘플에서 구현됩니다.
  • 동기화 루트 파일이 전체 파일이고 클라우드 서비스의 파일 내용이 변경되면 서비스는 로컬 동기화 클라이언트에 변경 내용을 알릴 책임이 있으며 로컬 동기화 클라이언트는 자체 사양에 따라 병합을 처리해야 합니다. 샘플에서는 구현되지 않습니다.
  • 동기화 루트 파일이 전체 파일이고 동기화 루트 경로(로컬 클라이언트)에 있는 파일의 내용이 변경되면 로컬 동기화 클라이언트는 클라우드 서비스에 알리고 자체 사양에 따라 병합을 처리해야 합니다. 로컬 파일 변경 알림은 샘플에서 구현되지만 아무 작업도 수행하지 않습니다.

샘플 사용

  1. 로컬 하드 드라이브에 두 개의 폴더를 만듭니다. 그 중 하나는 서버 역할을 하고 다른 하나는 클라이언트 역할을 합니다.
  2. 서버 폴더에 일부 파일을 추가합니다. 클라이언트 폴더가 비어 있는지 확인합니다.
  3. Visual Studio에서 클라우드 미러 샘플을 엽니다. CloudMirrorPackage 프로젝트를 시작 프로젝트로 설정한 다음 샘플을 빌드하고 실행합니다. 샘플에서 메시지가 표시되면 서버 및 클라이언트 폴더에 대한 두 경로를 입력합니다. 그러면 진단 정보가 포함된 콘솔 창이 표시됩니다.
  4. 파일 탐색기 열고 TestStorageProviderDisplayName 노드와 서버 폴더에 복사한 모든 파일에 대한 자리 표시자가 표시되는지 확인합니다. 선택기를 사용하지 않고 파일을 열려는 애플리케이션을 시뮬레이션하려면 여러 이미지를 서버 폴더에 복사합니다. 동기화 루트 폴더에서 해당 폴더 중 하나를 두 번 클릭하고 수분을 공급하고 있음을 확인합니다. 그런 다음, 사진 앱을 엽니다. 앱은 백그라운드에서 인접한 파일을 미리 로드하여 사용자가 다른 그림을 살펴볼 때 지연을 경험하지 않을 가능성이 높아질 수 있습니다. 토스트 또는 파일 탐색기 배경 탈수 발생을 관찰할 수 있습니다.
  5. 파일 탐색기 파일을 마우스 오른쪽 단추로 클릭하여 상황에 맞는 메뉴를 표시하고 TestCommand 메뉴 항목이 표시되는지 확인합니다. 이 메뉴 항목을 클릭하면 메시지 상자가 표시됩니다.
  6. 샘플을 중지하려면 콘솔 출력에 포커스를 설정하고 Ctrl-C를 누릅니다. 그러면 공급자가 제거되도록 동기화 루트 등록이 클린. 샘플이 충돌하는 경우 동기화 루트가 다시 등록될 기본 있습니다. 이렇게 하면 모든 항목을 클릭할 때마다 파일 탐색기 다시 시작되고 가짜 클라이언트 및 서버 위치에 대한 메시지가 표시됩니다. 이 경우 컴퓨터에서 CloudMirrorPackage 샘플 애플리케이션을 제거합니다.

샘플 아키텍처

샘플은 의도적으로 간단합니다. 정적 클래스를 사용하여 인스턴스 포인터를 전달할 필요가 없도록 합니다. 샘플의 기본 클래스는 다음과 같습니다.

  • FakeCloudProvider: 이 최상위 클래스는 다음 작업자 클래스를 제어합니다.
    • CloudProviderRegistrar: 동기화 루트 정보를 Windows 셸에 등록합니다.
    • 자리 표시자: 동기화 루트 경로에 자리 표시자 파일을 생성합니다.
    • ShellServices: 상황에 맞는 메뉴, 썸네일 및 기타 서비스에 대한 Windows 셸 공급자를 생성합니다.
    • CloudProviderSyncRootWatcher: 디렉터리워처를 인스턴스화하여 동기화 루트 경로의 변경 내용을 모니터링하고 변경 내용에 대해 작동합니다.
    • FileCopierWithProgress: 서버 폴더의 파일을 청크 단위로 천천히 클라이언트 폴더에 복사하여 실제 클라우드 서버에서 다운로드하는 시뮬레이션을 수행합니다. 알림 및 파일 탐색기 UI가 사용자에게 정보를 표시할 수 있도록 진행률 표시를 제공합니다.

위의 클래스 외에도 샘플은 사용자에게 폴더 및 일부 유틸리티를 묻는 메시지를 표시하는 몇 가지 도우미 클래스를 제공합니다. TestExplorerCommandHandler, CustomStateProvider, ThumbnailProviderUriSource는 모두 셸 서비스 공급자의 예입니다.

클라우드 파일 API 아키텍처

클라우드 파일 API의 스토리지 스택 핵심에는 cldflt.sys라는 파일 시스템 미니 필터 드라이버가 있습니다. 이 드라이버는 사용자의 애플리케이션과 동기화 엔진 간의 프록시 역할을 합니다. 동기화 엔진은 요청 시 데이터를 다운로드하고 업로드하는 방법을 알고 있으며, cldflt.sys는 셸과 협력하여 클라우드 데이터를 로컬로 사용할 수 있는 것처럼 파일을 표시해야 합니다.

Cldflt.sys는 현재 NTFS에 고유한 일부 기능에 따라 달라지므로 NTFS 볼륨만 지원합니다.

시스템에는 많은 파일 시스템 미니 필터 드라이버가 있으며 지정된 볼륨에서 동시에 활성화할 수 있습니다. 클라우드 파일 API에 가장 관심이 있는 드라이버는 바이러스 백신 파일 시스템 필터입니다.

파일 시스템 미니 필터 드라이버는 필터 관리자라는 특수 커널 모드 구성 요소에서 관리 및 지원됩니다. 필터 관리자는 필터 메시지 포트라는 구문을 통해 필터와 사용자 모드 구성 요소 간의 필터링되지 않은 통신을 용이하게 합니다.

하이드레이션 정책

Windows는 다양한 기본 하이드레이션 정책보조 하이드레이션 정책 한정자를 지원합니다. 기본 하이드레이션 정책에는 다음 순서가 있습니다.

항상 전체 전체 >> 프로그레시브 > 부분

애플리케이션과 동기화 엔진 모두 기본 기본 하이드레이션 정책을 정의할 수 있습니다. 지정하지 않으면 애플리케이션 및 동기화 엔진 모두에 대해 기본 하이드레이션 정책이 점진적입니다.

클라우드 파일의 하이드레이션 정책은 다음 수식에 따라 파일 열기 시간에 결정됩니다.

File hydration policy = max(app hydration policy, provider hydration policy)

예를 들어 사용자가 기본 수화 정책을 지정하지 않는 Contoso PDF 뷰어를 사용하여 Fabrikam Cloud Drive에 저장된 PDF 파일을 열려고 한다고 가정해 보겠습니다. 따라서 애플리케이션 하이드레이션 정책은 점진적 수분 공급이며, 이 경우 기본적으로 적용됩니다. 그러나 Fabrikam Cloud Drive는 전체 하이드레이션 동기화 엔진이므로 파일의 최종 하이드레이션 정책은 전체 하이드레이션이 되어 첫 번째 액세스 시 파일이 완전히 수화됩니다. 동기화 엔진이 점진적 하이드레이션을 지원하지만 앱의 기본 설정이 전체 하이드레이션인 경우에도 동일한 결과가 발생합니다.

파일을 연 후에는 파일 하이드레이션 정책을 변경할 수 없습니다.

재문 분석 지점을 사용하는 애플리케이션과의 호환성

클라우드 파일 API는 재구성 지점을 사용하여 자리 표시자 시스템을 구현합니다. 재조사 지점에 대한 일반적인 오해는 기호 링크와 동일하다는 것입니다. 이러한 오해는 때때로 애플리케이션 구현에 반영되므로 재설계 지점이 발생할 때 많은 기존 애플리케이션에서 오류가 발생합니다.

이 호환성 문제를 완화하기 위해 클라우드 파일 API는 항상 기본 이미지가 %systemroot%있는 동기화 엔진 및 프로세스를 제외한 모든 애플리케이션에서 재구매 지점을 숨깁니다. 재구문 지점을 올바르게 이해하는 애플리케이션은 RtlSetProcessPlaceholderCompatibilityMode 또는 RtlSetThreadProcessPlaceholderCompatibilityMode를 사용하여 플랫폼이 클라우드 파일 API 재 분석 지점을 노출하도록 강제할 수 있습니다.