2015年9月2日水曜日

System.IO.Directory.Deleteの不思議現象

1.フォルダを削除
2.フォルダを作成

として、一括でフォルダをクリアしたいときってあるよね。

以下のコードを実行したところ、フォルダが作成されない現象に陥った。


if(Directory.Exists(path))
{
    Directory.Delete(path, true);
}

Directory.CreateDirectory(path);


//ここでフォルダが存在しない



VSをデバッグで1行ずつ進めると、きっちり削除されて作成される。



以下のように変更してみた。 


if(Directory.Exists(path))
{
    Directory.Delete(path, true);
}

Int32 n = 0;

while(Directory.Exists(path))
{

    n++;
}


Console.WriteLine(n);

Directory.CreateDirectory(path);
 //こうすると確実に作成される。
//nは2とか1とかになる。

普通に考えるとDelete()が実行された時点でpathのフォルダは存在しないはず
なので、n==0になると思ったが、n==2となり、2ループ分path存在したことを示している。

この現象は別のPCでは発生しない場合もある。 

調べてみたところ、MSDNに書いてあった。

MSDN Directory.Delete メソッド (String, Boolean) 

In some cases, if you have the specified directory open in File Explorer, the Delete method may not be able to delete it.
ある場合において、あなたが指定したディレクトリをエクスプローラーで開いていると、Deleteメソッドは、削除することができない場合があります。

ガ━━(;゚Д゚)━━ン!!

たしかに、エクスプローラーで該当フォルダを開きながら 実行していた。
エクスプローラーを閉じて、下のプログラムを実行するとnの結果は0となった。

ていうか”ある場合”って何よ。
そこをハッキリしなさいよ!

2015年8月27日木曜日

MSDTCでトランザクション処理の設定

WCF net.tcpで、TransactionScopeを利用してトランザクション処理を行った。

ローカル開発環境(WcfSvcHost.exeでのホスト)では正常に処理されるが、
別サーバーのIISでホストさせ、クライアントからアクセスすると、以下のエラーが発生した。

System.ServiceModel.ProtocolException:フローされたトランザクションのマーシャリングを解除できませんでした。次の例外が発生しました:パートナートランザクションマネージャにより、リモートトランザクションまたはネットワークトランザクションのサポートが無効にされました。(HRESULTからの例外: 0x8004D025)

これを回避するには、サーバー、クライアント両方のDistributed Transaction Coodinatorの設定を変更しないといけない。

・dcomcnfg > コンポーネントサービス > マイコンピューター > Distributed Transaction Coodinator > ローカルDTC > プロパティ > セキュリティタブを開く。

・ネットワークDTCアクセスをON
・トランザクションマネージャー通信(受信を許可、送信を許可)をON

これで適用する。

そして、Windowsファイアウォールの詳細設定で以下を有効にする。

<受信の規則>
・分散トランザクションコーディネーター(RPC)
・分散トランザクションコーディネーター(RPC-EPMAP)
・分散トランザクションコーディネーター(TCP受信)

<送信の規則>
分散トランザクションコーディネーター(TCP送信)

2015年8月18日火曜日

WCF構成エディタの場所

【.Net3.5】
c:/Program Files/Microsoft SDKs/Windows/v7.0A/bin

【.Net4.0】
c:/Program Files/Microsoft SDKs/Windows/v7.0/bin/NETFX 4.0 Tools

SrvConfigEditor.exe

2015年1月19日月曜日

Debug Diagnostic Toolの設定

・前記事で行った内容

 Debug Diag Collectionを起動

  ⇒Add Rule
    Performance
    Performance Counters
  ⇒Add Pref Triggers
    W3SVC_W3WPを選択
    ⇒対象のアプリケーションプールを選択
     追加
  ⇒Select Performance Countersの画面
    リストを全選択
  ⇒Edit Threshold
    Above
    1
    1
  ⇒Select Dump Targetsの画面
    Add Dump Target
    All active IIS/COM+ related processes

こんな感じ

Debug Diagnostic Tool

IIS上でw3wp.exeがcpuに高負荷をかける現象について

IIS Worker Process(アプリケーションプールのw3wp.exe)
がCPUを100%使用してしまう現象について。


何も特に処理を実行していないのに
w3wp.exeのCPU使用率が15%~25%程度動いたままであった。

MicrosoftのDebug Diagnostic Toolを使用して
プロセスの状態をダンプしたところ

Oracle.DataAccess.Client.OracleTuningAgent.DoScan()
Oracle.DataAccess.Client.OracleTuningAgent.TuningFunction()

が、動いているように出てきた。

それを基に以下を参照した。

Oracle 11g 11.2.0.1の64bit版の不具合らしい。
11.2.0.2で解消されているとのことだが

プログラムのConnectionStringに以下を
追加することで解決した。

SelfTunig = false

2014年10月16日木曜日

NetworkServiceが共有フォルダにアクセスするときのアクセス権

NETWORK SERVICEはコンピューターアカウントで、ネットワークリソースに
アクセスするため、共有フォルダの共有アクセス権限は、コンピューター名になる。

⇒共有アクセス権限の設定
⇒ユーザー、コンピューター、サービスアカウントまたはグループの選択
⇒オブジェクトの種類
⇒コンピューターのチェックをON
⇒入力欄にNETWORK SERVICEが稼働するコンピューター名を入力 


http://msdn.microsoft.com/ja-jp/library/cc759279%28v=ws.10%29.aspx

2014年10月2日木曜日

メイリオのアンチエイリアス

Windows7

システムの詳細設定
パフォーマンス
視覚効果
スクリーンフォントの縁を滑らかにする

で変更できる。