@prefix schema: <https://schema.org/> .
@prefix skos: <http://www.w3.org/2004/02/skos/core#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ks: <https://comcomponent.com/vocab/> .

<https://comcomponent.com/blog/2026/03/10/000-filesystemwatcher-safe-basics/#article>
    schema:about <https://comcomponent.com/knowledge/filesystemwatcher/>, <https://comcomponent.com/knowledge/full-rescan/> ;
    schema:mentions <https://comcomponent.com/knowledge/scan-request-coalescing/>, <https://comcomponent.com/knowledge/created-event-misinterpreted-as-complete/>, <https://comcomponent.com/knowledge/changed-event-order-assumption/>, <https://comcomponent.com/knowledge/event-log-state-reconstruction-antipattern/>, <https://comcomponent.com/knowledge/buffer-overflow-event-loss/>, <https://comcomponent.com/knowledge/internal-buffer-size-tuning/>, <https://comcomponent.com/knowledge/error-event-ignored-antipattern/>, <https://comcomponent.com/knowledge/bundle/>, <https://comcomponent.com/knowledge/sender-side-completion-signaling/>, <https://comcomponent.com/knowledge/watcher-downtime-gap/>, <https://comcomponent.com/knowledge/atomic-claim/>, <https://comcomponent.com/knowledge/temp-then-rename-publish/>, <https://comcomponent.com/knowledge/done-manifest-file/>, <https://comcomponent.com/knowledge/idempotent-processing/>, <https://comcomponent.com/knowledge/duplicate-processing/>, <https://comcomponent.com/knowledge/partial-write-read/>, <https://comcomponent.com/knowledge/usn-journal/>, <https://comcomponent.com/knowledge/ntfs/>, <https://comcomponent.com/knowledge/admin-rights/> .

<https://comcomponent.com/knowledge/filesystemwatcher/> a skos:Concept ;
    skos:prefLabel "FileSystemWatcher"@ja ;
    skos:definition ".NETが提供する、ファイル・ディレクトリの作成・変更・削除・名前変更をイベントで通知するAPI。ディレクトリ通知はアプリが動いている間しか受け取れず、内部バッファのoverflowで個別通知を取りこぼすことがある。"@ja ;
    skos:altLabel "System.IO.FileSystemWatcher" ;
    ks:mayCause <https://comcomponent.com/knowledge/buffer-overflow-event-loss/> ;
    ks:mayCause <https://comcomponent.com/knowledge/watcher-downtime-gap/> .

<https://comcomponent.com/knowledge/full-rescan/> a skos:Concept ;
    skos:prefLabel "full rescan(ディレクトリの全体再走査)"@ja ;
    skos:definition "個々の変更イベントを当てにせず、監視対象ディレクトリを一から列挙し直して処理してよい対象を洗い直すこと。起動時・Error受信時・watcher再生成直後・定期的な保険として実行する。"@ja ;
    skos:altLabel "全体再走査"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/change-notification-loss/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/buffer-overflow-event-loss/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/event-log-state-reconstruction-antipattern/> ;
    ks:shouldPrecede <https://comcomponent.com/knowledge/atomic-claim/> ;
    ks:mitigates <https://comcomponent.com/knowledge/watcher-downtime-gap/> .

<https://comcomponent.com/knowledge/buffer-overflow-event-loss/> a skos:Concept ;
    skos:prefLabel "内部バッファのoverflowによる通知の取りこぼし"@ja ;
    skos:definition "FileSystemWatcherの内部バッファ(既定8192バイト、4096バイト未満不可、64KBが上限)が短時間の大量変更であふれ、個別通知を失ってErrorイベントが発生すること。overflow後は個別イベント列の完全性そのものが疑わしくなる。"@ja ;
    skos:altLabel "overflow" ;
    skos:broader <https://comcomponent.com/knowledge/change-notification-loss/> .

<https://comcomponent.com/knowledge/periodic-directory-listing/> a skos:Concept ;
    skos:prefLabel "定期的なディレクトリ列挙"@ja ;
    skos:definition "イベント通知だけに頼らず、一定間隔でディレクトリを列挙して未検知のファイルを拾う監視方式。"@ja ;
    skos:altLabel "定期再走査"@ja .

