C#初心者です。

バイナリファイルをダンプしてイメージヘッダ等を構造体に入れて
各フィールド単位で操作したいのですが、最も簡単な方法はありますか?

このQ&Aに関連する最新のQ&A

A 回答 (3件)

MSDNに目を通しましょう。


全部書いてありますよ。


C#を2、3年ほど書いてないのでなんとなくです。


public class BITMAPFILEHEADER
{
public ushortbfType;
public uintbfSize;
public ushortbfReserved1;
public ushortbfReserved2;
public uintbfOffBits;

public void Read(BinaryReader b)
{
bfType= b.ReadUInt16();
bfSize= b.ReadUInt32();
bfReserved1= b.ReadUInt16();
bfReserved2= b.ReadUInt16();
bfOffBits= b.ReadUInt32();
};

public void Write(BinaryWriter b)
{
b.Write(bfType);
b.Write(bfSize);
b.Write(bfReserved1);
b.Write(bfReserved2);
b.Write(bfOffBits);
}
}
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
見よう見まねでクラスを作って試してみたら結構簡単に出来ました。
こちらの方がややこしくなくていいですね。しかも想定外のC#での初自作クラスも経験できたのでよかったです。

でもMSDNは初心者にはとっつきにくいです。でももっとよく調べるよう心がけます。
どうもありがとうございました。
この質問はこれで打ち切りにいたします。
回答してくださった両名の方々ありがとうございました。

お礼日時:2009/05/28 22:57

メモリを一括で読み込んでマッピングでできたほうが簡単そうには見えますけども。


BinaryReaderで、構造体に素直に読み込むのがいいのでは?
    • good
    • 0
この回答へのお礼

こんにちは、BinaryReader を調べたのですが、VBのサンプルしか出てこなかったのでうまくイメージできません。
この方法だとunsafeでなくもっと簡単に出来るのでしょうか?

お礼日時:2009/05/27 20:48

 こんにちは。


 C言語等に良く有る、構造体のポインタに向かってfread()する様な感じと言う事でしょうか。

 以下のURLに、配列や構造体をポインタにキャストしてコピーしているコード等が色々と記載されています。
 http://d.hatena.ne.jp/Schima/20090512/1242139542

 上記を参考に、以下を試してみましたが、ちゃんと出来る様です。ソリューションの設定にある「アンセーフコードの許可」にチェックを入れて下さい。
 
//19バイトの構造体
[StructLayout(LayoutKind.Sequential, Pack=1)]
public struct PERSON
{
unsafe public fixed byte pszName[16];//名前
public byte fAge;//年齢
public ushort wAddress;//住所番号
}

private void Form1_Load(object sender, EventArgs e)
{
//バイナリファイルオープン
System.IO.FileStream fileStream = new System.IO.FileStream("test.bin", System.IO.FileMode.Open);
int fileSize = (int)fileStream.Length;

//ファイルからバッファにデータを吸い上げる
byte[] buffer = new byte[fileSize];
fileStream.Read(buffer, 0, fileSize);

//バッファから構造体に向かってメモリコピー
PERSON person = new PERSON();
unsafe
{
Marshal.Copy(buffer, 0, new IntPtr(&person), fileSize);
}

fileStream = null;
}
    • good
    • 0
この回答へのお礼

こんな漠然とした質問に回答ありがとうございます。
やりたかったのは、まさにこの通りです。

以下のような感じで出来ることを確認できました。

public struct sImageHeader
{
// 全部で20byte
unsafe public fixed byte Machine[2];
unsafe public fixed byte NumberOfSections[2];
unsafe public fixed byte TimeDateStamp[4];
... 略
}

byte[] buffer = new byte[20];
fileStream.Read(buffer, 0, 20);


sImageHeader sih = new sImageHeader();
unsafe
{
Marshal.Copy(buffer, 0, new IntPtr(&sih), 20);
}

構造体のメンバをstring型に入れなおそうとすると、unsafe領域でないと駄目みたいなことを言われました。
unsafe ということで色々制約があるようですね、もっと勉強します。

