2013-11-25 93 views
1

我寫了這個程序來將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 = "\r\n\r\n"; 
      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 
+0

它與相同的文件不一致嗎?或不同的文件? –

+0

使用相同的文件。 – CryptoJones

+0

你的文件是UTF8編碼? – Portekoi

回答

7

有一些運氣,它可能已經生成了多次相同的文件名。你的「隨機文件名」可能不夠隨機。嘗試使用簡單的靜態反像

public static int filenumber = 0; 

,並在每次生成的文件名,而不是使用DateTimefff精度*時間)增加了。做到這一點,並重新運行你的程序。如果是這個問題,它會解決它。

如果不能解決的話,我會考慮的更多;)

*)你看,DateTime在一段時間實際上是刷新一次,如每隔幾毫秒。你的循環肯定會更快地循環。這不是「高性能」時間戳。如果您想要更好的「時間戳」,請使用Stopwatch。它是高性能的,也許不是最好的,但是很好。

+0

工作正常!謝謝! – CryptoJones

0

這是因爲您正在手動確定哪裏出現換行不可靠。

  1. 刪除delimiter變量
  2. 卸下分隔符
  3. 使用StreamReader和分裂與File.ReadAllLines

File.ReadAllLines更換它會給你行,你就可以遍歷列表使用foreach。

+0

@quetzalcoatl如果確實手動確定換行符是不可靠的,那麼每次讀取文件時是不是也可能會在不同的換行符上分割? – user1886419

+0

@quetzalcoatl我同意。但是,當一個文件被創建並保存到磁盤時,它有可能會有不同的行尾。例如,一些以'\ r \ n'結尾,另一些以'\ r \ n \ r \ n'結尾。這就是爲什麼我建議使用內置的'File.ReadAllLines',而不是硬編碼分隔符來查找。我並不是說代碼不起作用,但源文件可能會混亂。 – user1886419

+0

@quetzalcoatl我只是說這是我最初的回答中要查找的內容,並且您說這不合邏輯(並且已收回,現在正在進行攻擊)。沒關係。 – user1886419

2

我認爲你的代碼運行得太快而無法生成隨機文件名。我能夠在我的系統上重現它。我改變了你的代碼來使用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 = "\r\n\r\n"; 
      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