3

ユーザーがボタンをクリックしたときに .txt ファイルを生成したい。問題は、私はそれを行う方法がわからないということですか? この形式を使用するようにしたいと思います。

00000012 <-- at the very start of the text file
2011 11 29 <-- Year 2011, Month 11, Day 29 (the year month and day based on my PC)
0010 or 0054 <-- this is a random number randomly one of these 2 numbers...
123456 <-- Time, Hour 12, Minutes 34, Seconds 56.

テキスト ファイルを開くと、次のようになります。

私はC#が初めてです。これを使用して、ビジュアルベーシックでこれを達成できました:

Public Class Form1

    'declare new random object

        Dim r As New Random

        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        'declare string + set initial value
        Dim fileString As String = "00000012"
        'add formatted date
        fileString &= Now.ToString("yyyyMMdd")
        'add random 0010 or 0054
        fileString &= New String() {"0010", "0054"}(r.Next(0, 2))
        'add random 6 digit number
        fileString &= r.Next(0, 1000000).ToString("000000")
        'write file
        IO.File.WriteAllText("C:\Program Files\Code\maincode\maincode.txt", fileString)
        End Sub

        End Class

代わりに、最後のランダム 6 世代を時間に変更することにしました。C#でそれを行う方法は?

4

2 に答える 2

0

C#でテキストファイルを作成することから始めて、この表またはこれを通過し、C#でコードを書き直して、質問で説明されているように情報を作成します。

于 2012-09-18T08:21:19.470 に答える
0

問題を解決する最も簡単な方法はString.Format、を使用することです。これは、VB.NETでもC#とほぼ同じように機能します。

ただし、その前に、VB.NETコードに関するいくつかの問題に対処する価値があります。これらを修正すると、C#コードも大幅に改善されます。

  • Randomインスタンス、rはフォーム(モジュール)スコープで宣言されますが、プロシージャ内でのみ使用しForm1_Loadます。変数スコープを常に可能な限り制限することをお勧めします。つまり、宣言を「に」「近く」に保つことをお勧めします。できる限りの使用法。

  • :についてはSystem.Random、これにより実際には非常に予測可能な(時間ベースの)一連の数値が作成されるため、セキュリティ関連の数値には使用しないでください(これSystem.Security.Cryptography.RNGCryptoServiceProviderが目的です)。とにかくランダムの使用法はそれほど強力ではなく、実際の使用例はわかりませんが、これは常に覚えておくべきことです。

  • コードの機能をほぼ文字通り説明するコメントを使用しますが、これはかなり無意味です。コメントを追加するだけで、コードが実行する理由ではなく、実行する理由についての洞察を追加できます

  • .NETの文字列は不変です。つまり、演算子を使用するたび&に新しい文字列を作成し、ガベージコレクションが開始されるまで古い文字列を残しておきます。しばらくすると非常にコストがかかります。代わりに、学習し Text.StringBuilderて使用してください。必要なときはいつでも。

  • の下にファイルを作成しますC:\Program Filesそのディレクトリが異なるバージョンのWindows( Monoで実行している場合はLinuxは言うまでもありません)で異なる名前を持つ可能性があるという事実は別として、ユーザーは非レガシーでそこに書き込む権限を持っていません(つまり投稿-XP)バージョンのWindows。したがって、これを行うと、配布時にプログラムがクラッシュします。早い段階で適切なファイルの場所を使用する方法を学ぶと、多くの問題を回避できます。

とにかく、あなたの質問に移りましょう。たくさんのパラメータやフォーマットを使って文字列を作成したいときはいつでもString.Format、そのカスタムフォーマットの文字列は非常に便利です。たとえば、元のVB.NETコードは次のように書き直すことができます。

Sub Form1_Load(s As Object, e As EventArgs)
  Using sw As New IO.StreamWriter(IO.Path.Combine(
            Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
            "maincode.txt"))
    sw.WriteLine("00000012{0:yyyyMMdd}{1}{0:HHmmss}", Now,
                 If((New Random).Next(0, 2) = 0, "0010", "0054"))
  End Using
End Sub

実行すると、これが作成されますC:\Users\YourUserName\AppData\Roaming\maincode.txt(または、XPまたは特定のローカライズされたバージョンのWindowsを使用している場合はEnvironment.GetFolderPath(Environment.SpecialFolder.ApplicationData)、デバッガーでの値を確認してください)。

これをC#に変換するのは簡単です。オンラインで利用できる多くのVB.NETからC#への変換の1つを使用すると、次のようになります。

public void Form1_Load(object s, EventArgs e)
{
  using (System.IO.StreamWriter sw = new System.IO.StreamWriter(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "maincode.txt"))) {
    sw.WriteLine("00000012{0:yyyyMMdd}{1}{0:HHmmss}", DateAndTime.Now, (new Random()).Next(0, 2) == 0 ? "0010" : "0054");
  }
}

基本的に、セミコロンと中括弧をいくつか追加し、完全修飾名前空間を含め、3項条件を書き直しました。.NETFrameworkのビットは同じです。

これがお役に立てば幸いです。プログラミングの努力を頑張ってください。

于 2012-09-18T08:31:31.320 に答える