C# で extended-length パス

Windows ではパスの長さは MAX_PATH(260)文字までということになっていて、C#(というか .NET Framework)のファイル系ライブラリも昔は 260 文字までのパスしか使えなかった。

260 文字を超えるとても長いパスを扱えるようにするのが extended-length パスで、単純に、通常のパスの先頭に "\\?\" を付与するだけで良い。

使い方


NET462extended-length パスは .NET Framework 4.6.2 でサポートされたので、プロジェクトのプロパティーでターゲットフレームワークを .NET Framework 4.6.2 以上にしたうえで、以下のコードを実行すると、正しく結果が得られる。

const String EXTENDED_LENGTH_PATH_PREFIX = @"\\?\";
String aPath = EXTENDED_LENGTH_PATH_PREFIX + @"C:\Tmp\とても長いパス\123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789A123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890B\1234567890123456789Z\1234567890123456789Y\VeryVeryLongPath";
MessageBox.Show("Len: " + aPath.Length.ToString() + "\nExists: " + Directory.Exists(aPath).ToString());

"\\?\" を付与しないと、フォルダーが存在する場合でも False が返されてしまう。

互換性

ターゲットフレームワークを .NET Framework 4.6.2 とすると動作する環境が限られてしまう。

.NET Framework 4.6.2 未満の環境でも、extended-length パスはサポートされないにしても、短いパスである限りは動くようにしたい場合は、ターゲットフレームワークを例えば .NET Framework 4.5 としたうえで、まず App.config の <runtime> に <AppContextSwitchOverrides> を追加する。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
  </startup>
  <runtime>
    <AppContextSwitchOverrides value="Switch.System.IO.UseLegacyPathHandling=false;Switch.System.IO.BlockLongPaths=false"/>
  </runtime>
</configuration>

実行時に .NET のバージョンを確認し、4.6.2 以上であれば extended-length パスを使うようにする。
private Boolean GetClrVersionRegistryNumber(out Int32 oClrVersion)
{
    using (RegistryKey aKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32).OpenSubKey(@"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"))
    {
        if (aKey != null && aKey.GetValue("Release") != null)
        {
            oClrVersion = (Int32)aKey.GetValue("Release");
            return true;
        }
        else
        {
            oClrVersion = 0;
            return false;
        }
    }
}

private Boolean Is462()
{
    Int32 aClrVer;
    GetClrVersionRegistryNumber(out aClrVer);
    return aClrVer >= 394802;
}

private String ExtendPath(String oPath)
{
    // extended-length パスが使えない環境や、既に extended-length パスになっている場合はそのまま返る
    if (!Is462() || oPath.StartsWith(EXTENDED_LENGTH_PATH_PREFIX))
    {
        return oPath;
    }

    // extended-length パスにする
    // MAX_PATH 文字以上のフォルダー名をダイアログから取得した場合など、短いファイル名形式になっていることがあるため、
    // Path.GetFullPath() で長いファイル名形式に変換する
    return EXTENDED_LENGTH_PATH_PREFIX + Path.GetFullPath(oPath);
}

private void button1_Click(object sender, EventArgs e)
{
    try
    {
        String aPath = ExtendPath(@"C:\Tmp\短いパス");
        //String aPath = ExtendPath(@"C:\Tmp\とても長いパス\123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789A123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890B\1234567890123456789Z\1234567890123456789Y\VeryVeryLongPath");
        MessageBox.Show("4.6.2 or higher: " + Is462().ToString() + "\nLen: " + aPath.Length.ToString() + "\nExists: " + Directory.Exists(aPath).ToString());
    }
    catch (Exception oExcep)
    {
        MessageBox.Show(oExcep.Message);
    }
}

このようにすると、.NET 4.6.2 以上の環境で動作させると長いパス含めて正しく動作するし、.NET 4.6.2 未満の環境では長いパスは動作しないが短いパスなら動作する。


Intel Optane SSD メモ

インテルの Optane SSD のメモ。

Optane SSD は通常の NAND NVMe SSD と比べて、ベンチマーク上の速度は
  • ランダムリード:6~7 倍高速
  • ランダムライト:1.2~2 倍高速
  • シーケンシャルリード:やや遅い
  • シーケンシャルライト:1.5 倍高速
となっているが、実用上はそんなに変わらないらしい。

耐久性としては TBW が 8.76 PB と、NAND の優に 10 倍以上はある。

