STAP STAP

STAP = (動詞)スタップする、カシャカシャする(造語)
 

スポンサーサイト 

No. : --/--/--(--) --:--:--
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

C# で Zip を扱ってみる [ DotNetZip ] 

No.324 : 2009/01/19(Mon) 20:40:44
修羅場ってるときこそ更新したくなるのは理不尽。
転送するファイルをアーカイブするのに、アーカイブ方法として ZIP を選んだんですが、
C# だといまいち ZIP は扱いづらいみたいです。
J# のライブラリや SharpZipLib を使う方法があるみたいですが、どちらもバグが多いらしい。
ってことで使ってみました DotNetZip

使い方
1)右側にある Download をクリック
2)DevKit をダウンロード(インテリセンス用のXMLファイルとかヘルプが入ってる)
3)Ionic.Utils.Zip.dll を参照に追加(XMLファイルなどは自動で読み込まれます)
4)コードをおもむろに書き始める。

using System;
using System.Text;
using System.IO;
using Ionic.Utils.Zip;

string dirPath = "D:\\Test";
string savePath = dirPath + ".zip";

// D:\Test (ディレクトリ)を圧縮
using(ZipFile zip = new ZipFile(savePath))
{
zip.ForceNoCompression = true;
zip.Encoding = Encoding.GetEncoding("shift-jis");
zip.AddDirectory(dirPath);
zip.Save();
}

// 展開用のディレクトリを作成
Directory.CreateDirectory("D:\\ExtractTest");

// D:\Test.zip を展開
using (ZipFile zip = ZipFile.Read(savePath, Encoding.GetEncoding("shift-jis")))
{
foreach (ZipEntry e in zip)
{
e.Extract("D:\\ExtractTest");
}
}


使い方はこんな感じ。非常に簡単。
Encoding は Shift-JIS にしておかないとファイル名に日本語が含まれる場合に文字化けするようです。
当たり前ですが、ファイル名に日本語が含まれて居なければ、ファイルの中身に日本語を含んでいても大丈夫です。

ところで、圧縮率の設定を探してみたけどよくわかりませんでした。もしかして設定できない?
スポンサーサイト

接続相手のIPアドレスとポート番号を取得する 

No.323 : 2009/01/19(Mon) 14:13:50
TCP通信するプログラムを書いてて気付いたので。
今まで TcpListener でリッスンしてるときに接続してきた相手の IP Address とポート番号を取得するには、
TcpListener.AcceptSocket() でソケットを取得して Socket.RemoteEndPoint を得るしかないと
思っていたけど、
実は TcpClient.Client で基になるソケットを取得できることを最近知った。


using System;
using System.Net.Sockets;

TcpListener listener = new TcpListener(IPAddress.Any, 80);
listener.Start();

using(TcpClient tcpcon = listener.AcceptTcpClient()){
    IPEndPoint ipep = (IPEndPoint)tcpcon.Client.RemoteEndPoint;
    Console.WriteLine(String.Format("Remote IP Address > {0}:{1}"
        ,ipep.IPAddressipep.Port));
}
listener.Stop();


TcpClient の方が扱いが楽なので助かる

リストから重複する値を取り除く 

No.320 : 2008/12/31(Wed) 02:51:32
List で保持しているデータに重複がある場合、それを取り除いて重複を無くすサンプルです。
色々な方法があるようですが、Dictionary クラスを用いたこのやり方はシンプルだと思います。
Dictionary クラスがハッシュテーブルであるから実現できるのですね。


public static void RemoveDuplicateKey<T>(List list)
{
var dic = new Dictionary<T, int>();
foreach (T temp in list)
{
dic[temp] = 1;
}
list.Clear();
foreach (T key in dic.Keys)
{
list.Add(key);
}
}


var はC#3.0 からの新機能・型推論ですね。
並び順は変わっちゃうかもしれません。

マーシャリングではまる 