どうもありがとうございました。

お礼日時:2009/05/27 20:45

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q条件によって構造体のリスト構造を変えたい

こんにちは。

C(C++)で構造体を使っているのですが、まだまだ未熟で使い方が良く分かりません。以下のことを実施したいのですが、やり方をどなたかご教授頂けませんでしょうか。よろしくお願いします。

条件によって構造体のリスト構造を変えたいのです。
例えば、
条件1の場合は
構造体a→構造体b

条件2の場合は、
構造体a→構造体c

上記のようにです。そして構造体のルートから参照先をたどっていくことで、配下の構造体の値を取得したいのです。

文法上許されないようですが、イメージとしては、
struct a aa;
aa.c->b.aa

ということをしたいのです。よろしくお願いします。

struct a{
char a;
char b;
struct c;
:
};

struct b{
char aa;
:
};

struct c{
:
:
};

Aベストアンサー

一番手っ取り早いのは、構造体aの中に、構造体bと構造体cの両方のポインタを持たせておいて、使わない側にはNULLを入れるといった方法でしょうか。

struct a
{
 /* .bまたは.cのNULLではない方が有効 */
 struct b *b;
 struct c *c;
};

他には、構造体aと構造体bの最初のフィールドの型を同じにしておいて、そこにaかbかを判別できる値を格納するようにし、構造体aと構造体bの共用体へのポインタを構造体aに持たせるといった方法です。

struct b
{
 char tag; /* 'b'を格納 */
 ...
};

struct c
{
 char tag; /* 'c'を格納 */
 ...
};

struct a
{
 union
 {
  struct b;
  struct c;
 } *p; /* .p->b.tagが'b'なら構造体b, 'c'なら構造体c */
};

好みかもしれませんが、私なら多分前者を使います。

一番手っ取り早いのは、構造体aの中に、構造体bと構造体cの両方のポインタを持たせておいて、使わない側にはNULLを入れるといった方法でしょうか。

struct a
{
 /* .bまたは.cのNULLではない方が有効 */
 struct b *b;
 struct c *c;
};

他には、構造体aと構造体bの最初のフィールドの型を同じにしておいて、そこにaかbかを判別できる値を格納するようにし、構造体aと構造体bの共用体へのポインタを構造体aに持たせるといった方法です。

struct b
{
 char tag; /* 'b'を格納 */
 ...
};
...続きを読む

QC#で配列のフィールドを取得したい

C#2.0を試用しています。

次のような書き方ではプリミティブ型は取得できるのですが、
配列のフィールドは取得できないので、
なんとかして取得する方法はないのでしょうか?

public class MasterClass
{
 public int a = 2;
 public int[] b = new int[] { 1, 2 };//←取得できない
}

Object obj = new TestClass();
Type type = obj.GetType();
foreach (FieldInfo fi in type.GetFields())
{
 object tmp = fi.GetValue(obj);
 Console.WriteLine(fi.Name + ":" + tmp);
}
System.Console.ReadLine();

Aベストアンサー

配列かどうかは tmp.GetType().IsArrayで判断できますよ

foreach (FieldInfo fi in type.GetFields())
{
  object tmp = fi.GetValue(obj);
  if ( tmp.GetType().IsArray )
  {
    int n = 0;
    foreach( object temp in (Array)tmp )
    {
      Console.WriteLine(fi.Name + "[" n "]:" + temp);
      n++;
    }
  }
  else
  {
    Console.WriteLine(fi.Name + ":" + tmp);
  }
}
といった具合で

Q構造体リストの使い方について

こんにちは。
断片データを受取ってから一旦復帰し、再びデータが送られ、全てのデータを受取った後に今まで受取った断片データを全てソートしたものを返却する関数を作成しようとしています。
 断片データを保存する際には、動的に構造体領域を確保して実現しようと考えています。
まず、受け渡されるデータの形式は以下のようなものです。

