Windowsにおけるパスの最大長の文字数制限

Windows APIのほとんどのバージョンにおいて最大長のパス名はデフォルトで260文字です。詳細についてはMaximum Path Length Limitationで説明されています。

通常、小規模のプロジェクトではこの制限は問題ありませんが、プロジェクトのサイズが大きくなると、特にサブディレクトリのネスティングレベルが深いとこの制限を超える可能性があります。 プロジェクト名がこの制限以下であってもQACプロジェクトの場所とその作業ディレクトリの要件がこの制限を超える原因になる可能性があります。

QACはプロジェクトのパスが180文字以上になると警告を発します。

Windows 10 バージョン 1607とそれ以降で、Microsoft は enable long paths に変更を導入しました。この変更は対象のマシンでのアプリケーションマニフェストおよび、レジストリ設定の変更を必要とします。

Perforce はこの機能をQACで使用可能にするための調査を遂行しました。長いパスのサポートを可能にしたのちサードパーティのアプリケーション(Microsoftツールを含む)との統合はWindows エコシステム内の長いパスの一般的なサポートがないため非現実的であると結論しました。

現在のQACのビルドはマニフェストにおいて longPathAware 設定が使用可能ではありません。

Windows エコシステムにおける長いパスのサポートが改良されるまで、QACの使用では最大長の文字数は260に制限されますが、この制限を軽減するいくつかの回避策があります。以下のセクションでこの回避策(invasiveなものとそれほどではないものがあります)を説明します。



  • これらののテクニックは基盤のファイルシステムにより制約されているものがある可能性があります。大まかには exFAT 、 FAT32 ファイルシステムの使用は避け、可能な限り NTFS を使用してください。以下のコンソールコマンドを使用して基盤のファイルシステムを判断することができます。
    wmic volume where DriveLetter='D:' get FileSystem 
  • ソースコードを移動する

    ソースコードがパスの深いところにある場合、上の階層に移動することを考慮してください。

    例えば、プロジェクト ABS-Generic1 が D:\Users\neo\development\2025\auto\braking\ABS\Version1\ にある場合、 
    D:\ABS-Generic1 などに移動することを考慮してください。

    QACプロジェクトを移動する

    多くの場合、QACプロジェクトはソースコードと同じ場所に位置します。しかし、これは必須の場所ではないため他の場所、上部の階層に位置する可能性もあります。

    例えば、ソースコードが D:\Users\neo\development\2025\auto\braking\ABS\Version1\ABS-Generic1 にある場合、QACプロジェクトを D:\QAC-ABS-Generic1 に置くことができます。

    QACプロジェクトを以下に作成:

    qacli project create -P D:\QAC-ABS-Generic1

    オリジナルの場所を使用して SOURCE_ROOT をQACプロジェクトのローカルに設定します。

    qacli project roots -P D:\QAC-ABS-Generic1 --add SOURCE_ROOT --path D:\Users\neo\development\2025\auto\braking\ABS\Version1\ABS-Generic1 --force 

    その後、通常通りソースファイルをプロジェクトと同期/プロジェクトに追加することができます。

    QAC プロジェクトのソースコード構造のミラーリングを削減する

    解析、結果の表示など様々な処理中にQACはソースコードのディレクトリ構造をミラーリングするため、これが260文字制限に違反する原因となる可能性があります。

    解析

    QACのトリビアルなシンプルなサンプルプロジェクト sample_cgicc_diff を解析するとそのディレクトリの構造は以下のようになります。

    ├───prqa
    │   ├───configs
    │   │   └───Initial
    │   │       ├───cip
    │   │       ├───config
    │   │       ├───logs
    │   │       ├───output
    │   │       │   └───_SOURCE_ROOT
    │   │       │       └───src
    │   │       │           ├───cgicc
    │   │       │           ├───demo
    │   │       │           └───diff
    │   │       ├───reports
    │   │       └───tmp
    │   ├───unified
    │   └───upgrade
    └───src
        ├───cgicc
        ├───demo
        └───diff
            └───hdr
                └───sys

    これは、ソースコードのミラーリング(prqa/configs/Initial/output/_SOURCE_CODE/src/…)です。

    このトリビアルなプロジェクトのミラーリングはそれほど長くなりませんが、大きなプロジェクトではミラーリングが大きく影響し、プロジェクトが260文字制限に違反する原因となります。

    環境変数 QAC_MIN_OUTPUT_DIR (付録 D 環境変数を参照)を設定し再解析することでミラーリングを削減することができます。再解析後の構造は以下のようになります。

    ├───prqa
    │   ├───configs
    │   │   └───Initial
    │   │       ├───cip
    │   │       ├───config
    │   │       ├───logs
    │   │       ├───output
    │   │       │   ├───cgicc-d1652cd25d31632c2d49
    │   │       │   ├───demo-0d0e5514edb0b0e2dc6e
    │   │       │   └───diff-3937df56d50e1e04f6dc
    │   │       ├───reports
    │   │       └───tmp
    │   ├───unified
    │   └───upgrade
    └───src
        ├───cgicc
        ├───demo
        └───diff
            └───hdr
                └───sys

    View

    qacli view コマンド (--medium XML | HTML) も XML および  HTMLファイルを生成するときにソースコードのディレクトリ構造をミラーリングします。2通りの文字数の削減方法があります。

    1. --output-path オプションを使用し、パスの始まりに近い場所を指定することにより260文字の制限に抵触しません。
    2. --collate-output  オプションを使用し、出力ディレクトリをフラット化します(環境変数 QAC_MIN_OUTPUT_DIR と同様)。

    Windows Junctions (mklink /J)を使用する

    ジャンクションポイントともいわれる Windows Junctions はNTFSファイルシステムの機能でディレクトリにシンボリックリンクを作成することができます。

    この機能は深く入れ子になったディレクトリへのリンクを短いパスで生成することを可能にします。

    例:

    mklink /J C:\QAC-kazlib 
    “C:\LongPath\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890\kaz lib$” 

    これにより C:\QAC-kazlib にジャンクションを生成し、この場所を通常のようにプロジェクトの同期、解析、表示などに使用することができます。

    qacli analyze -cf -P C:\QAC-kazlib
    Progress(Cleaning): ............................................... done
    C:\TEMP\JN2\except.c:qac:0:1:4
    C:\TEMP\JN2\hash.c:qac:0:2:3
    C:\TEMP\JN2\list.c:qac:0:3:2
    C:\TEMP\JN2\dict.c:qac:0:4:1
    C:\TEMP\JN2\sfx.c:qac:0:5:0
    Progress(File-based Analysis): ................................... done

    5 successes and 0 failures.

    上記の mklink コマンドで示したフルパスでこれを実行しようとすると以下のようなエラーで失敗します。

    C:\LongPath\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890\kaz lib$>qacli analyze -cf -P . 
    A filesystem exception has been encountered for the following path(s):
                
    C:\LongPath\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890\kaz lib$\prqa\configs\Initial\config

                
    System Error Code(206) : filename too long

    See (external site) https://learn.microsoft.com/en-us/windows/win32/debug/system-error-codes for details.

    Please check that your filesystem does not have permissions issues for the user
    data directory and/or your project directory:
        C:\Users\sbainbridge\AppData\Local\Perforce\QAC-<version>

    Windows users should ensure path lengths are less than 260 characters.

    Please contact support if you cannot resolve this issue:
    Website: www.perforce.com/
    Support: www.perforce.com/support/request-support

    Windows Virtual Drives (subst)を使用する

    Windows の subst コマンドはドライブの文字とパスを関連づけるコマンドラインユーティリティです。

    これは特定のディレクトリを指す仮想ドライブを生成し、毎度全パスをナビゲートすることなく深く入れ子になってるフォルダへのアクセスをより簡単にするのに役立ちます。

    例えば、深く入れ子になったフォルダと Z:ドライブとを関連づけるためには以下のコマンドを使用します。

    SUBST Z: 
    "C:\LongPath\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890123456789012345678901234567890\123456789012345678901234567890\kaz lib$"

    その後、新しく作成したこの仮想ドライブを使用します。

    Z:\>qacli analyze -cf -P .
    Progress(Cleaning): ............................................... done
    Z:\except.c:qac:0:1:4
    Z:\list.c:qac:0:2:3
    Z:\hash.c:qac:0:3:2
    Z:\sfx.c:qac:0:4:1
    Z:\dict.c:qac:0:5:0
    Progress(File-based Analysis): ................................... done

    5 successes and 0 failures.