2012-01-04 1 views
0

Я создаю приложение Visual C# для скрытых xml-файлов в x12 edi txt-файлах. Я хотел бы удалить все файлы в каталоге xml после того, как я создал их эквиваленты txt. Я попытался добавить метод foreach с file.delete, но не могу заставить его работать. Когда я помещаю его в основной метод, мне говорят, что файл используется. Когда я размещаю его вне основного метода, он не выполняется вообще. Ниже приведен код для моего приложения с файлом.delete в конце, вне основного метода и класса.Как удалить файлы в каталоге после того, как я преобразовал их из XML в Txt с помощью консольного приложения Visual C#?

namespace XMLParse 
{ 
    class Class1 
    { 

    public static void Main() 
    { 

     string[] Files = Directory.GetFiles(@"C:\onlinesales"); 
     foreach (string filename in Files) 
     { 

      StringBuilder orderid = new StringBuilder(); 
      StringBuilder ordernumber = new StringBuilder(); 
      StringBuilder name = new StringBuilder(); 
      StringBuilder staddress = new StringBuilder(); 
      StringBuilder city = new StringBuilder(); 
      StringBuilder state = new StringBuilder(); 
      StringBuilder zip = new StringBuilder(); 
      StringBuilder country = new StringBuilder(); 
      StringBuilder email = new StringBuilder(); 
      StringBuilder partnumber = new StringBuilder(); 
      StringBuilder quantity = new StringBuilder(); 


      using (XmlReader reader = XmlReader.Create(new StreamReader(filename))) 
      { 
       reader.ReadToFollowing("OrderID"); 
       orderid.Append(reader.ReadElementContentAsString()); 

       reader.ReadToFollowing("OrderNumber"); 
       ordernumber.Append(reader.ReadElementContentAsString()); 

       reader.ReadToFollowing("Name"); 
       name.Append(reader.ReadElementContentAsString()); 

       reader.ReadToFollowing("Line1"); 
       staddress.Append(reader.ReadElementContentAsString()); 

       reader.ReadToFollowing("City"); 
       city.Append(reader.ReadElementContentAsString()); 

       reader.ReadToFollowing("StateProvinceCode"); 
       state.Append(reader.ReadElementContentAsString()); 

       reader.ReadToFollowing("PostalCode"); 
       zip.Append(reader.ReadElementContentAsString()); 

       reader.ReadToFollowing("CountryCode"); 
       country.Append(reader.ReadElementContentAsString()); 

       reader.ReadToFollowing("Email"); 
       email.Append(reader.ReadElementContentAsString()); 

       reader.ReadToFollowing("ProductSKU"); 
       partnumber.Append(reader.ReadElementContentAsString()); 

       reader.ReadToFollowing("Quantity"); 
       quantity.Append(reader.ReadElementContentAsString()); 

      } 

      using (StreamWriter fileout = 
       new StreamWriter("W:" + DateTime.Now.ToString("yyyyy-MM-dd_hh-mm-ss-ff") + ".txt", false, Encoding.ASCII)) 
      { 
       fileout.WriteLine("ISA*00*   *00*   *ZZ*daisywebstore *12*5016361200  *" + DateTime.Now.ToString("yyMMdd") + "*1559*U*00400*000001649*0*P>~"); 
       fileout.WriteLine("GS*PO*daisywebstore*5016361200*" + DateTime.Now.ToString("yyyyMMdd") + "*" + DateTime.Now.ToString("HHmm") + "*1649*X*004010~"); 
       fileout.WriteLine("ST*850*13~"); 
       fileout.WriteLine("BEG*00*SA*08272226001*" + DateTime.Now.ToString("yyyyMMdd") + "~"); 
       fileout.WriteLine("REF*DP*089~"); 
       fileout.WriteLine("DTM*002*20120104~"); 
       fileout.WriteLine("N1*ST*" + name + "~"); 
       fileout.WriteLine("N3*" + staddress + "~"); 
       fileout.WriteLine("N4*" + city + "*" + state + "*" + zip + "~"); 
       fileout.WriteLine("N1*RE**92*00103653341~"); 
       fileout.WriteLine("PO1*1*6*EA*33.28*TE*IN*985880-542~"); 
       fileout.WriteLine("PID*F*****CO2 BB PISTOL  $ 5693~"); 
       fileout.WriteLine("PO4*3*1*EA~"); 
       fileout.WriteLine("CT*1~"); 
       fileout.WriteLine("AMT*1*199.68~"); 
       fileout.WriteLine("SE*16*13~"); 
      } 
     } 
    } 
} 
} 
public class Delete 
{ 
private static void Empty() 
    { 
    string[] files = Directory.GetFiles(@"C:\onlinesales"); 
    foreach (string filename in files) 
     File.Delete(filename); 

    } 
    } 
