2013-11-16 2 views
0

Когда я хочу написать файл, я получаю эту ошибку:WPF StreamWriter ошибка

System.ArgumentNullException: Значение не может быть пустым. Имя Параметр: путь в System.IO.StreamWriter..ctor (путь String, Boolean Append, кодирования Encoding, Int32 BufferSize, булева checkHost) в System.IO.StreamWriter..ctor (String путь) в Music_Player.Library .SongList_Save (String Filename) в «Мой путь»

Это код файла автор:

private void AddSong(string path) 
    { 
     DataContext = new Song(); 
     Song _songAdd = new Song(); 
     FileInfo _song = new FileInfo(path); 


     _songAdd.SongLengh = MainWindow._MusicPlayer.TransformToTime(MainWindow._MusicPlayer.GetSongMaxLength(path)); 
     _songAdd.SongName = System.IO.Path.GetFileNameWithoutExtension(_song.Name); 
     _songAdd.SongPath = path; 
     LB_SongList.Items.Add(_songAdd); 
     SongList_Save(SelectedPlaylist); 
    } 
private void LB_SongList_Drop(object sender, DragEventArgs e) 
    { 
     String[] file = e.Data.GetData(DataFormats.FileDrop, true) as String[]; 
     foreach (var path in file) 
     { 
      if (MainWindow._MusicPlayer.GetSongMaxLength(path) != -1) 
      { 
       AddSong(path); 
      } 
     } 
    } 

public void SongList_Save(String fileName) 
    { 
     try 
     { 
      if (!String.IsNullOrEmpty(fileName) && File.Exists(fileName)) 
      { 
       using (StreamWriter comboboxsw = new StreamWriter(fileName)) 
       { 
        for (int cfgitem = 0; cfgitem < LB_SongList.Items.Count; cfgitem++) 
        { 
         comboboxsw.WriteLine(GetPath((ListBoxItem)(LB_SongList.ItemContainerGenerator.ContainerFromIndex(cfgitem)))); 
        } 
        comboboxsw.Close(); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
     } 
    } 

И если этого не достаточно, он делает записи в файл, но текст написан в два раза. // Отредактируйте запись дважды, но это может быть вызвано другим кодом, поэтому никогда не будет.

Новое исключение: System.ArgumentNullException: значение не может быть пустым. Имя Параметр: Элемент

в MS.Interal.Media.VisualTreeUtils.AsNonNullVisual (DependencyObject элемент, Визуальный & визуальный, Visual3D & Visual3D)

в System.Windows.Media.VisualTreeHelper.GetChildernCount (DependencyObject ссылки)

в Music_Player.Library.FindVisualChild [Childitem] (DependencyObject OBJ) в "PATH" MY

в Music_Player.Library.GetPath (ListBoxItem фунтов) в "PATH" MY

в Music_Player.Library.SongList_Save (String FileName) в "Мой путь"

Все три метода ниже:

private childItem FindVisualChild<childItem>(DependencyObject obj) where childItem : DependencyObject 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(obj, i); 
      if (child != null && child is childItem) 
       return (childItem)child; 
      else 
      { 
       childItem childOfChild = FindVisualChild<childItem>(child); 
       if (childOfChild != null) 
        return childOfChild; 
      } 
     } 
     return null; 
    } 
private string GetPath(ListBoxItem lb) 
    { 
     ListBoxItem myListBoxItem = (ListBoxItem)(lb); 
     ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem); 
     DataTemplate myDataTemplate = myContentPresenter.ContentTemplate; 
     Label target = (Label)myDataTemplate.FindName("SongPath", myContentPresenter); 
     return (string)target.Content; 
    } 
public void SongList_Save(String fileName) 
    { 
     try 
     { 
      if (!String.IsNullOrEmpty(fileName)) 
      { 
       using (StreamWriter comboboxsw = new StreamWriter(fileName)) 
       { 
        for (int cfgitem = 0; cfgitem < LB_SongList.Items.Count; cfgitem++) 
        { 
         comboboxsw.WriteLine(GetPath((ListBoxItem)(LB_SongList.ItemContainerGenerator.ContainerFromIndex(cfgitem)))); 
        } 
        comboboxsw.Close(); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      MessageBox.Show(e.ToString()); 
     } 
    } 
+0

Easy один, отладки приложения, и вы увидите, что 'filename' является нулевым или пустым как исключение уже отмечалось ...;) – DHN

+0

Но я всегда определить FileName при вызове. И он записывает файл с именем, которое ему нужно, и записывает две одинаковые строки. –

+0

Ну, исключение говорит иначе. Проверьте свой код. – DHN

ответ

0

звучит как путь null. попробуйте проверить на null, прежде чем использовать его.

public void SongList_Save(String fileName) 
{ 
    try 
    { 
     if (!String.IsNullOrEmpty(fileName)) 
     { 
      using (StreamWriter comboboxsw = new StreamWriter(fileName)) 
      { 
       for (int cfgitem = 0; cfgitem < LB_SongList.Items.Count; cfgitem++) 
       { 
        comboboxsw.WriteLine(GetPath((ListBoxItem)(LB_SongList.ItemContainerGenerator.ContainerFromIndex(cfgitem)))); 
       } 
       comboboxsw.Close(); 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     MessageBox.Show(e.ToString()); 
    } 
} 
+0

Если файл не существует, код ничего не напишет, хотя он будет работать. Опустите часть 'File.Exists (...)', и все будет хорошо. – DHN

+0

Еще одно и то же. Я добавлю еще один фрагмент кода, который может вызвать его. –

+0

@DHN да, только что создавались новые файлы вместо существующих обновляемых. Благодаря! –

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