@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/windows-max-path-filename-pitfalls/#article>
    schema:about <https://comcomponent.com/knowledge/max-path/>, <https://comcomponent.com/knowledge/reserved-device-name/>, <https://comcomponent.com/knowledge/path-normalization/> ;
    schema:mentions <https://comcomponent.com/knowledge/long-path-enable/>, <https://comcomponent.com/knowledge/long-path-prefix/>, <https://comcomponent.com/knowledge/path-too-long-exception/>, <https://comcomponent.com/knowledge/filename-case-handling/>, <https://comcomponent.com/knowledge/path-combine/>, <https://comcomponent.com/knowledge/eight-dot-three-name/>, <https://comcomponent.com/knowledge/ntfs/>, <https://comcomponent.com/knowledge/fsutil/>, <https://comcomponent.com/knowledge/dotnet/>, <https://comcomponent.com/knowledge/dotnet-framework/>, <https://comcomponent.com/knowledge/long-path-unaware-app/>, <https://comcomponent.com/knowledge/directory-traversal-risk/>, <https://comcomponent.com/knowledge/path-containment-check/>, <https://comcomponent.com/knowledge/filename-sanitization/>, <https://comcomponent.com/knowledge/case-sensitivity-side-effect/>, <https://comcomponent.com/knowledge/path-component-limit/> .

<https://comcomponent.com/knowledge/max-path/> a skos:Concept ;
    skos:prefLabel "MAX_PATH(260文字制限)"@ja ;
    skos:definition "Win32 APIにおけるパスの最大長で、ドライブ文字・コロン・バックスラッシュ・最大256文字のパス文字列・終端NULを合わせた260文字という制限。"@ja ;
    skos:altLabel "MAX_PATH" .

<https://comcomponent.com/knowledge/reserved-device-name/> a skos:Concept ;
    skos:prefLabel "予約デバイス名(CON/NUL等)"@ja ;
    skos:definition "CON、PRN、AUX、NUL、COM1〜COM9、LPT1〜LPT9などMS-DOS時代から続くデバイスの予約名で、拡張子を付けてもファイルではなくデバイスとして解釈される名前。"@ja ;
    skos:altLabel "CON/PRN/AUX/NUL/COM1-9/LPT1-9" .

<https://comcomponent.com/knowledge/path-normalization/> a skos:Concept ;
    skos:prefLabel "パス正規化(末尾ドット・スペースの除去)"@ja ;
    skos:definition "Windowsのパス解決処理の一部で、パスが区切り文字で終わらない場合に末尾のドットとスペースをすべて取り除く規則。"@ja .

<https://comcomponent.com/knowledge/long-path-enable/> a skos:Concept ;
    skos:prefLabel "長パスの有効化(LongPathsEnabled+longPathAware)"@ja ;
    skos:definition "Windows 10 バージョン1607以降で、レジストリ値LongPathsEnabled=1とアプリケーションマニフェストのlongPathAware要素の両方を設定することで、多くのWin32ファイル関数からMAX_PATH制限を外せる仕組み。"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/max-path/> .

<https://comcomponent.com/knowledge/long-path-prefix/> a skos:Concept ;
    skos:prefLabel "\\\\?\\プレフィックス"@ja ;
    skos:definition "パス文字列の先頭に付けることで文字列の正規化と解析をスキップし、Unicode版APIでMAX_PATHを超えるパスをそのままファイルシステムへ渡せるようにする表記。"@ja ;
    skos:altLabel "拡張長パスプレフィックス"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/path-normalization/> .

<https://comcomponent.com/knowledge/path-too-long-exception/> a skos:Concept ;
    skos:prefLabel "PathTooLongException"@ja ;
    skos:definition "パスがシステム定義の最大長を超えたときに.NETが投げる例外。"@ja .

<https://comcomponent.com/knowledge/dotnet/> a skos:Concept ;
    skos:prefLabel ".NET(Core以降)"@ja ;
    skos:definition ".NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。"@ja ;
    skos:altLabel ".NET Core" ;
    skos:altLabel "モダンな.NET"@ja .

<https://comcomponent.com/knowledge/dotnet-framework/> a skos:Concept ;
    skos:prefLabel ".NET Framework"@ja ;
    skos:definition "Windowsのコンポーネントとして扱われ、インストールされているOSのライフサイクルに沿ってサポートされるランタイム。System.Messagingの対象範囲。"@ja .

<https://comcomponent.com/knowledge/path-combine/> a skos:Concept ;
    skos:prefLabel "Path.Combineのルート付き引数仕様"@ja ;
    skos:definition "Path.Combineメソッドで2番目以降の引数にルート付きパスが渡されると、それより前の引数がすべて無視される.NETの仕様。"@ja .

<https://comcomponent.com/knowledge/directory-traversal-risk/> a skos:Concept ;
    skos:prefLabel "意図した保存フォルダー外への書き込み"@ja ;
    skos:definition "ユーザー入力や設定ファイル由来のパスをそのまま結合した結果、想定した保存フォルダーの外にあるファイルへアクセス・書き込みしてしまうリスク。"@ja ;
    skos:altLabel "ディレクトリトラバーサル"@ja .