<https://comcomponent.com/knowledge/change-notification-loss/> a skos:Concept ;
    skos:prefLabel "変更通知の取りこぼし"@ja ;
    skos:definition "共有フォルダの監視をイベント通知だけに頼ると変更を取りこぼすことがあり、定期的なディレクトリ列挙と併用すると安定すること。"@ja ;
    skos:altLabel "通知の取りこぼし"@ja .

<https://comcomponent.com/knowledge/internal-buffer-size-tuning/> a skos:Concept ;
    skos:prefLabel "InternalBufferSizeの調整"@ja ;
    skos:definition "FileSystemWatcherの内部バッファサイズを既定の8192バイトから64KBまでの範囲で調整すること。non-paged memoryを使うため増やすほど気軽ではなく、バーストがその上限を超えれば依然として取りこぼす。"@ja ;
    skos:altLabel "バッファサイズ調整"@ja ;
    ks:notRecommendedFor <https://comcomponent.com/knowledge/buffer-overflow-event-loss/> .

<https://comcomponent.com/knowledge/error-event-ignored-antipattern/> a skos:Concept ;
    skos:prefLabel "Errorイベントをログだけ出して無視するアンチパターン"@ja ;
    skos:definition "FileSystemWatcherのErrorイベント(buffer overflowや監視継続失敗を示す)をログ出力のみで済ませ、full rescanなどの回復処理を行わない設計。"@ja ;
    skos:altLabel "Error無視アンチパターン"@ja .

<https://comcomponent.com/knowledge/created-event-misinterpreted-as-complete/> a skos:Concept ;
    skos:prefLabel "Createdを完了通知だと誤解する"@ja ;
    skos:definition "FileSystemWatcherのCreatedイベントを「名前が見えた」以上の「もう読んでよい」という保証だと誤解して読み込みを始めてしまう誤り。コピーや転送では作成直後にCreatedが飛び、そのあとに1回以上のChangedが続くことがある。"@ja ;
    skos:altLabel "Created誤解アンチパターン"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/partial-write-read/> .

<https://comcomponent.com/knowledge/partial-write-read/> a skos:Concept ;
    skos:prefLabel "書き込み途中ファイルの読み込み事故"@ja ;
    skos:definition "受信側が、送信側がまだ書き込み中のファイルを最終ファイル名として検知し読み始めてしまうことで、JSONの閉じ括弧欠落やCSVの行数不足などの不完全なデータを処理してしまう事故。"@ja ;
    skos:altLabel "途中ファイルの誤読"@ja .

<https://comcomponent.com/knowledge/sender-side-completion-signaling/> a skos:Concept ;
    skos:prefLabel "送信側での完了条件の明示"@ja ;
    skos:definition "受信側でFileSystemWatcherの完了判定を頑張るのではなく、送信側がtemp名での書き込み・close・rename/replace・done/manifestの配置で完了を明示するプロトコル設計。"@ja ;
    skos:altLabel "完了の明示プロトコル"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/created-event-misinterpreted-as-complete/> ;
    ks:uses <https://comcomponent.com/knowledge/temp-then-rename-publish/> ;
    ks:uses <https://comcomponent.com/knowledge/done-manifest-file/> .

<https://comcomponent.com/knowledge/temp-then-rename-publish/> a skos:Concept ;
    skos:prefLabel "temp -> close -> rename/replaceでの公開"@ja ;
    skos:definition "生成中のファイルをtemp名に閉じ込め、closeしたあとで同一ディレクトリ・同一ボリューム上のfinal名へrename/replaceする、書き込み途中のファイルを読ませないための公開パターン。"@ja ;
    skos:altLabel "temp->rename公開パターン"@ja .

<https://comcomponent.com/knowledge/done-manifest-file/> a skos:Concept ;
    skos:prefLabel "done/manifestファイル"@ja ;
    skos:definition "本体ファイルとは別に、ファイル名・サイズ・ハッシュ・レコード数・idempotency keyなどを記録し、受信側が完全性を検証するための説明ファイル。doneファイルはその最小版。"@ja ;
    skos:altLabel "完了明示ファイル"@ja ;
    skos:altLabel "manifest" .

