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.

所以当我打开文本文件时,它应该是这样的:00000012201111290054123456

我是 C# 新手。我能够通过以下方式在 Visual Basic 上完成此操作:

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就是用途)。无论如何,您对 Random 的使用并不是很强大,而且我不确定您的实际用例,但这始终是需要牢记的;

  • 您使用几乎从字面上描述您的代码做什么的注释,这是相当没有意义的:仅添加注释以增加对您的代码为什么做它所做的事情的额外洞察,而不是如何做;

  • .NET 中的字符串是不可变的,这意味着每次使用&运算符时,都会创建一个新字符串,而旧的字符串会一直徘徊,直到垃圾收集开始。一段时间后这会变得非常昂贵:相反,学习 Text.StringBuilder并使用随时需要;

  • 您在C:\Program Files. 除了该目录在不同版本的 Windows 上可能有不同的名称(更不用说 Linux,如果您在Mono上运行)之外,用户无权在任何非旧版本上写入(即 post -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# 翻译器之一,它应该会为您提供如下内容:

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");
  }
}

基本上,它为您添加了一些分号和花括号,包括完全限定的命名空间并重写了三元条件:.NET Framework 位是相同的。

希望这会有所帮助,并祝您编程工作顺利!

于 2012-09-18T08:31:31.320 回答