C# 如何生成文件

C# 如何生成文件,c#,vb.net,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 n

我想在用户单击按钮时生成一个.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.

我决定将最后一代随机6代改为时间。如何在C#?

从开始,然后用C#遍历或重写代码,以构建问题中描述的信息。

解决问题的最简单方法是使用
String.Format
,它在VB.NET中与在C#中一样

不过,在开始之前,用VB.NET代码解决一些问题是值得的;修复这些问题也会使您的C#代码变得更好:

  • 您的
    Random
    实例
    r
    是在表单(模块)范围内声明的,但您只能在
    Form1\u Load
    过程中使用它:最好始终尽可能限制变量范围,换句话说,使声明“尽可能接近”用法

  • 关于
    System.Random
    :请记住,这实际上创建了一个可预测的(基于时间的)数字序列,因此它不应该用于任何与安全相关的内容(这就是
    System.security.Cryptography.RNGCryptoServiceProvider
    的用途)。无论如何,您对Random的使用不是很强,我也不确定您的实际用例,但这始终是需要记住的

  • 您使用的注释几乎是字面上描述代码的功能,这是毫无意义的:只添加注释,以增加对代码为什么要做这些事情的更多洞察,而不是如何做

  • NET中的字符串是不可变的,这意味着每次使用
    &
    运算符时,您都会创建一个新字符串,让旧字符串一直保留到垃圾回收开始。过了一段时间,这会变得非常昂贵:取而代之的是,
    Text.StringBuilder
    并在需要时使用它

  • 您可以在
    C:\ProgramFiles
    下创建一个文件。除了该目录在不同版本的Windows上可能有不同的名称(更不用说Linux了,如果您运行的是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#很简单:如果您使用其中的一个,它应该会给您以下内容:

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


希望这对您有所帮助,祝您编程成功

所以。。到目前为止,你的c#代码中有什么,你遇到了什么实际问题?这是一个VB.NET,不是c#@CodeSparke。他说他是c#的新手,他用VB的代码做到了。他知道这是VB,他写的。我支持BugFinder的问题,实际的问题是什么?你写东西的时候好像连C#语法都不懂(因为从VB到C#的代码转换很简单),为什么不使用其中的一种呢?其实这只是为了我的电脑。但是,我最近研究了如何使用specialfolder指定文件夹。谢谢你的意见和链接。我不知道他们的车甚至是一个转换器。。。谢谢你。
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");
  }
}