2016-10-12 3 views
1

Я знаю, что это было задано несколько раз раньше, но я все еще не могу найти причину этого. Я уверен, что файл не используется внешней программой, поэтому причина должна быть в этом методе. Ошибка возникает в строке, где я инициализирую объект StreamWriter во второй раз (int for for loop).Процесс не может получить доступ к файлу «путь к файлу», потому что он используется другим процессом

static void WriteData(PeopleContainer people) 
    { 
     var file = new StreamWriter(File.Open(Directory + Output1, FileMode.Create), Encoding.GetEncoding(1257)); 
     for (int i = 0; i < people.SeenByEveryone.Count; i++) 
     { 
      Film film = people.SeenByEveryone.GetFilm(i); 
      file.WriteLine("{1}{0}{2}{0}{3}{0}{4}{0}{5}{0}{6}{0}{7}{0}{8}", CsvSeparator, film.Title, film.Year, 
          film.Director, film.Genre, film.Company, film.BoxOffice, film.Actors[0], film.Actors[1]); 
     } 

     for (int i = 0; i < people.Count; i++) 
     { 
      Person person = people.GetPerson(i); 
      string path = String.Format("{0}Rekomendcija_{1}_{2}.csv", Directory, person.FirstName, person.LastName); 

      file = new StreamWriter(File.Open(path, FileMode.Create), Encoding.GetEncoding(1257)); 
      for (int j = 0; j < person.RecomemdedFilms.Count; j++) 
      { 
       Film film = person.RecomemdedFilms.GetFilm(j); 
       file.WriteLine("{1}{0}{2}{0}{3}{0}{4}{0}{5}{0}{6}{0}{7}{0}{8}", CsvSeparator, film.Title, film.Year, 
           film.Director, film.Genre, film.Company, film.BoxOffice, film.Actors[0], film.Actors[1]); 
      } 
     } 
    } 
+1

Посмотрите на делать [string.join] (https://msdn.microsoft.com/en-us/library/57a79xd0%28v=vs.110%29.aspx?f= 255 & MSPPError = -2147217396) вместо форматирования такой строки. –

ответ

2

Вы должны уничтожить свой Stream.Writer, когда закончите с ним.

 using(var file = new StreamWriter(File.Open(Directory + Output1, FileMode.Create), Encoding.GetEncoding(1257))) 
     { 
      //your loop 
     } 

     for (int i = 0; i < people.Count; i++) 
     { 

      using(file = new StreamWriter(File.Open(path, FileMode.Create), Encoding.GetEncoding(1257))) 
      { 
       // other loop 
      } 
     } 

EDIT:

Как @enkryptor упоминания: если вы хотите, чтобы все рекомендованные фильмы, чтобы быть в вашем файле во втором цикле, вы должны использовать StreamWriterне в цикле. Кроме того, вы должны поставить FileMode.OpenOrCreate

using(file = new StreamWriter(File.Open(path, FileMode.OpenOrCreate), Encoding.GetEncoding(1257))) 
{ 
    for (int i = 0; i < people.Count; i++) 
    { 

      file.WriteLine(...//your stuff)   
    } 
} 
+1

Из-за ошибки кажется, что коллекция людей не уникальна. Если вы снова откроете файл с помощью FileMode.Create предыдущий файл будет перезаписан – oldovets

+0

, второй 'use' находится в неправильном месте – enkryptor

+0

@enkryptor это зависит от того, что он хочет делать, по какой-то причине его FileMode создается всегда, если мы хотим все поместить в режим файла должен быть OpenOrCreate – mybirthname

Смежные вопросы

 Смежные вопросы