C#でdirコマンドの出力を整形してみた

Windowsのコマンドプロンプトのdirコマンドの出力を、C#を使って整形してみました。

目次

  1. 背景と目的
  2. 方針
  3. コード
  4. 試してみた

背景と目的

前の投稿の続きです。 dirコマンドの出力結果というのは、ある程度フォーマットが定まったテキストですので、集計しやすいようにCSV形式に整形してみます。 Linuxの人ならawkとかpearlとかpythonとか使うのでしょうが、Windowsだとそういうわけにもいきません。いや、Pythonはインストールしてたりしますが、特段慣れ親しんでいるわけでもありません。せっかくVisual Studioをインストールしてたりしますので、C#で整形してみたいと思います。

方針

ファイル入出力は面倒なので、コマンドラインアプリにして、パイプを使ってdirコマンドの結果を入力するようにします。 dirコマンドのオプションは下記です。

dir /s /a-d /-c

コード

using System;
using System.IO;
using System.Text.RegularExpressions;

namespace ParseDirOutput
{
    class Program
    {
        static void Main(string[] args)
        {
            // 標準入力から読み取り
            TextReader stdinText = Console.In;
            string text = stdinText.ReadToEnd();

            // 文字列抜き出し
            MatchCollection matches = Regex.Matches(text, @"([A-Za-z]:\\.*?)\sのディレクトリ.+?個のファイル.+?(\d+?)\sバイト", RegexOptions.Singleline);

            // 出力
            foreach (Match c in matches)
            {
                Console.WriteLine("\"" + c.Groups[1].Value + "\", " + c.Groups[2].Value);
            }

        }
    }
}

とっても単純ですね。foreachを使うのも慣れてきました。 正規表現でディレクトリパスからファイルサイズの合計値までを読み取って、検索結果からさらにGroupsを使ってディレクトリパスとファイルサイズだけを抜き出しています。 dirコマンドで取得するディレクトリパスですが、Windows8.1でもPCによってドライブレターが大文字だったり小文字だったりします。Windowsならではの曖昧さですね。

試してみた

早速試してみました。 dirコマンドの出力が下記だったとします。

 ドライブ C のボリューム ラベルは Windows です
 ボリューム シリアル番号は 8AAA-A8AA です

 c:\ のディレクトリ

2014/10/22  18:12               206 ALC880.log
2014/03/18  19:01            398356 bootmgr
2013/06/18  21:18                 1 BOOTNXT
2016/04/25  22:20        1409286144 pagefile.sys
2016/04/21  23:06                 0 Recovery.txt
2016/04/25  22:20         268435456 swapfile.sys
               8 個のファイル          4635151754 バイト

 c:\Program Files のディレクトリ

2013/08/23  00:35               174 desktop.ini
               1 個のファイル                 174 バイト

 c:\Program Files\Common Files\microsoft shared\ink のディレクトリ


2014/07/24  20:52           1040384 TipRes.dll
2013/08/22  20:44             21504 tipresx.dll
2014/10/29  09:47           2923520 tipskins.dll
2014/10/29  10:04            679936 tiptsf.dll
2014/10/29  11:41            109056 tpcps.dll
              71 個のファイル            58133933 バイト

 c:\Program Files\Common Files\microsoft shared\ink\ar-SA のディレクトリ

2014/03/18  19:01              7168 tipresx.dll.mui
               1 個のファイル                7168 バイト

 c:\Program Files\Common Files\microsoft shared\ink\bg-BG のディレクトリ

2014/03/18  19:01              7680 tipresx.dll.mui
               1 個のファイル                7680 バイト

     ファイルの総数:
           185091 個のファイル         52617970264 バイト
               0 個のディレクトリ    203715420160 バイトの空き領域

そうすると、作ったアプリの出力は下記になります。

"c:\", 4635151754
"c:\Program Files", 174
"c:\Program Files\Common Files\microsoft shared\ink", 58133933
"c:\Program Files\Common Files\microsoft shared\ink\ar-SA", 7168
"c:\Program Files\Common Files\microsoft shared\ink\bg-BG", 7680

ちゃんと抜き出せてますね。 あとはどう集計しよう。 試した環境は下記です。

  • Windows 8.1

  • Visual Studio 2015 Express for Windows Desktop

公開日

広告