ラインナップは 2017 Q4 発売の 900P シリーズと 2018 年 Q2 発売の 905P シリーズ。905P のほうが多少高速かつ省電力。インターフェースはいずれも PCIe NVMe 3.0 x4 だが、フォームファクターはシリーズと容量によって異なる。
  • 905P:960 GB(HHHL / 17 万円)、480 GB(U.2 / 8 万円)
  • 900P:480 GB(HHHL / 8 万円)、280 GB(HHHL or U.2 / 5 万円)
【参考リンク】

C ドライブ容量メモ

DriveC今使っている C ドライブの容量メモ。
  • OS:23 GB
  • アプリ系:37 GB(18 GB + 18 GB + 1 GB)
  • 設定系:32 GB(25 GB + 7 GB)
  • 単独ファイル:7 GB(ページファイル)
ここまでで 99 GB。その他の主な物は、
  • イメージ:239 GB
  • 動画出力:80 GB
  • 単独ファイル:33 GB(ハイバネ、RAM ディスク初期化)
調べてて今更気付いたけど、ハイバネーションは不要なので無効にしておいた。管理者権限のコマンドプロンプトで、
powercfg /h off
とする。

これで hiberfil.sys 13 GB が消えた。

ニコカラメーカーでプレビュー・動画出力ができない場合の対処法

お使いのパソコン環境によっては、ニコカラメーカーのプレビュータブでプレビューができなかったり、動画出力ができないケースが発生する場合があります。

プレビュー・動画出力には DirectX の仕組みを使用しており、詳細は DirectX にお任せしているため、うまく動作しない原因もニコカラメーカー側では分からないのですが、少しでもうまく動く可能性を上げるための方法を以下にまとめました。プレビュー・動画出力がうまく行かない場合にお試し下さい。


ニコカラメーカーのインストール場所

ニコカラメーカーをインストールする際、以下のフォルダーを「避けて」インストールして下さい。
  • C:\Program Files
  • C:\Program Files (x86)
これらのフォルダーには Virtual Store と呼ばれる特殊な機能が備わっており、予期せぬ結果となる恐れがあります。

もしこれらのフォルダーにニコカラメーカーがインストールされている場合は、別の場所に再インストールして下さい。

例えば、
  • C:\MyApp
というようなフォルダーを自分で作成し、そのフォルダーの中にニコカラメーカーのフォルダーを入れると良いでしょう。ニコカラメーカーの実行ファイルのフルパスは以下のようになります。
  • C:\MyApp\NicoKaraMaker\NicoKaraMaker.exe

DirectShow フィルターの再インストール

DirectShow フィルター(動画コーデック)を再インストールすることで解決する場合があります。以下を参考にして、K-Lite Codec Pack(Full 版)をインストールしてみて下さい。

DownloadFull
K-Lite Codec Pack ダウンロードページの中程にある「Download Full」をクリックします。

Mirror1Full 版ダウンロードページの上の方にある「Mirror 1」をクリックし、ファイルをダウンロードします。ダウンロードが遅い場合は Mirror 2 からダウンロードしても構いません。

ダウンロードしたファイルは、ファイル名が「K-Lite_Codec_Pack_1460_Full.exe」のようになっているはずです(数字はバージョンによって変わります)。ファイル名が違う場合は広告のファイルをダウンロードしている可能性がありますので再度確認して下さい。

ダウンロードした K-Lite_Codec_Pack_1460_Full.exe をダブルクリックしてインストールを開始します。旧バージョンや他のコーデックのアンインストールが指示された場合はアンインストールして下さい。

Normalインストールモードを「Normal」のままにしておきます。

設定をデフォルトのままにして、次々と「Next」ボタンをクリックします。

Install最後に「Install」ボタンをクリックすると、コーデックがインストールされます。

DirectShow フィルター設定の確認

スタートメニューから「Codec Tweak Tool」を起動します。

Tweak「DirectShow (x86)」ボタンをクリックします。64 bit Windows をお使いの場合でも、(x64) ではなく (x86) をクリックして下さい。
Manage「ENABLED FILTERS」の中に「LAV Video Decoder」と「LAV Splitter」が入っていることを確認します。入っていれば問題ないので、そのまま Close ボタンをクリックしてウィンドウを閉じます。

もしも「DISABLED FILTERS」の中に「LAV Video Decoder」「LAV Splitter」が入っている場合は、「LAV Video Decoder」「LAV Splitter」のチェックを入れてから Apply ボタンをクリックします。すると「LAV Video Decoder」「LAV Splitter」が「ENABLED FILTERS」に移動しますので、Close ボタンをクリックしてウィンドウを閉じます。
Codec Tweak Tool のメインウィンドウに戻ったら、Exit ボタンをクリックして終了します。

