程序运行三次,得到三个不同的结果



我编写这个程序是为了将EDI文件分割成自己的文件,但它的操作并不一致。有时它会将一个有三个部分的文件分解为两个部分,有时它会找到所有三个部分。

有人能向我解释一下它为什么会这样做吗?非常感谢您的帮助。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace chomp
{
    class Program
    {
        static string GenerateFileName(string context)
        {
            return context + "_" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".edi"; 
        } 
        static int Main(string[] args)
        {
            string delimiter = "rnrn";
            if (args.Length == 0)
            {
                Console.WriteLine("Please enter a file name: ");
                return 1;
            }
            else
            {
                try
                {
                    string fileName = (args[0]);
                    if (File.Exists(fileName)){
                    System.IO.StreamReader myFile =
                    new System.IO.StreamReader(fileName);
                    string FileStream = myFile.ReadToEnd();
                    myFile.Close();
                    string myFileName = GenerateFileName("DOC");
                    string[] FSPart = FileStream.Split(new string[] { delimiter }, StringSplitOptions.None);
                    foreach (string s in FSPart)
                    {
                        string newAwesomeFN = DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".edi"; 
                        using (System.IO.FileStream fs = System.IO.File.Create(newAwesomeFN))
                        {
                        }
                        System.IO.StreamWriter file = new System.IO.StreamWriter(newAwesomeFN);
                        file.WriteLine(s);
                        file.Close();
                    }
                    return 0;
                    } else {
                        System.Console.WriteLine("Filename "+ fileName+ " does not exist!");
                        return 0;
                    } // closes else + if File.Exists
                }
                catch (System.FormatException)
                {
                    Console.WriteLine("A Filename must be entered!");
                    return 1;
                }
            }
        } //closes main
    } //closes program
} //closes main

如果运气好的话,它可能会多次生成相同的文件名。您的"随机文件名"可能不够随机。尝试使用简单的静态计数器,如

public static int filenumber = 0;

并在每次生成文件名时增加它,而不是使用具有fff精度的DateTime*)。请执行此操作,然后重试运行您的程序。如果是问题,它会解决的。

如果这还不能解决问题,我会仔细考虑;)

*)您可以看到,DateTime实际上每隔几毫秒就会刷新一次。你的循环肯定更快。它不是"高性能"时间戳。如果您想要更好的"时间篡改",请使用Stopwatch。它是高性能的,也许不是最好的,但很好。

我认为您的代码运行得太快,无法生成随机文件名。我能够在我的系统上复制它。我修改了你的代码,使用GUID作为文件名,以确保没有重复的机会,它似乎已经解决了这个问题。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;

namespace chomp
{
    class Program
    {
        static string GenerateFileName(string context)
        {
            return context + "_" + Guid.NewGuid().ToString() + ".edi"; // DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".edi";
        }
        static int Main(string[] args)
        {
            string delimiter = "rnrn";
            if (args.Length == 0)
            {
                Console.WriteLine("Please enter a file name: ");
                return 1;
            }
            else
            {
                try
                {
                    string fileName = (args[0]);
                    if (File.Exists(fileName))
                    {
                        System.IO.StreamReader myFile =
                        new System.IO.StreamReader(fileName);
                        string FileStream = myFile.ReadToEnd();
                        myFile.Close();
                        string[] FSPart = FileStream.Split(new string[] { delimiter }, StringSplitOptions.None);
                        foreach (string s in FSPart)
                        {
                            string myFileName = GenerateFileName("DOC");
                            System.IO.StreamWriter file = new System.IO.StreamWriter(myFileName, false);
                            file.WriteLine(s);
                            file.Close();
                        }
                        return 0;
                    }
                    else
                    {
                        System.Console.WriteLine("Filename " + fileName + " does not exist!");
                        return 0;
                    } // closes else + if File.Exists
                }
                catch (System.FormatException)
                {
                    Console.WriteLine("A Filename must be entered!");
                    return 1;
                }
            }
        } //closes main
    } //closes program
} //closes main

这是因为您手动确定换行发生的位置,这并不可靠。

  1. 删除delimiter变量
  2. 删除分隔符上的使用StreamReader和拆分
  3. 将其替换为File.ReadAllLines

File.ReadAllLines将为您提供行列表,然后您可以使用foreach对其进行迭代。

最新更新