<https://comcomponent.com/knowledge/scan-request-coalescing/> a skos:Concept ;
    skos:prefLabel "通知を再スキャン要求に畳む"@ja ;
    skos:definition "Created/Changed/Deleted/Renamed/Error/startupなど複数種類の通知を、実処理に直結させず「見に行け」という単一の再スキャン要求信号に統合すること。バースト時はまとめてから1回の走査を1本のworkerで行う。"@ja ;
    skos:altLabel "scan request coalescing" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/changed-event-order-assumption/> ;
    ks:recommendedFor <https://comcomponent.com/knowledge/event-log-state-reconstruction-antipattern/> ;
    ks:shouldPrecede <https://comcomponent.com/knowledge/full-rescan/> .

<https://comcomponent.com/knowledge/changed-event-order-assumption/> a skos:Concept ;
    skos:prefLabel "Changedの回数・順序を信じるアンチパターン"@ja ;
    skos:definition "Changedイベントが1回だけ、決まった順序で来るという前提を置く設計。移動や保存の1操作でも複数イベントに分かれ、ウイルス対策やインデクサが触った分まで拾われるため、この前提は崩れる。"@ja ;
    skos:altLabel "Changed回数信頼アンチパターン"@ja ;
    ks:mayCause <https://comcomponent.com/knowledge/duplicate-processing/> .

<https://comcomponent.com/knowledge/event-log-state-reconstruction-antipattern/> a skos:Concept ;
    skos:prefLabel "イベント列から状態を復元しようとするアンチパターン"@ja ;
    skos:definition "Created/Changed/Deleted/Renamedの種類ごとに辞書などの内部状態を更新し、イベント履歴から真実の状態を再現しようとする設計。重複・分割・overflow・外乱が入ると辻褄が合わなくなる。"@ja ;
    skos:altLabel "イベント履歴からの状態復元"@ja .

<https://comcomponent.com/knowledge/duplicate-processing/> a skos:Concept ;
    skos:prefLabel "二重処理(二重計上・二重送信・更新の消失)"@ja ;
    skos:definition "同じ入力ファイルが複数ワーカーに掴まれて重複処理される、または同じ更新が競合して片方の結果が消えてしまうことによる、処理の重複や更新の消失。"@ja ;
    skos:altLabel "二重処理"@ja ;
    skos:altLabel "Lost Update" .

<https://comcomponent.com/knowledge/atomic-claim/> a skos:Concept ;
    skos:prefLabel "原子的claim"@ja ;
    skos:definition "複数ワーカーが同じ入力ファイルを同時に処理しないよう、処理権の確保を1操作で行うこと。incomingからprocessing/<worker>/へのrenameのほか、FileMode.CreateNewやO_CREAT|O_EXCLによる原子的なファイル作成でも実現できる。"@ja ;
    skos:altLabel "claim" ;
    skos:altLabel "Atomic Claim" ;
    ks:prevents <https://comcomponent.com/knowledge/duplicate-processing/> .

<https://comcomponent.com/knowledge/bundle/> a skos:Concept ;
    skos:prefLabel "bundle(連携単位のディレクトリ)"@ja ;
    skos:definition "本体データ・manifest・補助ファイルを1つのディレクトリにまとめた、1件分の連携単位。ディレクトリごと1回のrenameでclaimできる。"@ja ;
    skos:altLabel "連携bundle"@ja ;
    ks:uses <https://comcomponent.com/knowledge/atomic-claim/> ;
    ks:uses <https://comcomponent.com/knowledge/done-manifest-file/> .

<https://comcomponent.com/knowledge/idempotent-processing/> a skos:Concept ;
    skos:prefLabel "idempotency(冪等性)を前提にした処理"@ja ;
    skos:definition "同じ入力をもう一度処理しても結果が変わらない性質を前提に、排他が破れた場合の二重実行を処理済み台帳への記録で吸収する設計。"@ja ;
    skos:altLabel "冪等な処理設計"@ja ;
    ks:recommendedFor <https://comcomponent.com/knowledge/duplicate-processing/> .

