プラットフォーム
クライアント - Windows 8.1 サーバー - Windows Server 2012 R2
説明
プレースホルダー ファイルを使用すると、接続に関係なく、ユーザーは Microsoft OneDrive ファイルを表示および管理できます。 プレースホルダー ファイルは、ファイルがローカルにキャッシュされていない場合でも、OneDrive 名前空間を表します。 ファイルメタデータと写真のサムネイル画像が含まれています。
症状
エンド ユーザーと開発者は、プレースホルダー ファイルの外観と動作はローカル ファイルとほぼ同じです。
アプリで [共通ファイル] ダイアログを使用してファイル システムを列挙した場合、アプリは影響を受けません。 ユーザーが共通の /file ダイアログからファイルを開こうとすると、ファイルの内容がダウンロードされ、アプリに渡されます。
アプリがファイル システムに直接アクセスする場合、アプリは次のガイドラインを使用してプレースホルダー ファイルを利用できます。
解決策
- プレースホルダーは、属性に基づく規則によって非表示になります
- 再解析タグ ID IO_REPARSE_TAG_FILE_PLACEHOLDERを使用してプレースホルダーを識別する
シームレスな動作にはシェル データ モデルを使用します。
- SHCreateItemFromParsingName() を使用してシェル項目を作成する
- IShellItem::BindToHandler(BHID_Stream) を使用してストリームにバインドする
- プロパティ アクセスのユーザー プロパティ ハンドラー (IShellItem2::GetPropertyHandler)
- プレースホルダーのサムネイル画像を取得するユーザー シェル thumbnailhandler
- 動詞が BindToHandler を介してストリームにバインドする場合は、動詞の実装で SupportedProtocols=* を指定します
#include <winnth> //for IO_REPARSE_TAG_FILE_PLACEHOLDER
// Helper that indicates this is a
bool IsFilePlaceholder(WIN32_FIND_DATA const &findData)
{
return (findData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) &&
(findData.dwReserved0 == IO_REPARSE_TAG_FILE_PLACEHOLDER);
}
bool IsFilePlaceholder(_In_PCWSTR filePath)
{
bool isPlaceholder = false;
WIN32_FIND_DATA findData;
HANDLE hFind = FindFirstFile(filePath, &findData);
if (hFind ! = INVALID_HANDLE_VALUE)
{
isPlaceholder = (findData.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT) &&
(findData.dwReserved0 == IO_REPARSE_TAG_FILE_PLACEHOLDER);
FindClose(hFind);
}
Return isPlaceholder;
}