2019年02月

次のパソコンを軽くイメージ その 2(2019 年)

この前イメージした次のパソコンを少し修正。

ストレージの考え方を修正。前回は作業用ディスクとして RAM ディスクを用いることを前提にメモリを増やしたが、今回は RAM ディスクを廃して Optane SSD とする方針に変更。

というのも、作業用ディスクに無圧縮 AVI を出力することを想定した場合、フル HD、60 fps だと音声込みで 1 分当たり 21 GB 必要となり、6 分の動画で 126 GBも必要となってしまう。メモリでは賄いきれないため、速度と耐久性を兼ね備えた Optane SSD を選択。

Optane の容量は、以前に調査した C ドライブ必要量 100 GB に加えて、動画出力 126 GB となると、最低でも 250 GB は必要。

Optane は速度の速い 905P シリーズが良いが、低容量は U.2 接続しかないので(U.2 → M.2 変換はそこがボトルネックになると嫌なので避ける)、速度のやや遅い 900P シリーズで妥協する。

また、一応 Blu-ray も付けることとした。

というあたりを、BTO で見積もってみた。さすがに Optane は選べなかったので、別途購入ということにする。

サイコム:Radiant GZ2800Z390 基本部分 144,960 円(送料別)

V-SPEC:第 8/9 世代 ATX スタンダード 基本部分 165,090 円(送料別)


本体

詳細はサイコムベース。
パーツ型番想定価格(税込み)
名称次期メインマシンイメージ その 2(2019 年)
304,960 円
基本部分サイコム Radiant GZ2800Z390
144,960 円
マザーボードASRock Z390 Pro4
- 円
CPUIntel Core i9-9900K- 円
CPU クーラーCoolerMaster Hyper 212EVO
- 円
セラミックグリスCPU 付属品- 円
メモリ16 GB- 円
SSDOptane SSD 900P 480 GB HHHL
80,000 円
SSDSATA 4TB
80,000 円
マウンタSSD 付属品0 円
光学ドライブ
(Blu-ray)
LG BH14NS58
- 円
ビデオカードオンボード
- 円
LANオンボード
- 円
ケースFractal Design CORE 2550S Black- 円
電源SilverStone SST-ET550-B(80PLUS Bronze)
- 円

周辺機器

周辺機器は前回から変更無し。
パーツ型番想定価格(税込み)
RAID ユニットWestern Digital My Book Duo WDBLWE0080JCH-JESN(流用)
※8TB、RAID 1 の運用で実効 4TB
※USB 3.0 接続
0 円
サウンドカードCreative Sound Blaster Digital Music Premium HD (SB-DM-PHD)(流用)
※USB 接続
0 円
スピーカーONKYO WAVIO GX-70HD(流用)
0 円
オーディオレシーバーONKYO WR-BT300(流用)
※Bluetooth で音声を受信してスピーカーに流す
0 円
ディスプレイ21.5 インチワイド液晶、IO DATA LCD-MF223XS(流用)
※HDMI 接続
0 円
ゲームコントローラーLogicool F310r(流用)0 円





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 未満の環境では長いパスは動作しないが短いパスなら動作する。


月別アーカイブ
記事検索
最新コメント
  • ライブドアブログ