<https://comcomponent.com/knowledge/watcher-downtime-gap/> a skos:Concept ;
    skos:prefLabel "watcher停止中の変更取りこぼし"@ja ;
    skos:definition "FileSystemWatcherが動いていない間(未起動・再起動・切断)に発生したファイル変更は、イベントとして受け取れないこと。"@ja ;
    skos:altLabel "起動前・停止中の変更の抜け"@ja .

<https://comcomponent.com/knowledge/usn-journal/> a skos:Concept ;
    skos:prefLabel "USNジャーナル(変更ジャーナル)"@ja ;
    skos:definition "ボリューム内のファイル・ディレクトリへの変更のたびに、変更内容と対象の名前を記録する台帳。バックアップや検索インデクサーが全走査なしで差分を把握するために使う。"@ja ;
    skos:altLabel "Change Journal" ;
    skos:altLabel "USN Journal" ;
    ks:recommendedFor <https://comcomponent.com/knowledge/watcher-downtime-gap/> ;
    ks:requires <https://comcomponent.com/knowledge/ntfs/> .

<https://comcomponent.com/knowledge/ntfs/> a skos:Concept ;
    skos:prefLabel "NTFS"@ja ;
    skos:definition "現行のWindowsが標準で使うファイルシステム。MFT(マスターファイルテーブル)などの構造でボリューム上のファイルを管理する。"@ja ;
    skos:altLabel "New Technology File System" .

