Как удалить файлы в каталоге после преобразования их из XML в Txt с помощью консольного приложения Visual C#?

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

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);

   }
  }

person Tyrel Denison    schedule 04.01.2012    source источник
comment
Вы не вызываете метод ниоткуда.   -  person keyboardP    schedule 05.01.2012
comment
When I place it outside of the main method, it is not executed at all. Где вы вызываете метод?   -  person Ash Burlaczenko    schedule 05.01.2012
comment
Кажется, я начинаю видеть. Мне нужно вызвать метод Empty внутри метода Main, верно? Не приведет ли это к той же ошибке «файл используется», которую я получаю при выходе из метода foreach в методе Main?   -  person Tyrel Denison    schedule 05.01.2012


Ответы (4)


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

попробуй это

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

or

 foreach (string filename in Files)
 {
      using (StreamReader read = new StreamReader(filename))
            {
                using (XmlReader reader = XmlReader.Create(read))
                {
                }
            }
 }
person Haris Hasan    schedule 04.01.2012
comment
Могу поспорить, что вызов XmlReader.Dispose фактически вызывает метод Dispose для StreamReader, а тот, в свою очередь, вызывает Dispose для Stream. - person Richard; 05.01.2012
comment
Попробуйте это на примере и посмотрите, что получится - person Haris Hasan; 05.01.2012
comment
Я все еще получаю сообщение «невозможно получить доступ, потому что он используется другой ошибкой процесса». - person Tyrel Denison; 05.01.2012
comment
После небольшой очистки моего кода, убедившись, что второй для каждого находится в нужном месте, и поместив средство чтения потока в оператор foreach, теперь он работает. Спасибо большое за помощь. - person Tyrel Denison; 05.01.2012

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

new StreamReader(File.Open(filename, FileMode.Open, FileAccess.Read, FileShare.Delete))
person Richard    schedule 04.01.2012
comment
Это удаляет файлы, но не раньше, чем создание новых файлов будет завершено. Затем я получаю исключение обработчика файлов, говорящее, что файл не найден. - person Tyrel Denison; 05.01.2012
comment
Извините, но я не вижу, где это может происходить. Есть еще код? - person Richard; 05.01.2012
comment
Мои извинения. Это происходит, когда я добавляю эту перегрузку, а также помещаю foreach file.delete в основной метод. Когда я удаляю метод foreach и оставляю новую перегрузку, новые файлы генерируются по желанию, но старые файлы не удаляются. - person Tyrel Denison; 05.01.2012
comment
Хорошо, я думаю, вам нужно немного переработать код. Во-первых, возьмите объявления StringBuilders вне foreach. Удалите файл только после того, как весь остальной код будет выполнен с ним, в новом цикле foreach, если вам нужно. - person Richard; 05.01.2012
comment
Удаление объявлений StringBuilder из foreach сделало компиляцию информации из файлов xml в строку, так что файл 2 содержал информацию из файлов 1 и 2 и так далее. С другой стороны, я исправил это сейчас. Помещение средства чтения потока в оператор using было первым шагом. Затем, с некоторой уборкой дома, я смог получить новый foreach в правильном методе и удалить файлы. Спасибо за уделенное время. Меня как одиночного разработчика очень спасает резиновый уклон. - person Tyrel Denison; 05.01.2012

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

Directory.Delete(@"C:\onlinesales", true);
person Jason Meckley    schedule 04.01.2012
comment
Мне нужно сохранить каталог. Даже после того, как я обернул его в оператор использования, я все равно получаю сообщение об ошибке «невозможно получить доступ, потому что он используется другим процессом». - person Tyrel Denison; 05.01.2012

person    schedule
comment
Это приводит к той же ошибке «невозможно получить доступ, потому что она используется другим процессом». - person Tyrel Denison; 05.01.2012
comment
@TyrelDenison Не использует (XmlReader reader = XmlReader.Create(new StreamReader(filename))) {....} автоматически освобождает (удаляет) объект после того, как он выходит из области видимости? (Я не уверен, но, насколько я помню, это так. Конечно, если вы не используете использование, вы должны закрыть и установить для объекта значение NULL, чтобы GC очистил его как можно скорее. - person Alex Dn; 05.01.2012
comment
Насколько мне известно, да, он должен выпускать его, когда он выходит за рамки. Некоторые предположили, что StreamReader все еще открыт и хранит файлы, а также предложили обернуть его в оператор using. Даже после этого я получаю ту же ошибку. Я не рассматривал возможность использования GC, потому что у меня сложилось впечатление, что он ненадежен для неотложной необходимости. Разве это не так? - person Tyrel Denison; 05.01.2012
comment
ОК, если да, попробуйте удалить использование и сделать reader.Close();reader = null; Сам позже испытаю. - person Alex Dn; 05.01.2012
comment
После включения streamreader в оператор using и очистки кода я смог все настроить. Спасибо. - person Tyrel Denison; 05.01.2012