グループA{A1,A2,A3…要素の数は可変}
グループB{B1,B2,B3…要素の数は可変}
グループC{C1,C2,C3…要素の数は可変}

グループの数は可変

※グループの数と要素の数は、実際に受け渡されたデータの中身を見ないと分からない。

受け側では、まず
1.グループは新規グループか?
を判定する。
 ・新規グループなら、新規要素分の領域を動的確保し、新規構造体リストへ登録する。
 ・既存グループなら、新規要素分の領域を動的確保し、対象となる構造体リストへリンクする。

2.グループの要素を全て受取ったら
 ・構造体リスト内のデータをソートし、リンクを張りなおす。

上記1.2処理を、グループ全てを受取るまで繰り返す。

[質問内容]
1.グループが1つの場合は、1つの構造体を自己参照構造体にし、受け渡されるデータを次々と動的領域確保及び設定にて実現できそうなんですが、グループの数が可変のため、どう制御すればよいのか分かりません。仮に、グループ全体を管理するテーブル領域のようなものを用意し新規グループが発生するたびに、管理テーブルへ登録するというようなやり方は問題ないのでしょうか。また問題ない場合は、管理テーブルで可変領域を確保するにはどうすればよいのでしょう
か。

2.1つの構造体リスト内をソートするアルゴリズムを記載したサイトなどありましたら、教えてください。

以上、説明不足のところもあるかもしれませんが、よろしくお願いします。

こんにちは。
断片データを受取ってから一旦復帰し、再びデータが送られ、全てのデータを受取った後に今まで受取った断片データを全てソートしたものを返却する関数を作成しようとしています。
 断片データを保存する際には、動的に構造体領域を確保して実現しようと考えています。
まず、受け渡されるデータの形式は以下のようなものです。

グループA{A1,A2,A3…要素の数は可変}
グループB{B1,B2,B3…要素の数は可変}
グループC{C1,C2,C3…要素の数は可変}

グループの数は可変

※グループの数と要素...続きを読む

Aベストアンサー

1.構造体リストへのポインタのリストで、グループを管理します。
・新規グループの場合、新しく構造体リスト用のメモリをmallocで確保します。確保したメモリに受け取ったデータを保存します。
確保したメモリのポインタを保存するために、構造体リストへのポインタをreallocで追加確保します。
新しく追加できたメモリに先にmallocしたメモリのポインタを保存します。

・既存グループの場合、必要なメモリを追加した要領でreallocすれば、後ろに空きメモリができますので、そこに受け取ったデータを保存します。



2.構造体リストが、リンクリストではなく、単純リストの場合、qsortが使用できます。
構造体用のコンペア関数をつくり、
qsortで、構造体のポインタ、構造体1個のサイズ、構造体のソートしたい個数、先に作った構造体用のコンペア関数のポインタを渡せば、ソートできます。

リンクリストの場合、ソートするまでもなく、レコード挿入の操作が可能なため、ソートする必要はないと思います。

QC#でHTML操作

C#でhtmlの操作について困っています。教えてください。
<input type=text name=name value="">
↑HTMLでこういうテキストボックスがあったとします。

ここに「English」という入力したいとき。
C#では
foreach (HtmlElement pageElement in webBrowser1.Document.All)
{
if (pageElement.GetAttribute("name") != "name") continue;
pageElement.SetAttribute("value", "English");
break;
}

とすれば入力されました。

でも日本語を入れると文字化けして入力されます。
たぶんC#はユニコードでホームページはEUCだからだと思います。
どうすればいいですか。

Aベストアンサー

>たぶんC#はユニコードでホームページはEUCだからだと思います。
>どうすればいいですか。

HTMLのエンコードを指定してやればいいかと思いますよ。

Qリストビュー ⇔ 別ファイル構造体 の実現方法

VC++6.0、Win32 APIを用いて作成しているダイアログボックスを表示するアプリについてです。

パターン(パターン1~3までの3種類)が格納される列と、文字列(最大256バイト)が
格納される列の2列からなるリストビューがあります。

