我想在用户点击按钮时生成.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#中实现?
答案 0 :(得分:0)
从creating Text files with C#开始,然后浏览this tabel或this 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位是相同的。
希望这会有所帮助,祝你的编程工作顺利!