<https://comcomponent.com/knowledge/path-containment-check/> a skos:Concept ;
    skos:prefLabel "ベースディレクトリ配下チェック"@ja ;
    skos:definition "Path.GetFullPathで正規化した結果がベースディレクトリ配下かどうかを検証する手法。"@ja ;
    ks:mitigates <https://comcomponent.com/knowledge/directory-traversal-risk/> ;
    ks:requires <https://comcomponent.com/knowledge/path-normalization/> .

<https://comcomponent.com/knowledge/filename-sanitization/> a skos:Concept ;
    skos:prefLabel "ファイル名のサニタイズ"@ja ;
    skos:definition "GetInvalidFileNameCharsによる不正文字の置換に加え、予約デバイス名・末尾のドットやスペース・長さ上限を自前でチェックして安全なファイル名に直す処理。"@ja ;
    ks:prevents <https://comcomponent.com/knowledge/reserved-device-name/> ;
    ks:mitigates <https://comcomponent.com/knowledge/path-normalization/> ;
    ks:requires <https://comcomponent.com/knowledge/path-component-limit/> .

<https://comcomponent.com/knowledge/filename-case-handling/> a skos:Concept ;
    skos:prefLabel "大文字小文字の保持と非区別"@ja ;
    skos:definition "作成時の大文字小文字を保持して表示するが、検索・比較では大文字小文字を区別しないWindowsファイルシステムの既定動作。"@ja ;
    skos:altLabel "case-preserving, case-insensitive" ;
    ks:configuredBy <https://comcomponent.com/knowledge/fsutil/> .

<https://comcomponent.com/knowledge/fsutil/> a skos:Concept ;
    skos:prefLabel "fsutil"@ja ;
    skos:definition "NTFSボリュームの低レベルな照会・設定を行うコマンドラインツール。ファイルのエクステント照会、8.3短縮名の設定、USNジャーナル操作、リパースポイント照会など多数のサブコマンドを持つ。"@ja ;
    skos:altLabel "fsutil.exe" .

<https://comcomponent.com/knowledge/case-sensitivity-side-effect/> a skos:Concept ;
    skos:prefLabel "大文字小文字区別有効化の副作用"@ja ;
    skos:definition "NTFSのディレクトリ単位の大文字小文字区別を有効化すると、大文字小文字非区別を前提とするWindowsアプリがファイルにアクセスできなくなることがある副作用。"@ja .

<https://comcomponent.com/knowledge/eight-dot-three-name/> a skos:Concept ;
    skos:prefLabel "8.3短縮名"@ja ;
    skos:definition "歴史的互換性のためNTFSが長いファイル名に対して自動生成できる、REPORT~1.DOCのような形式の短縮名。"@ja ;
    skos:altLabel "8.3名"@ja ;
    skos:altLabel "短縮ファイル名"@ja .

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