そのリストビューに新しい情報(行)を追加するたびに、その該当行の情報を
別ファイル(設定ファイル)の構造体に格納し、リストビューの変更・削除があれば、
その都度構造体を更新し(?)反映させたいです。
メモリも無駄なく、効率的に使いたいです。

また次回以降そのアプリを起動させる際には、設定ファイルの内容を読み込んでリストビュー
の表示に反映させたいです。

正直、構造体は苦手なため解らないことだらけなのですが、パターンを格納するint型の変数と
文字列を格納する固定長256byteのchar型配列の変数が必要なのではと思っています。
後は、レコード数を格納するヘッダーも必要なのでしょうか・・・
メモリの取得、開放、移動方法はいまいち分かりません。

現在は、ラジオボタン(パターン用)とエディットボックス(文字列用)を用いて、
リストビューに登録するところまでは出来ています。
変更や削除の機能も実装出来ています。

上記の処理を実現させるための詳細な流れを教えてください。
サンプルコードも載せて頂けると幸いです。
分かりにくい文章で申し訳ありませんが、よろしくお願い致します。

VC++6.0、Win32 APIを用いて作成しているダイアログボックスを表示するアプリについてです。

パターン(パターン1~3までの3種類)が格納される列と、文字列(最大256バイト)が
格納される列の2列からなるリストビューがあります。

そのリストビューに新しい情報(行)を追加するたびに、その該当行の情報を
別ファイル(設定ファイル)の構造体に格納し、リストビューの変更・削除があれば、
その都度構造体を更新し(?)反映させたいです。
メモリも無駄なく、効率的に使いたいです。

また次...続きを読む

Aベストアンサー

★データ数が100個ですか。
・それなら全データの書き出しで良いでしょうね。
 どうせデータ入力を人間が行い『追加』、『更新』、『削除』ボタンを押すだけの
 使い方なのでしょ。ボタンを離したら瞬時に書き出しも終了していますよ。
・また、読み込みはプログラムの起動時に1回だけ行えば良いです。
 あとはリストビューにデータがありますので操作のたびにファイルに書き出すだけで
 データを一致させられます。
・よって作成する関数は2つです。
 1つ目はファイルからリストビューに読み込む関数。
 2つ目はリストビューからファイルに書き出す関数。
 プロトタイプを載せると
 (1)BOOL readFile( HWND hDlg, INT nID, LPCTSTR lpFname[] );
 (2)BOOL writeFile( HWND hDlg, INT nID, LPCTSTR lpFname[] );
 とまります。引数は
 HWND hDlg…ダイアログのウインドウハンドル
 INT nID……リストビューのID
 LPCTSTR lpFname[]…ファイル名
 で戻り値は正常なら TRUE、エラーなら FALSE を返す仕様です。
 こんな感じどう。
・ファイル形式は CSV にしましょう。
 そうすれば Excel でやり取りが出来たり、データの確認用としても使えます。
 CSV 形式は各データをカンマ文字(,)で区切っただけのテキストです。
 今回は『パターン番号』、『文字列』の2つをカンマ文字で区切って行単位で読み書きします。
 下にそのサンプルを載せておきます。

サンプル:
// ファイルからリストビューに読み込む
BOOL readFile( HWND hDlg, INT nID, LPCTSTR lpFname[] )
{
 char buff[ 256 ];
 FILE *fp;
 int type;
 int no;
 
 if ( (hDlg = GetDlgItem(hDlg,nID)) != NULL ){
  if ( (fp = fopen(lpFname,"r")) != NULL ){
   for ( no = 0 ; fscanf(fp,"%d,%s\n",&type,buff) == 2 ; no++ ){
    /*
    ★ここでリストビューに追加する処理★
    no:リストビューの行位置を表す(0-99)
    type:パターン番号(1-3)
    buff:固定文字列
    hDlg:リストビューのウインドウハンドル
    ※type のデータ値が 1~3 かチェックする処理を入れても良いかも。
    */
   }
   fclose( fp );
   return TRUE;
  }
 }
 return FALSE;
}