+0

Вы не вызывая метод из любой точки мира. – keyboardP

+0

'Когда я размещаю его вне основного метода, он вообще не выполняется.' Где вы вызываете метод? –

+0

Я считаю, что я начинаю видеть. Мне нужно вызвать метод Empty в методе Main, правильно? Не приведет ли это к тому, что при использовании метода foreach в методе Main будет получена ошибка «файл используется»? –

ответ

1

Вы закрываете XMLReader через using но StreamReader остается открытым, которая вызывает эту ошибку

попробовать этот

foreach (string filename in Files) 
{ 
    StreamReader read = new StreamReader(filename); 
      using (XmlReader reader = XmlReader.Create(read)) 
      { 
      } 
    read.Close(); 
} 

или

foreach (string filename in Files) 
{ 
     using (StreamReader read = new StreamReader(filename)) 
      { 
       using (XmlReader reader = XmlReader.Create(read)) 
       { 
       } 
      } 
} 
+0

Держу пари, что вызов XmlReader.Dispose на самом деле вызывает метод Dispose в StreamReader, а это, в свою очередь, вызывает Dispose в потоке. – Richard

+0

Попробуйте это в примере и посмотрите, что произойдет –

+0

Я до сих пор получаю сообщение «невозможно получить доступ, потому что он используется другой ошибкой процесса. –

1

Попробуйте эту перегрузку конструктора StreamReader вместо:

new StreamReader(File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Delete)) 
+0

Это удаляет файлы, но не до того, как будут созданы новые файлы. Затем я получаю сообщение об исключении файла, которое не может быть найдено. –

+0

Извините, но я не вижу, где это может произойти. Есть ли еще код? – Richard

+0

Приношу свои извинения. Это происходит, когда я добавляю эту перегрузку, а также помещаю файл foreach file.delete в основной метод. Когда я удаляю метод foreach и оставляю новую перегрузку, новые файлы генерируются по желанию, но старые файлы не удаляются. –

0

оберните new streameader(filename) в используемом заявлении. если файлы сохранены в другой каталог; просто удалите каталог

Directory.Delete(@"C:\onlinesales", true); 
+0

Мне нужно сохранить каталог. Даже после обертывания его в операторе using я все еще получаю сообщение «невозможно получить доступ, потому что оно используется другим процессом». –

0
namespace XMLParse 
{ 
    class Class1 
    { 

     public static void Main() 
     { 

      string[] Files = Directory.GetFiles(@"C:\onlinesales"); 
      foreach (string filename in Files) 
      { 

       //...YOUR CODE 
      } 

      //....ADD THIS LINE 
      Array.ForEach(Directory.GetFiles(@"c:\onlinesales\", "*.xml"), 
       delegate(string path) { File.Delete(path); }); 
     } 
    } 
} 
+0

Это приводит к тому, что «невозможно получить доступ, потому что он используется другим процессом». –

+0

@TyrelDenison Не использует (XmlReader reader = XmlReader.Create (новый StreamReader (filename))) {....} выпускает (удаляет) объект автоматически после его выхода из области видимости? (Я не уверен, но, как я помню, это так. Конечно, если вы не используете «использование», вы должны закрыть и установить объект в NULL, чтобы GC очистил его как можно скорее. –

+0

Насколько я знаю, это должно быть освобождение это когда он выходит за рамки. Некоторые из них предположили, что StreamReader все еще открыт и держит файлы, и они предложили также обернуть его в оператор using. Даже после этого я получаю ту же ошибку. Я не рассматривал использование GC потому что у меня создалось впечатление, что оно не было надежно для немедленной необходимости. Это не так? –