<https://comcomponent.com/knowledge/path-component-limit/> a skos:Concept ;
    skos:prefLabel "パスコンポーネントの長さ上限(255文字)"@ja ;
    skos:definition "1つのフォルダー名・ファイル名(コンポーネント)の長さ上限。GetVolumeInformationが返す値で、一般に255文字。"@ja .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/long-path-enable/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/max-path/> ;
    schema:description "Windows 10 1607以降でレジストリのLongPathsEnabled=1とアプリマニフェストのlongPathAwareの両方を設定すると、多くのWin32ファイル関数でMAX_PATHの260文字制限が外れる"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/maximum-file-path-limitation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/long-path-prefix/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/max-path/> ;
    schema:description "パス文字列の先頭に\\\\?\\を付けると正規化がスキップされてそのままファイルシステムへ渡され、MAX_PATHの制限を超えられる(相対パスやUnicode版以外のAPIには使えない)"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/maximum-file-path-limitation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/max-path/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/path-too-long-exception/> ;
    schema:description "旧来の.NET Frameworkではフルパスが260文字以上になるとSystem.IO.PathTooLongExceptionが投げられていた"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.io.pathtoolongexception> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dotnet/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/path-too-long-exception/> ;
    schema:description ".NET(Core)/.NET 5以降のランタイムはMAX_PATHチェックを行わないため、260文字超過を理由とするPathTooLongExceptionは投げられない。ただしOSやファイルシステムが定める上限を超えた場合は、この例外や同等のOSエラーが依然として発生し得る"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/io/file-path-formats#skip-normalization> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dotnet-framework/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/path-too-long-exception/> ;
    schema:description ".NET Frameworkは4.6.2未満をターゲットにすると260文字超過でPathTooLongExceptionが投げられる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/framework/migration-guide/retargeting/4.6.x> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/dotnet-framework/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/long-path-enable/> ;
    schema:description ".NET Frameworkアプリが実務で長パスを通すには、ランタイム側のターゲット変更(4.6.2以降)に加えてOS側のLongPathsEnabledとマニフェストのlongPathAwareの併用が必要になる(長いパスを扱う必要がある場合に限る。長パスを使わないアプリでは不要)"@ja ;
    ks:evidence <https://learn.microsoft.com/nuget/reference/cli-reference/cli-ref-long-path> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/path-combine/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/directory-traversal-risk/> ;
    schema:description "Path.Combineは2番目以降の引数にルート付きパスが渡されるとそれより前の引数を無視するため、ユーザー入力をそのまま渡すと意図した保存フォルダーの外へ書き込む脆弱性になり得る"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.io.path.combine> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/path-containment-check/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/directory-traversal-risk/> ;
    schema:description "ベース側も正規化したうえで相対パスに変換し、..への脱出や別ドライブ・UNCへの脱出を検知して弾く実装が対策になる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/api/system.io.path.combine> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/filename-sanitization/> ;
    rdf:predicate ks:prevents ;
    rdf:object <https://comcomponent.com/knowledge/reserved-device-name/> ;
    schema:description "ユーザー入力からファイル名を組み立てる際、GetInvalidFileNameCharsに加えて予約デバイス名と末尾ドット・スペースを自前でチェックし接頭辞を付けることで、予約名としての解釈を防げる"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/naming-a-file> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/filename-sanitization/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/path-normalization/> ;
    schema:description "末尾のスペース・ドットをTrimEndで事前に取り除くことで、正規化によって黙って名前が変わる事故を避けられる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/io/file-path-formats#path-normalization> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/long-path-prefix/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/path-normalization/> ;
    schema:description "\\\\?\\プレフィックスは正規化をスキップしてファイルシステムへそのまま渡すため、末尾がドットやスペースの名前(hidden.など)にもアクセスできる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/io/file-path-formats#path-normalization> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/filename-case-handling/> ;
    rdf:predicate ks:configuredBy ;
    rdf:object <https://comcomponent.com/knowledge/fsutil/> ;
    schema:description "fsutil.exe file setCaseSensitiveInfoで、ディレクトリ単位で大文字小文字の区別を有効化・確認できる"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/wsl/case-sensitivity> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/filename-case-handling/> ;
    rdf:predicate ks:mayCause ;
    rdf:object <https://comcomponent.com/knowledge/case-sensitivity-side-effect/> ;
    schema:description "NTFSのディレクトリ単位の大文字小文字区別を有効化すると、大文字小文字非区別を仮定するWindowsアプリがファイルにアクセスできなくなることがある"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/wsl/case-sensitivity> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/eight-dot-three-name/> ;
    rdf:predicate ks:mitigates ;
    rdf:object <https://comcomponent.com/knowledge/max-path/> ;
    schema:description "8.3短縮名でパス中のフォルダー名を短く指定すると、MAX_PATHの上限に触れて開けないパスを詰める応急処置になる"@ja ;
    ks:evidence <https://learn.microsoft.com/windows-server/administration/windows-commands/dir> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ntfs/> ;
    rdf:predicate ks:uses ;
    rdf:object <https://comcomponent.com/knowledge/eight-dot-three-name/> ;
    schema:description "8.3短縮名の生成が無効化されていない既定の設定では、NTFSは歴史的互換性のため長いファイル名に対して8.3短縮名を自動生成する(ボリューム単位で無効化されている場合は生成されない)"@ja ;
    ks:evidence <https://learn.microsoft.com/windows-server/storage/file-server/ntfs-overview> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "context-dependent" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ntfs/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/path-component-limit/> ;
    schema:description "NTFSではパスを構成する個々のコンポーネント(1つのフォルダー名・ファイル名)の上限は一般に255文字である"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/maximum-file-path-limitation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/filename-sanitization/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/path-component-limit/> ;
    schema:description "ファイル名1要素の長さ上限(通常255文字)に収まるよう、切り詰め処理でコンポーネント長を考慮する"@ja ;
    ks:evidence <https://learn.microsoft.com/windows/win32/fileio/maximum-file-path-limitation> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/ntfs/> ;
    rdf:predicate ks:implements ;
    rdf:object <https://comcomponent.com/knowledge/filename-case-handling/> ;
    schema:description "Windowsファイルシステムの既定である「保持するが区別しない」大文字小文字の扱いはNTFS自身の動作であり、NTFSはPOSIX的な大文字小文字の区別も(既定では無効だが)サポートしている"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/io/file-path-formats#case-and-the-windows-file-system> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .

[] a rdf:Statement ;
    rdf:subject <https://comcomponent.com/knowledge/path-containment-check/> ;
    rdf:predicate ks:requires ;
    rdf:object <https://comcomponent.com/knowledge/path-normalization/> ;
    schema:description "ベースディレクトリ配下チェックはPath.GetFullPathによるパス正規化を経て絶対パス化した結果に対して行う必要があり、正規化を経ずに文字列比較すると判定が崩れる"@ja ;
    ks:evidence <https://learn.microsoft.com/dotnet/standard/io/file-path-formats#path-normalization> ;
    ks:verifiedAt "2026-08-01" ;
    ks:certainty "established" .
