如何生成文件

时间:2012-09-18 07:56:37

标签: c# vb.net

我想在用户点击按钮时生成.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#中实现?

2 个答案:

答案 0 :(得分:0)

creating Text files with C#开始,然后浏览this tabelthis one并在C#中重写代码,以构建问题中所述的信息。

答案 1 :(得分:0)

解决问题的最简单方法是使用String.Format,其中works pretty much the same way在VB.NET中与在C#中一样。

在开始之前,有必要解决VB.NET代码的一些问题;修复这些将使你的C#代码也更好:

  • 您的Random实例r是在表单(模块)范围内声明的,但您只能在Form1_Load过程中使用它:始终是一个好主意保持您的变量范围尽可能有限,换句话说,保持您的声明“尽可能接近”使用范围;

  • 关于System.Random的主题:请记住,这实际上创建了一个非常可预测的(基于时间的)数字序列,因此它不应该用于任何与安全相关的事情(这就是System.Security.Cryptography.RNGCryptoServiceProvider的用途。无论如何,你对Random的使用不是很强,我不确定你的实际用例,但总是要记住这一点;

  • 您使用几乎完全描述代码所做内容的注释,这是毫无意义的:只添加注释以添加其他洞察为什么您的代码执行的操作,而不是如何

  • .NET中的字符串是不可变的,这意味着每次使用&运算符时,都会创建一个新的字符串,让旧的字符串留在那里,直到垃圾收集开始。这真的变了一段时间之后很贵:learn about Text.StringBuilder并在需要时使用它;

  • 您在C:\Program Files下创建了一个文件。除了该目录在不同版本的Windows上可能有不同的名称(更不用说Linux,如果你在Mono上运行),用户没有权限在任何非Windows的遗留(即XP后)版本。因此,如果你这样做,你的程序将在分发时崩溃:如果你learn to use the proper file locations早期,这将为你节省很多麻烦。

无论如何,关于你的问题:每当你想创建一个包含大量参数和/或格式的字符串时,String.Format及其custom format strings都非常方便。例如,您的原始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 to C# translators available online中的一个,它应该给你这样的东西:

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位是相同的。

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