// リストビューからファイルに書き出す
BOOL writeFile( HWND hDlg, INT nID, LPCTSTR lpFname[] )
{
 char buff[ 256 ];
 FILE *fp;
 int type;
 int max;
 int no;
 
 if ( (hDlg = GetDlgItem(hDlg,nID)) != NULL ){
  if ( (fp = fopen(lpFname,"w")) != NULL ){
   max = ListView_GetItemCount( hDlg );
   
   for ( no = 0 ; no < max ; no++ ){
    /*
    ★ここでリストビューから取得する処理★
    no:リストビューの行位置を表す(0-99)
    type:パターン番号(1-3)
    buff:固定文字列
    hDlg:リストビューのウインドウハンドル
    ※type のデータ値が 1~3 かチェックする処理を入れても良いかも。
    */
    fprintf( fp, "%d,%s\n", type, buff );
   }
   fclose( fp );
   return TRUE;
  }
 }
 return FALSE;
}

その他:
・上記のコメント部分にリストビューとのやり取りを記述します。
 readFile() 関数では ListView_InsertItem()、ListView_SetItem() のマクロ関数を
 使って追加していきます。
 writeFile() 関数では ListView_GetItem() のマクロ関数を使って取得します。
・リストビューの設定と取得は別のサブ関数として作っておくと見やすくなります。
 関数のプロトタイプは次のような感じで。
 (1)BOOL setListViewData( HWND hWnd, int no, int pattern, LPCTSTR lpString );
 (2)BOOL getListViewData( HWND hWnd, int no, int *pattern, LPTSTR lpString );
 ※引数の no=行位置、pattern=パターン番号、lpString=固定文字列となります。
 ※戻り値は正常に設定や取得できれば TRUE、エラーなら FALSE を返す仕様です。
・使い方は WM_INITDIALOG の場所で readFile() 関数を1回だけ使います。
 その後は『追加』、『更新』、『削除』ボタンが押されたときの処理に1行だけ
 writeFile() 関数で書き出す行を追加すればよいだけです。

ソート:
・ソートは 100 個の構造体配列を malloc() で確保してその配列にリストビューの
 内容をすべて取り込みます。あとは qsort() 関数で昇順、降順のソートを行ます。
 ソート結果をリストビューのアイテムをすべてクリアしてから再登録するように
 すれば楽に出来ると思います。なので malloc() で確保するときに ListView_GetItemCount()
 でデータ数を取得しておきます。構造体配列のソートは qsrot() 関数と比較関数を
 用意すれば出来上がりです。あとはヘッダの『列』をクリックすればソートできるように
 機能追加すれば良いです。
・以上。

★データ数が100個ですか。
・それなら全データの書き出しで良いでしょうね。
 どうせデータ入力を人間が行い『追加』、『更新』、『削除』ボタンを押すだけの
 使い方なのでしょ。ボタンを離したら瞬時に書き出しも終了していますよ。
・また、読み込みはプログラムの起動時に1回だけ行えば良いです。
 あとはリストビューにデータがありますので操作のたびにファイルに書き出すだけで
 データを一致させられます。
・よって作成する関数は2つです。
 1つ目はファイルからリストビューに読み込む...続きを読む

QC#で構造体配列

C#で構造体配列の操作練習?をしているのですが
using System;
using System.Collections.Generic;
using System.Text;

namespace test1
{
public struct Data
{
public string name; // 名前
public uint value; // 値
}

class read
{
Data[] human = new Data[300];

public static string idSearch()
{
for (int i = 0; i < 300; i++)
{
if (test1.read.human[i].value == 25)
return test1.read.human[i].name;
}
}
}
}
だと
エラー CS0120: 静的でないフィールド、メソッド、またはプロパティ 'test1.read.human' で、オブジェクト参照が必要です。
と言うエラーが出るのですが、どうしてでしょうか?

C#で構造体配列の操作練習?をしているのですが
using System;
using System.Collections.Generic;
using System.Text;