元動画を無圧縮 AVI にする

素材となる元動画(ニコカラメーカーの素材タブで指定する動画)の形式が mp4 や圧縮された AVI 形式の場合は、元動画を無圧縮 AVI 形式(RGB24)に変換します。

変換には、市販ソフト・フリーソフト等をご利用下さい。

動画と歌詞以外のファイルが無いことの確認

素材となる元動画と同じフォルダに、ファイル名が同じで拡張子のみが違うファイルがあると、元動画の読み込みに悪影響を及ぼす場合があります。そのようなファイルは削除するか、別の場所に移動して下さい。

例)元動画が Test.avi で歌詞ファイルが Test.lrc の場合、Test.avs が同じフォルダに存在すると NG

管理者権限での起動

ニコカラメーカーを管理者権限で起動します。

Adminエクスプローラーで NicoKaraMaker.exe を右クリックし、「管理者として実行」をクリックすることで、ニコカラメーカーを管理者権限で起動することができます。

ブースターの無効化

プレビュー処理を高速化するブースターを無効にすると、動画が読み込めるようになる場合があります。

ニコカラメーカーのメニューから[ツール→設定]をクリックし、「ブースターを使用する」のチェックを外して OK ボタンをクリックします。その後、プレビュータブを再度開いてください。

特定のエラーメッセージごとの対処法

プレビュー・動画出力時に、以下のようなエラーメッセージが出力される場合は、エラーメッセージごとに対処法がありますので、リンク先の情報に従って対処して下さい。

知見募集中

他の方法でうまく動くようになった場合は、情報をコメントでお寄せ下さい。お待ちしております。



ゆかりすたー Ver 7.51 β 公開

YukaLister_MainWindowゆかりすたーの新バージョン、Ver 7.51 β を公開しました。

ゆかりすたーはニコカラ動画ファイルを整理し、「ゆかり」(持ち込みカラオケ用のブラウザリクエストツール)から検索できるようにするツールです。データベースを活用することにより、タイアップしている番組名や歌手名などの付加情報を含めて整理するので、単なるファイル名検索にとどまらない高い検索性を提供することができるようになります。

ゆかりすたーは、ニコカラりすたーの後継ソフトとして開発しています。ニコカラりすたーは一時点でのリスト化機能のみを提供していましたが、ゆかりすたーは、ゆかりと連携した高度な検索性の提供を目的に、リアルタイムでのリスト化機能と検索用データベース構築機能を提供します。

更新内容

ゆかり検索対象フォルダー追加時や、ゆかりすたー起動時の処理速度を改善しました。

ゆかり検索対象フォルダーを追加した際の処理を、ファイル名とそれ以外の情報の二段階に分けて行うようにしました。これにより、ひとまずキーワード検索でファイル名だけは早い段階で検索可能となりました。

ゆかりすたー起動時、前回のリストをクリアするか否か、環境設定で選べるようにしました。クリアしない設定にした場合、ゆかりすたー起動直後から前回のリストが使えるので、ひとまずのリクエストができるようになります。ただし、存在しないファイルがリスト化されている状態になる恐れもありますので、注意してご使用下さい。

その他、細かい改善をしています。今回の更新内容を含む課題対応履歴についてはこちらをご覧ください。

Windows Defender について

Windows Defender がゆかりすたーの動作に悪影響を及ぼす場合があり、エラーが発生したり、処理速度が異常に遅くなったりする例が報告されています。

ゆかりすたーを使う際は、Windows Defender を使わないことをお薦めします。

詳細についてはこちらをご覧ください。

更新・新規インストール方法

ゆかりすたーは自動更新機能を搭載しています。既にゆかりすたーをお使いの方は、ゆかりすたーを起動すると、3 日以内に更新のアナウンスが表示されます。

すぐにアップデートしたい場合は、環境設定ウィンドウのメンテナンスタブを開き、「今すぐ最新情報を確認する」ボタンをクリックすることで、アップデートを開始することができます。

Ver150to168右のようなダイアログが表示されますので、「はい。今すぐ更新します」をクリックしてください。

ゆかりすたー更新版インストール画面に案内が表示されますので、案内に従って操作をして下さい。

ゆかりすたー更新完了ほどなくして、ゆかりすたーの更新が完了します。

これから初めてゆかりすたーを使う方(新規の方)や、手動でゆかりすたーを更新したい方は、下記サイトからどうぞ。

カウンター


カンパのお願い
Amazon でお買い物の際は、下記で検索して頂けたら幸いです。
記事検索
最新コメント
  • ライブドアブログ