C#で作るフォルダ監視サービス

2006-02-07
このエントリーをはてなブックマークに追加

これまでWindows サービスを作るにはC++の知識が必須でしたが、.NETのおかげでかなり開発しやすくなりました。(処理速度的にどうよ、2000serverで動かないケースもあるよ、というのは置いといて)

まずは、フォルダの状態監視ツールでも作ってみましょう。

using System.IO;
//状態監視の宣言
Private FileSystemWatcher fileWatcher = new FileSystemWatcher();

Protected override void OnStart(strings[] args)
{
    //監視対象のディレクトリを指定
    fileWatcher.Path = @”E:¥watch_test”;

    //フォルダサイズが変わったらイベントを起こす
    fileWatcher.NotifyFilter = (NotifyFilters.Size);

    //起こすイベントの定義
    fileWatcher.Changed += new FileSystemEventHandler(OnChanged);

    //監視を有効にする
    fileWatcher.EnableRaisingEvents = true;
}

Public static void OnChanged(System.Object source,FileSystemEventArgs e)
{
    //これが変更時に起きるイベント
}

あくまでサンプルです。こんなチンケなことしかできないわけではありません。
もっと多くのことが監視できます。ま、さわりです。

ファイル単位で監視したり、フォルダも多くのイベント、状態を監視できます。
わずか数行のコードでこれだけのことができるのですから、すごいですね。

Tags:

ASP.NETでクライアントサイドにランタイムでJavaScriptを書き出す方法

2006-02-07
このエントリーをはてなブックマークに追加

クライアントサイドにランタイムでJavaScriptを書き出す方法です。別に「Response.Write」で書き出してもいいのですが、こっちのほうがスマートのような気がします。

//クライアントサイドにアラートを出す
RegisterClientScriptBlock(“client”, “<script language=’JavaScript’> alert(‘RegisterClientScriptBlock’) </script>”);

RegisterStartupScript(“client”, “<script language=’JavaScript’> alert(‘RegisterStartupScript’) </script>”);

「RegisterClientScriptBlock」で書き出すと、Formの開始タグの直後に出力されます。
「RegisterStartupScript」の場合はFormの終了タグの直前です。

書き出すタイミングが違うということは、クライアントサイドで実行されるタイミングも違う為、使い分けると色々と便利です。
サンプルではalertしか出してませんが、メソッドをaspxページに用意しておき必要なときにコールする等、用途は色々です。

Tags:

XSLTを使ってXMLをCSVに変換する

2006-02-06
このエントリーをはてなブックマークに追加

業務アプリとかになると、色々な集計結果をCSVで出力する機能が要求されることが多いです。多いっていうか、ほとんどの場合あります。

.NETのDataSetは、XMLへの変換はメソッドを呼ぶだけで簡単にできるのですが、CSVへの変換はサポートしていません。これをなんとか効率的にやりたいなぁ、と思い、色々調べてみました。

<xsl:stylesheet xmlns:xsl=”http://www.w3.org/1999/XSL/Transform” version=”1.0″>
<xsl:template match=”NewDataSet”>
<xsl:apply-templates select=”Table” />
</xsl:template>
<xsl:template match=”Table”>
<xsl:value-of select=”Column_A” />,<xsl:value-of select=”Column_B” />,<xsl:value-of select=”Column_C” />
</xsl:template>
</xsl:stylesheet>

上記内容のXSLTファイルを作成します。XSLTとは、XSLT(XSL Transformation)でして、まぁ、XMLの変換テンプレートと思ってください。これを、hoge.xsltという名前で保存しておきましょう。

System.Xml.Xsl.XslTransform xslt = new System.Xml.Xsl.XslTransform();
xslt.Load(@”C:hoge.xslt”);

System.Xml.XmlDocument doc = new XmlDocument();
doc.Load(@”C:hoge.xml”);

System.Xml.XmlTextWriter csvWriter = new XmlTextWriter(@”C:hoge.csv”,System.Text.Encoding.GetEncoding(“Shift-JIS”));
xslt.Transform(doc.CreateNavigator(),null,csvWriter,null);
csvWriter.Close();

このサンプルはXMLファイルを読み込んで、それをCSVに変換してC:hoge.csvというファイル名で出力しています。

XSLTをみていただければわかるとおり、Column_A、Column_B、Column_Cというフィールドだけが出力されます。つまり、出力するCSVごとにXSLTが必要になります。フォーマットが決まっているのなら、まったく問題ないと思います。

このやり方は、速いです。1万件(フィールド数20件ほど)のXMLの変換に4~5秒でした。

Tags:

CSVファイルをダウンロードさせる方法

2006-02-03
このエントリーをはてなブックマークに追加

System.IO.MemoryStream ms = new System.IO.MemoryStream(System.Text.Encoding.GetEncoding(“Shift-JIS”).GetBytes(strBuffer));

Response.AddHeader(“Content-Disposition”,”attachment;filename=total.csv”);
Response.ContentType = “application/octet-stream”;
Response.BinaryWrite(ms.ToArray());
Response.End();

MemoryStreamが、実際のデータです。
「strBuffer(string型)」にダウンロードさせるCSVデータを突っ込んでおいて、それをMemoryStreamに乗せて吐き出すといったイメージですね。

別にサーバサイドでファイル生成して、それをダウンロードさせてもいいのですが、こっちの方がファイルIOもなく、ゴミも残らないのでスマートかと思われます。

Tags:

ASP.NETでJavaScriptのconfirmを表示し、処理を分岐させる方法

2006-02-01
このエントリーをはてなブックマークに追加

ポストバックでイベントを起こすASP.NETの場合、JavaScriptでconfirmを出して「確認」→「分岐」という流れを作る場合はどうしたらよいだろうと悩んで、調べてみました。

//Page_Loadで属性の追加をする
public void Page_Load(object sender, EventArgs e)
{
    Button1.Attributes[“onclick”]=”return confirm(‘クリックしたの?’);”;
}

//confirmでtrueが返ってきたらこのイベントが呼ばれる
private void Button1_Click(object sender, System.EventArgs e)
{
    RegisterStartupScript(“client”, “< script language=’JavaScript’> alert(‘クリックされちゃった’) < /script> “);
}

かなり割愛してますが、必要なコードはこんな程度です。
Page_LoadでButton1というコントロールに属性を追加しておくだけです。あとは勝手に分岐処理を記述してくれます。

aspx側のボタンコントロールにonclickを直接記述したらエラーが出てしまいました。まぁ、onclickはポストバックイベントが動的に記述されるので、当然といえば当然の結果か。
もっとスマートなやり方もありそうだけど、とりあえずこんな感じで。

Tags: