Share via


PrjUpdateFileIfNeeded 함수(projectedfslib.h)

공급자가 로컬 파일 시스템에 캐시된 항목을 업데이트할 수 있도록 합니다.

구문

HRESULT PrjUpdateFileIfNeeded(
  [in]            PRJ_NAMESPACE_VIRTUALIZATION_CONTEXT namespaceVirtualizationContext,
  [in]            PCWSTR                               destinationFileName,
  [in]            const PRJ_PLACEHOLDER_INFO           *placeholderInfo,
  [in]            UINT32                               placeholderInfoSize,
  [in, optional]  PRJ_UPDATE_TYPES                     updateFlags,
  [out, optional] PRJ_UPDATE_FAILURE_CAUSES            *failureReason
);

매개 변수

[in] namespaceVirtualizationContext

가상화 instance 대한 불투명 핸들입니다.

[in] destinationFileName

업데이트할 파일 또는 디렉터리에 대한 가상화 루트를 기준으로 경로를 지정하는 null로 종료된 유니코드 문자열입니다.

[in] placeholderInfo

파일 또는 디렉터리에 대한 업데이트된 메타데이터를 포함하는 PRJ_PLACEHOLDER_INFO 버퍼에 대한 포인터입니다.

placeholderInfo-VersionInfo.ContentID>에 파일/디렉터리에 이미 있는 콘텐츠 식별자와 동일한 콘텐츠 식별자가 포함되어 있으면 호출이 성공하고 업데이트가 수행되지 않습니다. 그렇지 않으면 호출이 성공하면 자리 표시자Info-VersionInfo.ContentID>가 파일의 기존 콘텐츠 식별자를 대체합니다.

[in] placeholderInfoSize

자리 표시자Info가 가리키는 버퍼의 크기(바이트)입니다.

[in, optional] updateFlags

업데이트를 제어하는 플래그입니다.

항목이 더티 자리 표시자, 전체 파일 또는 삭제 표시이고 공급자가 적절한 플래그를 지정하지 않는 경우 이 루틴은 자리 표시자를 업데이트하지 못합니다.

[out, optional] failureReason

업데이트가 실패한 이유를 설명하는 코드를 수신하는 선택적 포인터입니다.

반환 값

HRESULT_FROM_WIN32(ERROR_FILE_SYSTEM_VIRTUALIZATION_INVALID_OPERATION) 오류가 반환되면 항목의 상태 및 updateFlags 값으로 인해 업데이트가 실패했습니다. failureReason은 지정된 경우 실패 이유를 설명합니다.

설명

공급자는 이 루틴을 사용하여 공급자의 백업 저장소에서 항목 정보가 변경되고 업데이트가 로컬 파일 시스템에 캐시된 항목에 반영되어야 하는 경우 로컬 파일 시스템의 항목을 업데이트합니다.

이 루틴은 가상 파일/디렉터리에서 호출할 수 없습니다. 업데이트할 파일/디렉터리가 "자리 표시자" 이외의 상태에 있는 경우 공급자는 updateFlags 매개 변수에 PRJ_UPDATE_TYPES 값의 적절한 조합을 지정해야 합니다. 이렇게 하면 데이터가 실수로 손실되는 것을 방지할 수 있습니다. 이 루틴에서 성공적으로 반환되면 항목이 업데이트된 메타데이터가 있는 자리 표시자가 되기 때문에; 자리 표시자를 만든 후 변경된 메타데이터 또는 포함된 모든 파일 데이터가 삭제됩니다.

공급자는 로컬 파일 시스템을 관리하는 항목의 캐시로 사용합니다. 항목(파일 또는 디렉터리)은 로컬 파일 시스템의 6개 상태 중 하나에 있을 수 있습니다.

가상 - 항목이 디스크에 로컬로 존재하지 않습니다. 부모 디렉터리를 열거하는 동안 합성된 것으로 프로젝션됩니다. 가상 항목은 부모 디렉터리의 전체 콘텐츠를 표시하기 위해 디스크에 있을 수 있는 모든 항목과 병합됩니다.

자리 표시자 - 파일의 경우: 파일의 콘텐츠(기본 데이터 스트림)가 디스크에 없습니다. 파일의 메타데이터(이름, 크기, 타임스탬프, 특성 등)는 디스크에 캐시됩니다. 디렉터리의 경우: 디렉터리의 직접 하위 항목 중 일부 또는 전부(디렉터리의 파일 및 디렉터리)가 디스크에 없습니다. 즉, 여전히 가상입니다. 디렉터리의 메타데이터(이름, 타임스탬프, 특성 등)는 디스크에 캐시됩니다.