<https://comcomponent.com/knowledge/admin-rights/> a skos:Concept ;
    skos:prefLabel "管理者権限"@ja ;
    skos:definition "コンピューター全体の設定を変更できる権限。"@ja ;
    skos:altLabel "昇格"@ja .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/filesystemwatcher/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/buffer-overflow-event-loss/> ;
    schema:description "FileSystemWatcherは既定8192バイト・上限64KBの内部バッファを持ち、短時間に変更が集中するとバッファがあふれて個別通知を取りこぼす"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.internalbuffersize> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/full-rescan/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/periodic-directory-listing/> ;
    schema:description "定期的な保険としてfull rescanを行う場合は、そのトリガーとして定期的なディレクトリ列挙を使う(起動時・Error受信時・watcher再生成直後など他のトリガーもある)"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/full-rescan/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/change-notification-loss/> ;
    schema:description "起動時・Error受信時・watcher再生成直後・定期的な保険としてfull rescanを入れることを本記事は推奨している"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/full-rescan/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/buffer-overflow-event-loss/> ;
    schema:description "overflow時は個別イベント列の完全性が疑わしくなるため、full rescanで全体を洗い直すことを本記事は推奨している"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.error> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/internal-buffer-size-tuning/> ;
    rdf:predicate ks:notRecommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/buffer-overflow-event-loss/> ;
    schema:description "InternalBufferSizeを上げるだけでは、通知バーストがその上限(64KB)を超えれば依然として取りこぼすため、これだけに頼るのは推奨されない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.internalbuffersize> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/error-event-ignored-antipattern/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/change-notification-loss/> ;
    schema:description "Errorイベントをログ出力だけで済ませ回復処理をしないと、取りこぼしにすでに気づいているのに未回復のまま放置される"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.error> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/filesystemwatcher/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/created-event-misinterpreted-as-complete/> ;
    schema:description "Createdが「名前が見えた」時点で発火する仕様のため、開発者がこれを完了通知だと誤解しやすい"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.created> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/created-event-misinterpreted-as-complete/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/partial-write-read/> ;
    schema:description "Createdの時点で読み始めると、コピーや転送ではまだ書き込み中の内容を読んでしまう"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.created> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sender-side-completion-signaling/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/created-event-misinterpreted-as-complete/> ;
    schema:description "Createdを完了通知だと誤解する問題に対し、本記事は送信側でtemp->rename・done/manifestによる完了の明示を推奨している"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.created> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sender-side-completion-signaling/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/temp-then-rename-publish/> ;
    schema:description "送信側での完了明示は、temp->close->rename/replaceでの公開パターンを使う"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/fileio/moving-and-replacing-files> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/sender-side-completion-signaling/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/done-manifest-file/> ;
    schema:description "送信側での完了明示は、最後にdone/manifestファイルを置く形も使う"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/scan-request-coalescing/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/changed-event-order-assumption/> ;
    schema:description "Changedの回数や順序を信じる代わりに、全通知を1種類の再スキャン要求に畳むことを本記事は推奨している"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.changed> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/scan-request-coalescing/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/event-log-state-reconstruction-antipattern/> ;
    schema:description "イベント列から内部状態を復元しようとする設計の代わりに、通知を再スキャン要求に畳むことを本記事は推奨している"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/full-rescan/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/event-log-state-reconstruction-antipattern/> ;
    schema:description "イベント列から状態を復元しようとする代わりに、その都度ディスク上の現物を再確認するfull rescanを本記事は推奨している"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/changed-event-order-assumption/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/duplicate-processing/> ;
    schema:description "Changedが複数回来ることを前提にその都度業務処理を直結させると、同じファイルを何度も処理してしまう"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher.changed> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/atomic-claim/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/duplicate-processing/> ;
    schema:description "再スキャンで見つかったready候補も、incomingからprocessing/<worker>/へのrenameが成功した側だけが所有者になることで、複数ワーカーの同時処理を防ぐ"@ja ;
    ks:evidence <https://pubs.opengroup.org/onlinepubs/9799919799/functions/rename.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/bundle/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/atomic-claim/> ;
    schema:description "本体・manifest・補助ファイルをまとめたbundleディレクトリごと1回のrenameでclaimできる"@ja ;
    ks:evidence <https://pubs.opengroup.org/onlinepubs/9799919799/functions/rename.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/bundle/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/done-manifest-file/> ;
    schema:description "bundleは本体データにmanifestを添えて1つのディレクトリにまとめた単位である"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/idempotent-processing/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/duplicate-processing/> ;
    schema:description "FileSystemWatcherでは同じ対象を複数回見に行くことが前提になるため、二重実行を処理済み台帳への記録で吸収する設計を本記事は推奨している"@ja ;
    ks:evidence <https://www.rfc-editor.org/rfc/rfc9110.html> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/full-rescan/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/atomic-claim/> ;
    schema:description "ディレクトリ再スキャンでready な候補を洗い出したあとにclaimを試みる、という順序が実務では推奨される"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/scan-request-coalescing/> ;
    rdf:predicate ks:shouldPrecede ;
    rdf:object <https://comcomponent.com/knowledge/full-rescan/> ;
    schema:description "複数の通知や起動・エラーなどの契機を1つの再スキャン要求にまとめたうえで、実際の走査を行うべきという順序を本記事は示している"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/filesystemwatcher/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/watcher-downtime-gap/> ;
    schema:description "ディレクトリ通知はアプリが動いている間しか受け取れないため、起動前や停止中に置かれた変更は拾えない"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/fileio/change-journals> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/full-rescan/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/watcher-downtime-gap/> ;
    schema:description "起動時のfull rescanで、アプリ起動前から置かれていたファイルを拾い直せる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/dotnet/api/system.io.filesystemwatcher> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/usn-journal/> ;
    rdf:predicate ks:recommendedFor ;
    rdf:object <https://comcomponent.com/knowledge/watcher-downtime-gap/> ;
    schema:description "アプリが停止していた間の変更も前回読んだUSN位置から後で読み直せるため、常時起動できない要件にはUSNチェンジジャーナルが選択肢になる"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/fileio/change-journals> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/usn-journal/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/ntfs/> ;
    schema:description "USNチェンジジャーナルは、NTFSがボリューム単位で持っている変更の記録である"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/fileio/change-journals> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/usn-journal/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/admin-rights/> ;
    schema:description "ジャーナルの作成・削除など変更ジャーナルの管理操作には管理者権限が必要"@ja ;
    ks:evidence <https://learn.microsoft.com/en-us/windows/win32/fileio/creating-modifying-and-deleting-a-change-journal> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .
