5分ごとにスケジュールされる単純なc#コンソールアプリケーションがあります。プログラムを呼び出すたびに、最後の実行の出力が必要です。
私が今していることは、テキストファイルを使用して結果を保存することです。次回実行すると、テキストファイルが開き、前回の実行の出力がわかります。
そのようなテキストファイルを必要としない他の方法はありますか?セッション変数などを維持するのが好きですか?
5分ごとにスケジュールされる単純なc#コンソールアプリケーションがあります。プログラムを呼び出すたびに、最後の実行の出力が必要です。
私が今していることは、テキストファイルを使用して結果を保存することです。次回実行すると、テキストファイルが開き、前回の実行の出力がわかります。
そのようなテキストファイルを必要としない他の方法はありますか?セッション変数などを維持するのが好きですか?
設定ファイルを使用できます。プログラムを閉じるたびに、設定ファイルをプロジェクトに追加し、保存する値を保存するだけです。プログラムが起動したら、設定ファイルの値を確認してください。
さて、あなたはどこかにデータを保存する必要があります。コンソールアプリにはセッション変数(またはセッション)がありません。あなたはおそらく環境変数を意味します。これを環境変数に格納する場合、プログラムは同じ環境から(つまり、同じコンソールウィンドウから)実行する必要があります。マシンがクラッシュすると、環境変数は失われます。あなたはおそらくファイルを使ったほうがいいでしょう。
これが5分ごとに実行される場合、再度実行する必要があるまでプログラムをスリープ状態にすることができますか?その後、データはメモリで利用可能になります。マシンがクラッシュした場合でも問題が発生するため、バックアップとしてファイルを保持する必要がある場合があります。
@Quintin Robinsonが提案したように、ユーザーにファイルを見せたくない場合で、データが多すぎない場合(ただし、数Kバイトはおそらく機能します)、レジストリを使用できます。論理的で適切な権限を持っている領域に書き込んでいることを確認してください。
ユーザーにファイルの内容を表示させたくない場合は、内容をスクランブルして判読不能にすることができます。暗号化を使用する場合は、解読するためにローカルでキーが必要になるため、熟練した攻撃者または断固とした攻撃者が引き続きファイルを入手できます。データを圧縮して適切と呼ぶ方がよい場合があります。
ユーザーがファイルの内容を簡単に変更できないようにする場合は、チェックサム、ハッシュ、またはHMACをデータとともに保存できます。ローカルで確認する必要があります。つまり、これは攻撃される可能性がありますが、カジュアルなユーザーがビットハッキングするのを防ぐ必要があります。
もちろん、ニーズや懸念事項に応じて、レジストリストレージ、スクランブリング、チェックサムを組み合わせることができます。
PStorとCryptProtectData/CryptUnprotectDataについて言及することを検討しましたが、それらのセキュリティはユーザーベースであるため、ここでは役に立ちません。
マシンがインターネットに接続されている場合は、クラウドストレージを検討できますが、それがアプリケーションに適しているかどうかはわかりません。
まず、ミューテックスロックソリューションを使用して、アプリに同時に1つのインスタンスのみを実行させます。
次に、アプリの状態を保持するシリアル化可能なクラスと、それをロードしてファイルに保存するヘルパークラスを作成します。例を参照してください。
[XmlRoot("RegexTesterPersistantSettings")]
[Serializable]
public class State
{
public State()
{
this.Pattern = string.Empty;
this.TestString = string.Empty;
this.Options = 0;
}
[XmlElement("Pattern")]
public string Pattern{get;set;}
[XmlElement("TestString")]
public string TestString{get;set;}
[XmlElement("Options")]
public int Options { get; set; }
public override int GetHashCode()
{
return this.Options.GetHashCode() ^ this.Pattern.GetHashCode() ^ this.TestString.GetHashCode();
}
public override bool Equals(object obj)
{
State anotherState = obj as State;
if (anotherState == null)
{
return false;
}
return this.Equals(anotherState);
}
public bool Equals(State anotherState)
{
return this.GetHashCode() == anotherState.GetHashCode();
}
public static bool operator ==(State a, State b)
{
// If both are null, or both are same instance, return true.
if (System.Object.ReferenceEquals(a, b))
{
return true;
}
// If one is null, but not both, return false.
if (((object)a == null) || ((object)b == null))
{
return false;
}
return a.Equals(b);
}
public static bool operator !=(State a, State b)
{
return !a.Equals(b);
}
}
public class PersistantHelper
{
private string filename;
private State _state;
public PersistantHelper(string xmlFilename = "RegexTesterSettings")
{
string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
this.filename = Path.Combine(appDataPath, xmlFilename);
}
private XmlSerializer _serializer;
private XmlSerializer Serializer
{
get
{
if (this._serializer == null)
{
this._serializer = new XmlSerializer(typeof(State));
}
return this._serializer;
}
}
private void SaveState(State state)
{
if (File.Exists(this.filename))
{
File.Delete(this.filename);
}
var stream = new FileStream(this.filename, FileMode.OpenOrCreate, FileAccess.Write,FileShare.None);
this.Serializer.Serialize(stream, state);
stream.Close();
}
public State State
{
get
{
if (this._state == null)
{
this._state = this.GetState();
}
return this._state;
}
set
{
if (this.State != value)
{
this.SaveState(value);
}
}
}
private State dummyState = new State() { Options = 0 };
private State GetState()
{
if (!File.Exists(this.filename))
{
return this.dummyState;
}
Stream stream = null;
try
{
stream = new FileStream(this.filename, FileMode.Open, FileAccess.Read,FileShare.None);
var o = this.Serializer.Deserialize(stream);
return (State)o;
}
catch
{
return this.dummyState;
}
finally
{
if (stream != null)
{
stream.Close();
}
}
}
}
次に、アプリから状態をロードして保存します。
private PersistantHelper persistantHelper;
public frmTester()
{
InitializeComponent();
this.persistantHelper = new PersistantHelper();
.
.
.
}
private void LoadPersistantData()
{
State state = this.persistantHelper.State;
this.txtPattern.Text = state.Pattern;
this.txtTest.Text = state.TestString;
foreach (Control c in this.pnlOptions.Controls)
{
if (c is CheckBox)
{
var chk = c as CheckBox;
int tag = int.Parse(c.Tag.ToString());
chk.Checked = (state.Options & tag) == tag;
}
}
}
private void SavePersistantData()
{
this.persistantHelper.State = new State()
{
Options = (int)this.GetOptions(),
Pattern = txtPattern.Text,
TestString = txtTest.Text
};
}