namespace test1
{
public struct Data
{
public string name; // 名前
public uint value; // 値
}

class read
{
Data[] human = new Data[300];

public static string idSearch()
{
for (int i = 0; i < 300; i++)
{
if (test1.read.human[i].value =...続きを読む

Aベストアンサー

>read型のオブジェクトとはどういう意味ですか?

自分で定義しているreadクラスのインスタンスのこと

>ついでにエラーにある「オブジェクト参照」ってのもいまいち分かりません

read型のオブジェクトを生成していないから、参照するオブジェクトが必要ですと言われてる


なんにも勉強しないでコード入力の練習をしても、時間と労力の無駄だし、あまりにも初歩的な質問をしても、回答してくれた人から呆れられて、相手にしてもらえなくなるだけだと思う。本やへ行って自分にあいそうなC#の入門書を買って、クラスとオブジェクトの関係を理解するとこから始めたらいいんじゃなかろうか?

Q構造体のリストをソートしたい。

ある名簿のリストを作りました。
以下のような構造体で、

typedef struct meibo{

char name[10];
int old;
struct meibo *next;

}MEIBO;

これを、ポインタp->next->nameをたどっていって、名前が辞書順になるようにリストを作ったのですが、
これを年齢順にソートして表示させたいんです。
どんな方法があるんでしょうか?
一旦すべてを配列に格納して、クイックソート…とかも考えたのですが、すごく領域をとるし、なんか2度手間(最初から配列に順に格納していけばよかったなぁ・・・と。
それでもやっぱり最初から名列順にするときから配列に入れておくほうがいいのでしょうか?
教えてください。

(最初から年齢を比較してリストを作れば・・ってのはなしで、名列順のリストが存在するものとしてください。)

Aベストアンサー

ソートの方法は既に回答があるので、配列とリストについて。

データ構造として配列を選ぶか,リストを選ぶかは使い方とか目的等によります。
リストを選んだ方がいいケースは、例えばデータの追加、削除が頻繁に発生しデータ数が多い場合です。
具体的に言えば10万のデータがあって、先頭でデータの追加,削除が発生し、データが配列の場合は、99999のデータの移動が生じます。
リストの場合はリンクのつけかえだけですので、
データの移動は発生しません。
この質問の場合は現状ではどちらがいいかはわかりません。

ところで、この場合はクイックソートは向かない気がします。
というのはクイックソートでは比較の結果が同じ場合,
順番が保存されないからです。

例えば,
...
佐藤、10才
鈴木、10才
田中、10才
...
というデータがあった場合、年齢でソートして名前の順番が変わることがあります。

QVC#のフォーム操作に関して

Visual C#初心者ですが、
Windowsフォーム操作のプログラムの勉強をしております。
現在、実施したい内容は、フォーム1上のあるボタンを押下すると、フォーム2が表示されるといったものを作成したいのですが、実際に作成するにはどのようにして良いのかがわかりません。
大変に抽象的な質問となってしまい申し訳御座いませんが、上記の方法をご存じの方いらっしゃいましたら、ご教授お願いいたします。

Aベストアンサー

Form2 frm2 = new Form2();
frm2.Show();

これをボタンのClickイベント内に書けばOKです。

Q構造体でのファイル操作

1 2 3
1 2 3
1 2 3
1 2 3

みたいに書き込まれた
txtデータを構造体でよみこみたいのですけどうまくいきません
プログラムはこんなかんじです
int i=0;
FILE *fp;
fp = fopen("Data.txt","r");
while (fscanf(fp, "%d,%d,%d",a.no[i],a.A[i],a.B[i] ) != EOF){
i++;
}
fclose(fp);

a.noが1列目で
a.Aが2列目で
a.Bが3列目です


Debug assertion failed 
と表示されます
どうしてでしょうか?

Aベストアンサー

既に回答付いていますが…

int a;
scanf("%d",a);

という書き方が問題ない…と思いますか?
この時scanf()に渡されるのは、変数aの値(未初期化なので不定な値)で、scanf()はその不定な値をint型の値を格納するアドレスとして使います。
# "%d"で指定されていますからね。

さて、あなたのコードはどうでしょう?

あとは…「半角スペース区切り」なのか「カンマ区切り」なのかも注意が必要でしょうけど。

QC# タスクスケジューラ操作について

お世話になります。
Windows7Pro VisualStudio2005C# で業務アプリケーションを開発しております。

C#のコードでタスクスケジューラの操作を考えております。
現状コマンドプロンプトを起動し、命令文を実行する方法で考えております。

目的としましては、既に作成してあるタスクに対して、
C#のコードから実施時刻、使用有無、実行間隔を変更したいと考えております。
しかしながら、以下の命令文で実施時刻、使用有無は変更できますが、実行間隔が操作できません。

SCHTASKS /CHANGE /RU ********* /RP ***** /TN TEST /ST 17:30 /ENABLE

変更のコマンドがご存知の方がございましたら、ご教示いただければ幸いに存じます。

また、本稿C#のカテゴリに投稿した理由としまして、
C#2005で本処理を含むタスクスケジューラを操作するコードがございましたら、
ご教示いただければと思いまして記述を致しました。

合わせてご教示いただければ幸いに存じます。

以上宜しくお願い申し上げます。

お世話になります。
Windows7Pro VisualStudio2005C# で業務アプリケーションを開発しております。

C#のコードでタスクスケジューラの操作を考えております。
現状コマンドプロンプトを起動し、命令文を実行する方法で考えております。

目的としましては、既に作成してあるタスクに対して、
C#のコードから実施時刻、使用有無、実行間隔を変更したいと考えております。
しかしながら、以下の命令文で実施時刻、使用有無は変更できますが、実行間隔が操作できません。

SCHTASKS /CHANGE /RU ********* /RP *****...続きを読む

Aベストアンサー

>本件投稿の前にご指摘の事項を試してみましたが、「詳細設定」-「繰り返し間隔」が変更され、赤丸の設定が変更されないことは確認済みでした。

見直してみると…確かにそんな感じですね。

>コマンドで難しいようであれば、C#のクラス等を使用してと考えておりますが、
>.NET2.0ではタスクのクラス等は存在しないのでしょうか。

SCHTASKSコマンドでは無理…っぽいですね。
隠しスイッチでもあれば別なのでしょうが、ちょっと探すのは無理でしょうしねぇ……。
# 逆アセンブルやらデバッガで…という根性もちょっと無いです。

適当にググると…
http://homepage2.nifty.com/nonnon/SoftSample/CS.NET/SampleTaskScheduler.html
なんてのが。
COMインターフェース経由で利用っぽいです。
private struct DAILYのDaysInterval、private struct WEEKLYのWeeksInterval辺りが希望する設定項目のようです。
マニュアルとか見当たらないっぽいので、ちょっと使いづらいかも知れませんが…

http://jehupc.exblog.jp/10139787/
こんなページも。

ITaskSchedulerから、操作したいトリガーを持つITaskを取得して、さらにGetTrigger()で対象のTASK_TRIGGER構造体を取得。
内容を変更後SetTrigger()で再設定……でしょうか。
COMインターフェースとか使ったことないので想像ですが……。
まぁ、上記のキーワードなどで探してみると良いかも知れません。
# ITaskServiceってキーワードもあるっぽいですが。

>本件投稿の前にご指摘の事項を試してみましたが、「詳細設定」-「繰り返し間隔」が変更され、赤丸の設定が変更されないことは確認済みでした。

見直してみると…確かにそんな感じですね。

>コマンドで難しいようであれば、C#のクラス等を使用してと考えておりますが、
>.NET2.0ではタスクのクラス等は存在しないのでしょうか。

SCHTASKSコマンドでは無理…っぽいですね。
隠しスイッチでもあれば別なのでしょうが、ちょっと探すのは無理でしょうしねぇ……。
# 逆アセンブルやらデバッガで…という根性もちょっと...続きを読む


人気Q&Aランキング

おすすめ情報