하이드레이션된 자리 표시자 - 파일의 경우: 파일의 콘텐츠 및 메타데이터가 디스크에 캐시되었습니다. "부분 파일"이라고도 합니다. 디렉터리: 디렉터리에는 수화 자리 표시자가 없습니다. 디스크에서 자리 표시자로 만든 디렉터리가 수화된 자리 표시자 디렉터리가 되지 않습니다. 이렇게 하면 공급자가 해당 백업 저장소의 디렉터리에서 항목을 추가하거나 제거하고 이러한 변경 내용을 로컬 캐시에 반영할 수 있습니다.

더티 자리 표시자(수화 여부) - 항목의 메타데이터가 로컬로 수정되었으며 더 이상 공급자 저장소의 상태 캐시가 아닙니다. 자리 표시자 디렉터리에서 파일 또는 디렉터리를 만들거나 삭제하면 자리 표시자 디렉터리가 더티.

전체 파일/디렉터리 - 파일의 경우: 파일의 콘텐츠(기본 데이터 스트림)가 수정되었습니다. 파일은 더 이상 공급자의 저장소에 있는 해당 상태의 캐시가 아닙니다. 로컬 파일 시스템에서 만든 파일(즉, 공급자의 저장소에 존재하지 않는 파일)도 전체 파일로 간주됩니다. 디렉터리의 경우: 로컬 파일 시스템에서 만든 디렉터리(즉, 공급자의 저장소에 존재하지 않는 디렉터리)는 전체 디렉터리로 간주됩니다. 자리 표시자로 디스크에서 만든 디렉터리가 전체 디렉터리가 되지 않습니다.

삭제 표시 - 로컬 파일 시스템에서 삭제된 항목을 나타내는 특별한 숨겨진 자리 표시자입니다. 디렉터리가 열거되면 ProjFS는 로컬 항목 집합(자리 표시자, 전체 파일 등)을 가상 프로젝터 항목 집합과 병합합니다. 항목이 로컬 집합과 프로젝트된 집합 모두에 표시되면 로컬 항목이 우선합니다. 파일이 없으면 로컬 상태가 없으므로 열거형에 표시됩니다. 그러나 해당 항목이 삭제된 경우 열거형에 해당 항목이 표시되는 것은 예기치 않은 일입니다. 삭제된 항목을 삭제 표시로 바꾸면 다음과 같은 효과가 발생합니다.

  • 항목을 표시하지 않는 열거형
  • "파일을 찾을 수 없음"과 같은 항목이 실패할 것으로 예상되는 파일이 열립니다.
  • 파일은 항목이 없는 경우에만 성공할 것으로 예상하는 를 만듭니다. ProjFS는 작업의 일부로 삭제 표시를 제거합니다.

위의 상태를 설명하기 위해 가상화 루트 C:\root에 단일 파일 "foo.txt"이 있는 ProjFS 공급자가 있는 경우 다음 시퀀스를 고려합니다.

  • 앱이 C:\root를 열거합니다. 가상 파일 "foo.txt"이 표시됩니다. 파일에 아직 액세스하지 않았으므로 디스크에 파일이 없습니다.
  • 앱은 C:\root\foo.txt 핸들을 엽니다. ProjFS는 공급자에게 자리 표시자를 만들도록 지시합니다.
  • 앱은 파일의 콘텐츠를 읽습니다. 공급자는 ProjFS에 파일 콘텐츠를 제공하며 C:\root\foo.txt 위해 캐시됩니다. 이제 파일이 수화 자리 표시자입니다.
  • 앱은 마지막으로 수정한 타임스탬프를 업데이트합니다. 이제 파일이 더티 수화 자리 표시자입니다.
  • 앱은 파일에 대한 쓰기 액세스에 대한 핸들을 엽니다. 이제 C:\root\foo.txt 전체 파일입니다.
  • 앱이 C:\root\foo.txt 삭제합니다. ProjFS는 파일을 삭제 표시로 바꿉니다. 이제 앱이 C:\root를 열거하면 foo.txt 표시되지 않습니다. 파일을 열려고 하면 열기가 실패하고 ERROR_FILE_NOT_FOUND.

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 10, 버전 1809[데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server [데스크톱 앱만 해당]
대상 플랫폼 Windows
헤더 projectedfslib.h