更新履歴(8件・最終更新 2026年09月07日)
この記事に加えた変更の記録です。アーカイブした更新前のバージョンは、DOI付きの固定URLから読めます。
- 記事の主旨を保ち、パスと実体の切り分け、プレースホルダーの仕組みと属性、アプリ側・情シス側の対策の順に再構成した。ピン留めの指示とダウンロード完了の確認を区別した。
- 知識マップの関係を総点検し、説明文と食い違っていた関係(向きの逆転・過剰な一般化・述語の取り違え)を修正しました。本文の説明は変えていません。
- 知識マップの関係を総点検し、説明文と食い違っていた関係(向きの逆転・過剰な一般化・述語の取り違え)を修正しました。本文の説明は変えていません。
- 知識マップの関係を総点検し、説明文と食い違っていた関係(向きの逆転・過剰な一般化・述語の取り違え)を修正しました。本文の説明は変えていません。
- 知識マップの関係を総点検し、説明文と食い違っていた関係(向きの逆転・過剰な一般化・述語の取り違え)を修正しました。本文の説明は変えていません。
- 知識マップの関係を総点検し、説明文と食い違っていた関係(向きの逆転・過剰な一般化・述語の取り違え)を修正しました。本文の説明は変えていません。
- 知識マップの「ハイドレーションがプロバイダー停止を引き起こし得る」という関係の因果の向きを正し、「プロバイダー停止がハイドレーションを妨げる」に改めました。本文の説明は変えていません。
- 仕組みの説明を図で追えるよう、Mermaid図を18点追加しました。業務アプリの暗黙の前提の置き換わり、KFMによるパス移動の影響とKFMが有効になる経路、ファイル オンデマンドの3状態の遷移、ハイドレーションの流れ、リパースポイントの隠蔽、プレースホルダーのプロパティの見え方、attribでの状態切り替えの順序、オンライン専用ファイルを開いたときの分岐、一括処理によるダウンロード誘発、属性を想定しないコードの誤動作、監視と書き戻しのループ、排他ロックと競合コピー、スキャンによるハイドレーション誘発、列挙時の属性判定の流れ、FILE_FLAG_OPEN_NO_RECALLの効果と限界、ストレージセンサーの自動解放の分岐、応急処置から恒久対処への流れを図にしています。本文の文章とコード、参考リンクは変えていません。
- 初版公開
この記事を引用する(DOI(登録済みアーカイブ): 10.5281/zenodo.22054261)
以下のDOIは過去に登録されたアーカイブを指しており、現在の本文とは一致しない場合があります。現在の本文を参照するときは、このページのURLを使用してください。
小村 豪(2026)「OneDrive「ファイル オンデマンド」と業務アプリ ── プレースホルダーが壊す前提と対策」合同会社小村ソフト. https://comcomponent.com/blog/onedrive-files-on-demand-business-apps/
- DOI(登録済みアーカイブ)
- 10.5281/zenodo.22054261
- DOI(前回登録した版)
- 10.5281/zenodo.22054262
「デスクトップに保存したCSVを業務アプリが読めない」「PCを入れ替えたら、今まで動いていた取込処理が『ファイルが見つかりません』で止まる」。エクスプローラーにはファイルが見えているため、保存し直しても、アプリを再起動しても、原因がつかめないことがあります。
このとき、分けて確認したいのがファイルの場所と中身がローカルにあるかです。OneDriveの「既知のフォルダーの移動(KFM)」はデスクトップなどの場所を変え、「ファイル オンデマンド」は中身を必要になるまでクラウド側に置きます。どちらも、業務アプリが従来のローカルファイルを前提にしていると問題になります。12
この記事では、中小企業の情シス担当者とWindowsアプリ開発者に向けて、最初に問い合わせの切り分け手順を示します。そのあとで、プレースホルダーの仕組みと属性の読み方、業務アプリの落とし穴、開発側・情シス側の対策を整理します。
1. まず結論 ── 「場所」と「実体」を別々に確認する
エクスプローラーに見えていることは、アプリが正しいパスを参照していることも、中身をすぐ読めることも保証しません。最初に、次の2つを切り分けます。
| 変わる前提 | OneDriveの機能 | 業務アプリへの影響 | 最初に確認すること |
|---|---|---|---|
| デスクトップなどの実パス | KFM(既知のフォルダーの移動) | 固定パスを使うアプリが移動後のファイルを見つけられない | アプリの設定パスと、既知フォルダーの現在のパス |
| ファイルの中身がローカルにあること | ファイル オンデマンド | 存在確認は通っても、読み取りでダウンロード待ちやエラーになる | 状態アイコン、ファイル属性、OneDriveの稼働状態 |
KFMで移動したパスは、既知フォルダーAPIで取得します。ファイル オンデマンドの状態は、まず属性で調べ、中身が必要なファイルだけを開きます。ファイル オンデマンドは現在の同期アプリでは既定で有効であり、Microsoftも有効のままの運用を推奨しています。問題が起きたからといって、最初から全体を無効にする必要はありません。134
応急処置は、業務に必要なフォルダーを「常にこのデバイス上に保持する」にして実体を確保することです。ただし、間違ったパスの修正は別に必要です。恒久対処は、アプリ側では保存先・読取処理・監視処理を見直し、情シス側ではピン留めとポリシーで必要な状態を維持することになります。
図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全16件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle
2. 「ファイルが読めない」相談を受けたときの切り分け
2.1. パスから順に、6項目を確認する
いきなり対象フォルダーの全ファイルを開くのではなく、パスとメタデータから調べます。存在確認と読み取りを分けて考えるための手順です。
| # | 確認すること | 方法 | 分かること |
|---|---|---|---|
| 1 | パスはOneDrive配下か | echo %OneDrive% で同期ルートを確認し、対象パスと突き合わせる。エクスプローラーのアドレスバーで「デスクトップ」の実パスも確認 |
KFM・OneDriveが関与する問題かどうか |
| 2 | ファイルの状態 | attrib <パス> でU(オンライン専用)・P(ピン留め)・Oを確認。プロパティの「ディスク上のサイズ」も見る |
実体がローカルにあるか、プレースホルダーか |
| 3 | OneDriveの稼働状態 | タスクトレイのアイコン(サインイン・一時停止・エラー)、Get-Process OneDrive |
ハイドレーションできる状態か。0x8007016Aは停止・構成不良が典型5 |
| 4 | ネットワーク | 社内プロキシ・帯域・OneDriveサービスへの到達性 | ダウンロード自体が可能か |
| 5 | ディスクの空き容量 | 対象ボリュームの空き。低容量時はOneDriveがダウンロードをブロックするポリシーもある | ハイドレーション失敗の別要因 |
| 6 | 失敗の記録 | アプリのエラーコード・発生時刻を控え、同期アプリのエラー表示と突き合わせる | アプリ側の問題かOneDrive側の問題か |
個人用と職場用など、利用しているOneDriveに応じて OneDrive / OneDriveCommercial の環境変数も手掛かりにします。「デスクトップ」という表示名だけで判断せず、アプリが実際に参照したパスと突き合わせることが重要です。
OneDrive配下ではなく、プレースホルダーでもないなら、OneDriveだけを疑い続けず、共有フォルダーやパス長などの確認へ進みます。「ネットワークドライブとUNCパスの落とし穴」「MAX_PATHとWindowsのパス・ファイル名の落とし穴」で別系統の原因を整理しています。
2.2. 応急処置と、業務を再開できるかの確認を分ける
オンライン専用で中身を読めない場合は、対象フォルダーを右クリックして「常にこのデバイス上に保持する」を選びます。スクリプトで切り替える場合は attrib +p -u <フォルダー> /s /d のように、ピン留めと同時に非ピン留め属性を外します。67
ここで確認したいのは、操作をしたことではなく、必要なファイルのダウンロードが完了して読めることです。ピン留めはローカルに保持する意図を示す属性であり、OneDriveの停止、ネットワーク不調、空き容量不足まで解消するものではありません。同期アプリの状態と対象ファイルの実体を確認してから、取込処理を再実行します。36
復旧後は、固定パスやデータ配置が原因なら6章のアプリ側対策へ、実体保持や端末設定のばらつきが原因なら7章の情シス側対策へ進みます。ピン留めで一度動いたことと、再発しない設計になったことは別です。
3. 何が変わったのか ── KFMとプレースホルダーの仕組み
3.1. KFMはデスクトップなどの実パスを変える
KFM(Known Folder Move)は、OneDriveの設定画面で「バックアップ」「重要なフォルダーをバックアップする」などと表示される機能です。有効にすると、デスクトップ・ドキュメント・ピクチャの実体がOneDrive配下へ移動します。次はパスの例です。実際のフォルダー名や同期ルートは環境によって異なるため、この文字列をそのままコードへ埋め込まないでください。1
| ユーザーに見える場所 | KFM前の実パス | KFM後の実パス |
|---|---|---|
| デスクトップ | C:\Users\taro\Desktop |
C:\Users\taro\OneDrive\デスクトップ |
| ドキュメント | C:\Users\taro\Documents |
C:\Users\taro\OneDrive\ドキュメント |
| ピクチャ | C:\Users\taro\Pictures |
C:\Users\taro\OneDrive\画像 |
新しいPCの初期セットアップ(OOBE)でMicrosoftアカウントや職場アカウントにサインインした際に、バックアップが提案され、そのまま有効になる構成があります。組織では KFMSilentOptIn ポリシーにより、ユーザーの操作なしで一斉に移動することもできます。利用者が意識して設定した場合だけを想定してはいけません。18
厄介なのは、エクスプローラーの見た目がほとんど変わらないことです。SHGetKnownFolderPath や.NETの Environment.GetFolderPath を使うアプリは、移動後のパスを取得できます。一方、C:\Users\%USERNAME%\Desktop のような固定パスを設定ファイルやコードに埋め込んだアプリは、移動前の場所を探し続けます。
つまり、KFMへの対応は、まずパス解決の問題です。移動後の正しいパスが分かったあとで、そのファイルの中身がローカルにあるかを確認します。
3.2. ファイル オンデマンドは「見えること」と「中身があること」を分ける
ファイル オンデマンドが有効な環境では、同期対象のファイルをエクスプローラーに表示しながら、中身は必要になるまでダウンロードせずに済みます。他のデバイスやWebで作られたファイルも、オンライン専用のプレースホルダーとして見えます。24
状態は、エクスプローラーのアイコンで見分けられます。9
| アイコン | 状態 | ローカルの実体 |
|---|---|---|
| 雲マーク | オンライン専用 | なし(プレースホルダーのみ) |
| 白地にチェック | ローカルで利用可能 | あり(ただし後で自動的に解放され得る) |
| 緑地に白チェック | 常にこのデバイス上に保持(ピン留め) | あり(自動解放の対象外) |
大切なのは、一度開いた「ローカルで利用可能」と、ピン留めした「常にこのデバイス上に保持」は違うことです。前者は、ユーザーの「空き領域を増やす」操作やストレージセンサーによって、再びオンライン専用へ戻ることがあります。「先月は読めた」は、今回も中身が残っている根拠にはなりません。210
stateDiagram-v2
accTitle: ファイル オンデマンドの3状態と遷移
accDescr: オンライン専用のファイルは開くとローカルで利用可能になるが、空き領域を増やす操作やストレージセンサーで再びオンライン専用へ戻り、ピン留めしたファイルだけが自動解放の対象外になる
s1: オンライン専用(雲マーク)
s2: ローカルで利用可能
s3: ピン留め(常にこのデバイス上に保持)
s1 --> s2: 開く(ハイドレーション)
s2 --> s1: 空き領域を増やす
s2 --> s1: ストレージセンサー
s1 --> s3: 常にこのデバイス上に保持
s2 --> s3: 常にこのデバイス上に保持
s3 --> s2: ピン留め解除
図1: 一度ダウンロードしただけのファイルは、ピン留めしたファイルと違い、自動解放の対象になり得る。
3.3. 読み取り時にCloud Files APIが中身を取り寄せる
ファイル オンデマンドは、Windows 10 バージョン1709で導入されたCloud Files APIの上に実装されています。ファイルシステム側では cldflt.sys というミニフィルター(サービス名 CldFlt、Windows Cloud Files Filter Driver)が働き、OneDriveはこのAPIを使う同期プロバイダーのひとつです。116
中身をまだ持たないプレースホルダーは、ファイル名・サイズ・タイムスタンプなどのメタデータだけを持つリパースポイントです。Microsoftの説明では、ファイルシステムヘッダーの保存に約1KBを使います。アプリが中身を読もうとすると、ミニフィルターが同期プロバイダーにデータの転送を要求し、必要なデータが届いてから読み取りが進みます。この取り寄せをハイドレーション、ローカルの実体を解放してプレースホルダーへ戻すことをデハイドレーションと呼びます。11
sequenceDiagram
accTitle: プレースホルダーを開いたときのハイドレーション
accDescr: アプリがプレースホルダーを開いて読むと、cldflt.sysミニフィルターが要求を検知して同期プロバイダーにデータ転送を指示し、ダウンロード完了を待ってから読み取りが進む
participant app as 業務アプリ
participant flt as cldflt.sysミニフィルター
participant sync as 同期プロバイダー
app->>flt: 開いて読み取り要求
flt->>sync: データ転送を指示
sync-->>flt: ダウンロード完了
flt-->>app: 読み取りが進む
図2: ローカルファイルに見える読み取りの途中に、同期プロバイダーによるダウンロードが入る。
Cloud Files APIは互換性のため、同期エンジンと %systemroot% 配下のプロセス以外には、リパースポイントであることを隠します。そのため、普通のアプリからは「少し開くのが遅い普通のファイル」に見えます。リパースポイントを特別扱いするコードだけで判断しようとせず、次章の属性を確認します。11 リパースポイント自体の仕組みは「NTFSの内部構造」で解説しています。
エクスプローラーのプロパティでは、「サイズ」に本来のファイルサイズが表示される一方、「ディスク上のサイズ」はほぼ0という見え方になります。ファイル名があり、サイズが取得できることと、その中身がローカルにあることは別です。
4. ファイル属性で状態を調べる
4.1. 中身の状態と、保持する意図を読み分ける
プレースホルダーの状態は、通常のファイル属性として公開されます。主な属性は次のとおりです。3
| 属性 | 値 | 意味 |
|---|---|---|
| FILE_ATTRIBUTE_OFFLINE | 0x00001000 | データがすぐには利用できない(階層型ストレージ管理向けの伝統的な属性) |
| FILE_ATTRIBUTE_RECALL_ON_OPEN | 0x00040000 | ローカルに物理的な実体がない。ディレクトリ列挙の結果にのみ現れる |
| FILE_ATTRIBUTE_PINNED | 0x00080000 | ユーザーが「常にローカルに保持する」ことを意図している(ピン留め) |
| FILE_ATTRIBUTE_UNPINNED | 0x00100000 | ローカルに実体を保持しなくてよい(オンライン専用化の意図) |
| FILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS | 0x00400000 | 中身の一部または全部がローカルにない。読むとリモートからの取り寄せが発生する |
OFFLINE や RECALL_ON_DATA_ACCESS は、データがすぐに利用できるかを考える手掛かりです。一方、PINNED / UNPINNED はローカルに保持する意図を表します。PやUだけを見て、ダウンロードの完了まで判断しないようにします。また、RECALL_ON_OPEN はディレクトリ列挙の結果に現れる属性であり、すべての属性取得APIで同じように得られるものではありません。3
4.2. attribで確認・変更する際は、切り替えの順序に注意する
attrib <パス> で属性を確認できます。Oはオフライン、Pはピン留め、Uは非ピン留めを表します。MicrosoftはOneDriveの状態と設定コマンドの対応を次のように整理しています。76
| ファイル オンデマンドの状態 | 属性 | 設定コマンド |
|---|---|---|
| 常に利用可能(ピン留め) | Pinned(Pが表示される) | attrib +p <パス> |
| ローカルで利用可能 | PでもUでもない | attrib -p <パス> |
| オンライン専用 | Unpinned(Uが表示される) | attrib +u <パス> |
オンライン専用(U)のファイルに attrib -p だけを実行しても、Uが残り、中身は取得されません。「ローカルで利用可能」にしたい場合も、先に +p で「常に利用可能」にしてダウンロードさせ、それから -p にする順序が必要です。既存の状態を切り替えるスクリプトでは、attrib +p -u のように反対側の属性も外します。6
4.3. PowerShellでCSVの状態を一括確認する
ファイルの属性を見るだけなら、中身のハイドレーションを起こさずに調べられます。次の例は、既知フォルダーAPIでドキュメントのパスを取得し、CSVの属性を確認します。
function Test-CloudPlaceholder {
param([Parameter(Mandatory)][string]$Path)
$value = [int](Get-Item -LiteralPath $Path -Force).Attributes
[pscustomobject]@{
Path = $Path
Offline = ($value -band 0x00001000) -ne 0 # FILE_ATTRIBUTE_OFFLINE
RecallOnDataAccess = ($value -band 0x00400000) -ne 0 # 中身が全部はローカルにない
Pinned = ($value -band 0x00080000) -ne 0 # 常にこのデバイス上に保持
Unpinned = ($value -band 0x00100000) -ne 0 # オンライン専用
}
}
# ドキュメントフォルダー配下のCSVを一括チェック(中身はダウンロードされない)。
# パスは既知のフォルダーAPIで解決する。「ドキュメント」という表示名を直書きすると、
# 実フォルダー名が英語(Documents)の環境やKFMの構成によっては存在しないパスになる
Get-ChildItem ([Environment]::GetFolderPath('MyDocuments')) -Recurse -Filter *.csv |
ForEach-Object { Test-CloudPlaceholder $_.FullName } |
Where-Object RecallOnDataAccess |
Format-Table -AutoSize
[int] にキャストしているのは、.NETの FileAttributes 列挙型には RECALL_ON_DATA_ACCESS などの名前が定義されていないためです。数値へ変換してビット演算で判定します。「ドキュメント」という表示名の直書きを避ける点と、中身を読まずに属性を見る点の両方が重要です。
5. 業務アプリで表面化する6つの問題
プレースホルダーは壊れたファイルではありません。ただし、「存在するファイルはすぐ読める」「ローカルの監視イベントはユーザー操作によるもの」といった前提とは相性がよくありません。
| 症状 | 起きていること | 見直す対象 |
|---|---|---|
| 存在するのに開けない | 読み取り時の取り寄せが失敗する | OneDrive、ネットワーク、エラー処理 |
| 一括処理が極端に遅い | 中身を読んだファイルが次々にダウンロードされる | 全件読取・ハッシュ計算・バックアップ |
| 一部のファイルだけ除外される | 属性の完全一致判定などが追加属性を想定していない | 属性判定・属性変更のコード |
| 監視イベントが大量に届く | 同期や属性更新、同じ場所への書き戻しが通知を生む | FileSystemWatcherと入出力先 |
| 同期エラーや重複ファイルが出る | 排他ロックや複数PCの編集が同期と衝突する | ロック時間・ファイル配置・重複処理 |
| 夜間に通信量とディスク使用量が増える | スキャンや索引作成が中身を取り寄せる | セキュリティ製品・検索インデクサ |
5.1. 存在確認は通っても、読み取りで失敗する
オンライン専用ファイルでも、File.Exists() に相当する存在確認や、属性・サイズの取得は成功することがあります。中身を読み始めたところでハイドレーションが必要になるため、OneDriveの停止・サインアウト・一時停止、ネットワーク不調などが読み取りの失敗として表れます。大きなファイルでは、ダウンロード待ちがアプリのタイムアウトになることもあります。
クラウドファイル系のエラーとしては、ERROR_CLOUD_FILE_PROVIDER_NOT_RUNNING に対応する 0x8007016A(「クラウド ファイル プロバイダーが実行されていません」)などがあります。「ファイルがない」にまとめず、元のエラーコードと対象パスを記録してください。5
5.2. 一括処理が全量ダウンロードを誘発する
フォルダー内の全ファイルを読むバッチ、ハッシュ計算、全文検索、独自バックアップをOneDrive配下に向けると、中身を読んだファイルのハイドレーションが次々に発生します。数GBのフォルダーなら、処理時間だけでなく、通信量とローカルのディスク消費も増えます。低容量のPCでは、空き容量不足による別の障害につながります。
ユーザーが明示的に開いていないファイルをアプリが取り寄せると、Windowsが通知を出し、ユーザーにブロックの選択肢を示すことがあります。そこでブロックされると、そのアプリは以後のダウンロードに失敗します。解除先は設定の「ファイルの自動ダウンロード」です。「特定のPCだけ失敗する」ときは、この状態も確認します。11
5.3. 追加属性を想定しないコードが誤判定する
attributes == FileAttributes.Archive のように完全一致で判定すると、ほかの属性が加わったファイルを「想定外」として除外してしまいます。バックアップ・同期ツールが OFFLINE を「テープへ退避済み」と解釈してスキップしたり、逆に不要なファイルまで取り寄せたりするケースもあります。読み取り専用チェックやアーカイブビットの変更で、ほかの属性の組み合わせを壊さないことも必要です。
Microsoftのミニフィルター向けガイダンスには、RECALL_ON_DATA_ACCESS が付いたファイルへ不用意な読み書きを発行しないための注意があります。カーネルドライバー向けの制約とユーザーモードの実装は同一ではありませんが、中身に触れると取り寄せコストが生じる点は、業務アプリでも意識する必要があります。12
5.4. FileSystemWatcherが同期の活動も拾う
OneDrive配下を FileSystemWatcher で監視すると、ユーザーの操作だけでなく、他デバイスからの変更の同期、ハイドレーション・デハイドレーションによる属性やサイズの更新でもイベントが発生し得ます。
さらに、取込結果を同じフォルダーへ書き戻すと、書き込み、アップロード、属性更新、再イベントというループになります。
flowchart TB
accTitle: 監視と書き戻しによる変更通知のループ
accDescr: 変更イベントを受けた監視アプリが取り込み結果を同じフォルダーへ書き戻すと、同期アプリのアップロードと属性更新が再びイベントを発生させ、変更通知の嵐というループになる
ev["変更イベント"] --> proc["監視アプリが取り込み"]
proc --> write["同じフォルダーへ書き戻し"]
write --> up["同期アプリがアップロード"]
up --> attr["属性やサイズが更新される"]
attr --> ev
sync["他デバイスの変更の同期"] -.-> ev
図3: 取込結果を監視先へ書き戻すと、同期アプリの活動も巻き込んで通知が繰り返され得る。
イベントの間引きや実体確認が必要な理由は「FileSystemWatcher実務ガイド」で扱っています。OneDrive配下では、通知をそのまま「取込可能なファイルが1つ届いた」と解釈しない設計が、いっそう重要になります。
5.5. 排他ロックと複数PCの編集が同期と衝突する
業務アプリが排他ロックで開いている間、同期アプリはそのファイルをアップロードしたり更新したりできません。Accessの .accdb、独自形式のデータファイル、ログなどを長時間開く設計では、OneDrive配下に置くことで同期エラーが常態化します。
複数のPCで同じファイルを編集した場合には、両方の版を残すために、PC名付きのファイルや「〜のコピー」といった競合コピーが生成されることもあります。「1フォルダー1ファイル」を前提にした取込処理は、この重複で誤動作します。ロック設計は「ファイル連携の排他制御の基礎知識」も参照してください。
5.6. スキャンや検索インデクサも中身を取り寄せる
中身を読むのは業務アプリだけではありません。ウイルス対策ソフトのフルスキャンや検索インデクサも、プレースホルダーの中身へアクセスすればハイドレーションを誘発します。
Azure File Syncの計画ガイドでは、Microsoft Defenderなどがオンデマンドスキャン時に RECALL_ON_DATA_ACCESS 属性の付いたファイルをスキップすることが説明されています。ただし、これは製品側の対応であり、すべてのセキュリティ製品が同じ配慮をするとは限りません。「夜間スキャンのたびにネットワークとディスクが張り付く」「オンライン専用にしたファイルが翌朝すべて実体化している」ときは、スキャン側の動きも調べます。13
6. アプリ開発側の対策 ── 不用意に開かず、保存先を分ける
6.1. 列挙時に属性を確認し、中身が必要なファイルだけを読む
基本方針は、プレースホルダーを「取り寄せコストのあるファイル」として扱うことです。ログ収集、ハッシュ計算、プレビュー生成など、必須でない処理にはスキップする選択肢を持たせます。
次は、属性を確認してからCSVを取り込む例です。
// .NETのFileAttributesに未定義の値は数値で定義する
const FileAttributes RecallOnDataAccess = (FileAttributes)0x00400000;
const FileAttributes RecallOnOpen = (FileAttributes)0x00040000;
static bool IsCloudPlaceholder(FileAttributes attributes) =>
(attributes & (RecallOnDataAccess | RecallOnOpen | FileAttributes.Offline)) != 0;
foreach (var file in new DirectoryInfo(watchFolder).EnumerateFiles("*.csv"))
{
if (IsCloudPlaceholder(file.Attributes))
{
log.Warn($"{file.Name} はオンライン専用のため今回は処理をスキップします");
continue;
}
Import(file.FullName);
}
この例は、オンライン専用の可能性があるファイルを今回は処理しない方針です。業務上必ず取り込む必要があるファイルまで、警告ログだけで処理済みにしてはいけません。事前に実体を確保する運用と、読み取り失敗時の扱いを合わせて決めます。
6.2. FILE_FLAG_OPEN_NO_RECALLを「通信しない保証」にしない
CreateFile の FILE_FLAG_OPEN_NO_RECALL は、要求したデータをリモート側に置いたままとし、ローカルストレージへ戻さない意図を示すフラグです。中身を読むためのデータ転送そのものを禁止するフラグではありません。14
帯域や待ち時間を避けたい調査では、属性・サイズ・タイムスタンプなどのメタデータだけで済ませます。列挙結果の情報を使う、必要に応じてアクセス権0で開いて属性を取得するなど、読み取りアクセスを要求しない方法を選びます。14
6.3. データ配置と、失敗時の案内を仕様に含める
KFM環境では「ドキュメント」もOneDrive配下になり得ます。アプリの設定・データベース・作業ファイルは %ProgramData% や %LocalAppData% など用途に合う場所に置き、既定の保存先・取込先に安易にデスクトップやドキュメントを選ばないようにします。具体的な判断は「Windowsアプリのデータ保存先の選び方」にまとめています。
ユーザーが保存先を選べる場合も、OneDrive配下を選んだときの挙動を決めておきます。OneDrive / OneDriveCommercial の環境変数で分かる同期ルートを手掛かりに警告する、ロックファイルやDBの配置は拒否する、といった判断を仕様に含めます。
読み取りに失敗したときは、対象パスとエラーコードに加え、OneDrive配下であることが分かれば、その情報も表示・記録します。0x8007016A などを検知した場合に「OneDriveの状態を確認してください」と案内できるだけでも、現場とヘルプデスクが同じ確認手順で調べやすくなります。
7. 情シス側の対策 ── ピン留めとポリシーで状態を維持する
7.1. 必要なフォルダーだけをピン留めする
ファイル オンデマンドを全体で無効にする前に、業務アプリが読むフォルダーを「常にこのデバイス上に保持する」にします。キッティング時に attrib +p -u <フォルダー> /s /d を使う場合も、ダウンロードの完了を確認してから業務へ引き渡します。64
「一度開いておいた」だけでは、後の自動解放を防げません。必要な場所をフォルダー単位でピン留めし、その状態をサポート手順にも含めることがポイントです。
7.2. KFMとファイル オンデマンドを意図して構成する
「気づいたら有効だった」を避けるため、グループポリシーやIntuneで設定を統制します。元に戻す操作を禁止するポリシーもあるため、端末の画面だけでなく、組織で適用している設定も確認します。81
| 目的 | ポリシー(レジストリ値) | 効果 |
|---|---|---|
| ファイル オンデマンドの統制 | Use OneDrive Files On-Demand(FilesOnDemandEnabled) | 有効で新規ユーザーは既定オンライン専用。無効で従来型の全量同期 |
| KFMの一斉適用 | Silently move Windows known folders to OneDrive(KFMSilentOptIn) | ユーザー操作なしでデスクトップ等を移動 |
| KFMの禁止 | Prevent users from moving their Windows known folders to OneDrive(KFMBlockOptIn) | 既知のフォルダーの移動を禁止 |
| KFM解除の禁止 | Prevent users from redirecting their Windows known folders to their PC(KFMBlockOptOut) | ユーザーによる解除を禁止 |
| チームサイトの容量削減 | Convert synced team site files to online-only(DehydrateSyncedTeamSites) | 同期済みチームサイトをオンライン専用化(実体が消える方向に働く点に注意) |
DehydrateSyncedTeamSites は、同期済みチームサイトの実体を減らす方向に働くポリシーです。必要なファイルが雲マークへ戻る場合は、ユーザーの「空き領域を増やす」操作だけでなく、こうした組織設定も確認します。8
7.3. ストレージセンサーと全量同期のコストを確認する
ストレージセンサー(Storage Sense)には、一定日数開かれていないクラウドファイルをオンライン専用に戻す機能があります。ConfigStorageSenseCloudContentDehydrationThreshold で日数を構成でき、同ポリシーの既定値0は自動で戻さない設定です。ただし、ユーザーが設定画面で有効化していたり、組織で低容量端末向けに構成していたりする場合があります。10
対象になるのは、明示的にピン留めされていない「ローカルで利用可能」なファイルです。ピン留めされたファイルは自動解放の対象外なので、「先週まで開けたのに雲マークへ戻った」ときは、本当にP属性が付いていたかを確認します。4
FilesOnDemandEnabled を無効にすると従来型の全量ダウンロード同期になりますが、ディスク消費と初回同期の帯域負荷が増えます。Microsoftは有効のままの運用を推奨しています。無効化は、対象ユーザーのデータ量とディスク容量を確認したうえでの限定的な措置と考えてください。84
問い合わせテンプレートには、2章の「パス → 属性 → OneDrive稼働 → ネットワーク → 空き容量 → 記録」を組み込みます。担当者が変わっても、設定をむやみに切り替えず、同じ順序で原因を調べられるようにしておきます。
8. まとめ
OneDrive環境のファイル障害は、まず「場所が変わったのか」と「中身の取り寄せが必要なのか」を分けると整理できます。KFMには既知フォルダーAPIによるパス解決で対応し、ファイル オンデマンドには属性を確認してから必要な中身だけを読む設計で対応します。
そのうえで、監視先への書き戻し、長時間の排他ロック、全件スキャンといった処理が同期とどう重なるかを見直します。アプリの内部データはOneDrive配下から分け、業務上必要なファイルはピン留めとポリシーで実体を維持する。この役割分担が、応急処置で終わらせないための基本です。
次に「ファイルはあるのに読めない」という相談を受けたら、最初に問い直してください。
アプリは、いまの正しい場所を見ているか。そして、そのファイルの中身は、本当にローカルにあるか。
関連記事
- Windows I/Oの深層(第5回) ── NTFSの内部構造:MFTから理解するファイルシステム
- FileSystemWatcher実務ガイド - 取りこぼしと重複対策
- ネットワークドライブとUNCパスの落とし穴 ── 業務アプリでファイルサーバー(共有フォルダ)を扱う実務
- ファイル連携の排他制御の基礎知識 - ファイルロックと原子的 claim のベストプラクティス
- Windowsアプリのデータ保存先の選び方 ── SQLite / JSON / レジストリ / Access 判断表
- MAX_PATHとWindowsのパス・ファイル名の落とし穴 ── 260文字制限、予約名、末尾ドット、大文字小文字
関連する相談領域
合同会社小村ソフトでは、「今まで動いていた取込処理がPC入れ替え後に動かない」「特定のPCでだけファイルが読めない」といったOneDrive・クラウドストレージ絡みの業務アプリの不具合調査、プレースホルダーを前提にしたファイル処理・監視処理の設計と改修、KFM・ファイル オンデマンド環境での保存先設計のレビューを扱っています。現象の切り分けからで構いませんので、お気軽にご相談ください。
参考リンク
-
Microsoft Learn, Redirect and move Windows known folders to OneDrive. KFMがデスクトップ・ドキュメント・ピクチャをOneDrive配下へ移動すること、プロンプト・サイレント適用・解除禁止・移動禁止の各ポリシーについて。 ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft サポート, Save disk space with OneDrive Files On-Demand for Windows. ファイル オンデマンドの3状態と「常にこのデバイス上に保持する」「空き領域を増やす」の操作について。 ↩ ↩2 ↩3
-
Microsoft Learn, File Attribute Constants. FILE_ATTRIBUTE_OFFLINE、RECALL_ON_OPEN、RECALL_ON_DATA_ACCESS、PINNED、UNPINNED各属性の定義と値について。 ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Recommended sync app configuration. ファイル オンデマンドが既定で有効であり有効のままを推奨すること、ストレージセンサーが「ピン留めされていないローカルで利用可能なファイル」をクリーンアップすることについて。 ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Error 0x8007016a when copying files in OneDrive. エラー0x8007016A「The cloud file provider is not running」がOneDriveの構成不良・停止時に発生することと解消手順について。 ↩ ↩2
-
Microsoft Learn, Query and set Files On-Demand states in Windows. attribによるファイル オンデマンド状態の確認と+p・-p・+uによる設定、CldFltサービスについて。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Microsoft Learn, attrib. attribコマンドの構文と、O(オフライン)・P(ピン留め)・U(非ピン留め)を含む属性フラグについて。 ↩ ↩2
-
Microsoft Learn, IT Admins - Use OneDrive policies to control sync settings. FilesOnDemandEnabled、KFMSilentOptIn、KFMBlockOptIn、KFMBlockOptOut、DehydrateSyncedTeamSitesなど、OneDrive同期アプリをGPO/Intuneで構成する各ポリシーについて。 ↩ ↩2 ↩3 ↩4
-
Microsoft サポート, What do the OneDrive icons mean?. エクスプローラーに表示される雲・チェックマークなどの状態アイコンの意味について。 ↩
-
Microsoft Learn, Policy CSP - Storage. ストレージセンサーが一定日数開かれていないクラウドファイルをオンライン専用化できること、既定値0(自動では戻さない)と0〜365日の構成について。 ↩ ↩2
-
Microsoft Learn, Build a Cloud Sync Engine that Supports Placeholder Files. クラウドファイルAPIの概要、プレースホルダーが約1KBのメタデータのみを持ち開くと自動ハイドレーションされること、リパースポイントが同期エンジンと%systemroot%配下以外のプロセスから隠蔽されること、バックグラウンドのハイドレーションに対するトースト通知とブロックについて。 ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Handling placeholders. プレースホルダーにはFILE_ATTRIBUTE_RECALL_ON_DATA_ACCESSを設定すべきこと、この属性が付いたファイルへの不用意な読み書きが不要なハイドレーションやデータ破損を招くことについて。 ↩
-
Microsoft Learn, Plan for an Azure File Sync deployment. ウイルス対策のスキャンがRECALL_ON_DATA_ACCESS属性付きファイルのリコールを引き起こし得ること、Microsoft Defender等はオンデマンドスキャン時にこの属性のファイルをスキップすることについて。 ↩
-
Microsoft Learn, CreateFileW function (fileapi.h). FILE_FLAG_OPEN_NO_RECALLが「要求されたデータをローカルストレージへ移送し戻さず、リモート側に置いたままにすべき」ことを示すフラグであること(データの取得自体を防ぐものではない)、アクセス権0でのオープンによる属性取得について。 ↩ ↩2
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
ボリュームシャドウコピー(VSS)の仕組みと実務 ── 使用中ファイルのバックアップがなぜ取れるのか
使用中のファイルは共有違反でコピーできないのに、バックアップソフトはなぜ取れるのか。ボリュームシャドウコピー(VSS)のリクエスター・ライター・プロバイダーの役割分担、コピーオンライトの仕組み、vssadminの実務と差分領域の落とし穴を解説します。
Windows証明書ストア実務ガイド ── ユーザーとコンピューター、どちらに入れるか
クライアント証明書はユーザーとコンピューターのどちらのストアに入れるべきか。certmgr.mscとcertlm.mscの違い、秘密キーの権限付与、PowerShellでの期限棚卸しまで、証明書の定番事故を体系的に潰す実務ガイドです。
Windowsファイアウォールと業務アプリ ── 受信規則はインストーラーで登録する
Windows業務アプリが客先で通信できないとき、受信規則・待ち受け・プロファイル・管理ポリシーをどう切り分けるか。初回起動の警告に頼らない規則の設計、インストーラーでの登録と更新、ログの読み方を解説します。
Get-WinEventでイベントログを実務的に調べる ── 絞り込みの速さが調査時間を決める
Windowsのイベントログ調査をPowerShellで効率化する方法をまとめます。Where-Objectで絞ると遅い理由、FilterHashtableとXPathの使い分け、再起動やログオン・アプリ異常終了の調査レシピ、複数台からの収集までを解説します。
Windowsのショートカットは、移動したファイルをどうやって見つけるのか? ── ファイルの「場所」と「同じファイルであること」は別の話
Windowsのショートカットが、移動・改名したファイルを探す仕組みを解説します。パス・Object ID・特徴による探索の違い、コピーや元のパスの再利用で保証されないこと、安全な確認手順とAPIの使い分けを整理します。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
よくある質問
この記事のテーマについて、相談時によくある質問をまとめています。
- デスクトップに置いたCSVを業務アプリが「ファイルが見つかりません」と言って読めません。なぜですか?
- 多くの場合、デスクトップフォルダー自体がOneDriveの「既知のフォルダーの移動(KFM)」によって C:\Users\<ユーザー名>\OneDrive\デスクトップ 配下に移動しているか、ファイルがオンライン専用のプレースホルダーになっていることが原因です。アプリが C:\Users\<ユーザー名>\Desktop のような固定パスを前提にしていると、移動後のファイルを見つけられません。パスが正しい場合でも、オンライン専用ファイルはOneDrive停止時やネットワーク不調時に開けないことがあります。まず対象パスがOneDrive配下かを確認し、attribコマンドでU(オンライン専用)が付いていないかを見てください。応急処置としては、右クリックの「常にこのデバイス上に保持する」で実体をローカルに確保できます。
- プログラムからオンライン専用ファイルかどうかを判定できますか?
- できます。オンライン専用のプレースホルダーにはFILE_ATTRIBUTE_OFFLINEやFILE_ATTRIBUTE_RECALL_ON_DATA_ACCESS(0x00400000)などの属性が付くため、ファイル属性を調べれば中身をダウンロードさせずに状態を判定できます。属性の取得やフォルダー列挙だけではハイドレーション(ダウンロード)は発生しません。.NETではFileAttributesに定義がない値もあるので、整数にキャストしてビット演算で判定します。どうしても中身を読まずに開きたい場合は、CreateFileのFILE_FLAG_OPEN_NO_RECALLのような手段もあります。
- ファイル オンデマンドを無効にすれば問題は解決しますか?
- 無効化は最後の手段と考えてください。無効にすると同期対象の全ファイルがローカルにダウンロードされるため、ディスク容量と初回同期のネットワーク負荷が大きくなり、Microsoftも有効のままの運用を推奨しています。実務では、業務アプリが読むフォルダーだけを「常にこのデバイス上に保持する」(ピン留め)にするほうが柔軟です。さらに根本的には、アプリのデータフォルダーや取込用フォルダーをOneDrive管理下に置かない設計に直すのが確実です。
- 「常にこのデバイス上に保持する」にしたのに、いつの間にか雲マークに戻るファイルがあります。なぜですか?
- まず、そのファイルに本当にピン留め(P属性)が付いているかをattribコマンドで確認してください。ピン留めされたファイルはストレージセンサーの自動的なオンライン専用化の対象外ですが、ピン留めせずに開いただけの「ローカルで利用可能」なファイルは、ストレージセンサーの設定やポリシーによって一定期間後にオンライン専用へ戻されることがあります。ほかにも、ユーザー自身の「空き領域を増やす」操作や、チームサイトをオンライン専用化するポリシー(DehydrateSyncedTeamSites)でも雲マークに戻ります。業務上必ずローカルに必要なフォルダーは、フォルダー単位でピン留めして運用してください。