2013-11-25 3 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; 

и увеличить его каждый раз, когда вы генерировать имя файла вместо использования DateTime с fff точностью *). Сделайте это и попробуйте запустить программу. Если это была проблема, она исправит это.

Если это не исправить, я буду думать об этом больше;)

*) вы видите, на самом деле DateTime обновляется один раз в то время, как каждые несколько миллисекунд. Ваша петля, конечно, петли быстрее. Это не «высокопроизводительная» временная метка. Если вам нужен лучший «timestamper», используйте Stopwatch. Это высокопроизводительный, может быть, не лучший, но хороший.

+0

Это сработало! Спасибо! – CryptoJones

0

Это связано с тем, что вы вручную определяете, где происходит разрыв линии, что не так надежно.

  1. Удалить delimiter переменную
  2. Прекратите использование StreamReader и расщепление на ограничителе
  3. Замените его 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 
Смежные вопросы