No.317 : 2008/12/20(Sat) 17:11:29
今 Sinku.dll を C# から使おうと努力してるんですが…
Sinku.dll はネイティブで書かれた DLL ですから、マネージド環境から使おうと思ったら
一工夫いるわけです。
まぁ C# のシの字くらいまでしか分かってない俺が挑戦したわけですが、マーシャリングで
はまりましたorz

Sinku.dll には FILE_INFO という構造体があって、その中に動画情報が格納されます。
FILE_INFO 構造体は

typedef struct {
char name[STR_MAX_LENGTH]; //IN : ファイル名
int type; //IN/OUT : ファイル種別
char container[32]; //OUT : コンテナ名(ある場合のみ)
char error[STR_MAX_LENGTH]; //OUT : エラー(ある場合のみ)
char video[VA_MAX_STREAM_COUNT][STR_MAX_LENGTH]; //OUT : 映像の詳細
int video_count; //OUT : 映像の詳細の数
char audio[VA_MAX_STREAM_COUNT][STR_MAX_LENGTH]; //OUT : 音声の詳細
int audio_count; //OUT : 音声の詳細の数
char extra[EX_MAX_STREAM_COUNT][STR_MAX_LENGTH]; //OUT : 付属情報
int extra_count; //OUT : 付属情報の数
double playtime; //OUT : 再生時間(秒)
unsigned __int64 size; //OUT : ファイルサイズ
} FILE_INFO;


こうなっています。
マーシャリングではまったのが 3 つある二次元配列。
ここには最大 10 個のビデオとオーディオのストリームに関する情報が格納されます。
extra は MPEG2-TS かなんかに使うみたいで、最大 5 個です。
これをどうやってもクリアできない。

char の一次元配列(要するに文字列)は

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = STR_MAX_LENGTH)]
public string Name;

などとすればOKです(STR_MAX_LENGH は Sinku.h に書いてありますが 512 です)。
でも二次元配列はさっぱり。
ArraySubType に Unmanaged.LPTstr とか色々入れてみましたが、Type なんちゃら Exception でそんなの使えないぞゴルァとか深刻そうな Exception 等が発生してお手上げ状態。
あきらめて以下のようにしました。

[MarshalAs(UnmanagedType.ByValTStr, SizeConst = STR_MAX_LENGTH)]
public string Video1;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = STR_MAX_LENGTH)]
public string Video2;
・・・
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = STR_MAX_LENGTH)]
public string Video10;

強引な力技です。配置さえあってりゃいいんですよ!HSP で構造体を扱うときもそうでした。

まぁコンテナ名や長さの取得はできましたが上に書いた Video や Audio の値は「C空VIDEO」や「C空LAME」などという謎文字列になってしまったので・・・謎です。

まぁ今回は PlayTime が取得できれば良しなのであきらめます。
最後に、「続きを読む」に俺が書いたクソコードを提示しておきます。
C# は深いなぁ。どなたか分かる方いらっしゃいましたら教えてください。


黒羽さんに Sinku.dll を .NET で書き直してもらうのが一番早(ry
▼... Read more ≫

Dictionary クラス 

No.307 : 2008/11/19(Wed) 16:16:12
Dictionary<string,string> から foreach でキーと値のペアを持ってくるやり方。


Dictionary<string,string> dic = new Dictionary<string,string>();

foreach(KeyValuePair kvPair in dic){
Console.WriteLine("key:"+kvPair.Key+" Value:"+kvPair.Value);
}



こんなかんたんでよかったのか(´Д`;)
どうやったらいいか分からずに小一時間かかった。
後で MSDN 見たら


ICollection<KeyValuePair<TKey,TValue>>,
IEnumerable<KeyValuePair<TKey,TValue>>



ってなってて、一気に理解したような気がした。
こういうすごいことできるのになぜ ListView のオーナードローのバグ直さないのだろうか MS は。
| HOME |

calendar

S M T W T F S
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -
06« 2017/07 »08

Profile

エイチム

Author:エイチム
programmingに
興味を示す高専生

Diary

Recent Comments

Archives

Category

Link

このブログをリンクに追加する

RSS


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。