C#でdirコマンドの出力を整形してみた
Windowsのコマンドプロンプトのdirコマンドの出力を、C#を使って整形してみました。
目次
背景と目的
前の投稿の続きです。 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
公開日
広告
C#で作ってみたカテゴリの投稿
- C#でExcelの表のコピーをMarkdownに変換するアプリを作ってみた
- C#でHello Worldしてみた
- C#でMVVMアプリを作ってみる
- C#でMVVMパターンのアプリを作ってみた(Microsoft.TeamFoundation.Controls無し編)
- C#でWPFでHello worldしてみた
- C#でdirコマンドの出力を整形してみた
- C#で作った特許情報の入力を補助するツールをちょっと直してみた
- C#で数式を中置記法から後置記法(逆ポーランド記法)に変換してみた
- C#で正規表現を試すツールを作ってみた
- C#で特許情報の入力を補助するツールを作ってみた
- C#で画像のHSBを抽出して描くツールを作ってみた
- C#で画像をグレースケールや半透明に変換するアプリを作ってみた
- テキストファイルをCSV形式に変換するツールを作ってみた