2015-10-28 3 views
0

Я хочу использовать SaveFileDialog и при нажатии кнопки Save Я хочу сохранить имя файла и путь в отдельные переменные. Вот код:SaveFileDialog не сохраняет имя файла или путь

private void Button_Click(object sender, EventArgs e) 
    { 
     SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 
     saveFileDialog1.FileName = "SaveFile"; 
     saveFileDialog1.DefaultExt = ".txt"; 
     saveFileDialog1.Filter = "Text Files (*.txt)|*.txt"; 
     saveFileDialog1.Title = "Save a Text File"; 
     saveFileDialog1.FileOk += saveFileDialog1_FileOk; 
     saveFileDialog1.ShowDialog(); 
    } 

    private void saveFileDialog1_FileOk(object sender, CancelEventArgs e) 
    { 
      string filename = System.IO.Path.GetFileName(saveFileDialog1.FileName); 
      string name = saveFileDialog1.FileName; 

      var test = System.IO.Path.GetDirectoryName(saveFileDialog1.FileName); 
     } 

Окно открывается и запускает saveFileDialog1_FileOk события, но я получаю пустую строку для имени файла и решения для получения пути (без имени файла) не работает. Что я делаю не так?

+0

посмотрите на это, и вы быстро увидите, где находится ваша проблема/проблема. Https://msdn.microsoft.com/en-us/library/system.windows.forms.savefiledialog(v=vs.110). aspx – MethodMan

+0

Пробовал, но он даже не прыгнул в ветку if –

+0

Почему я получил нижний план? –

ответ

2

Основная проблема, которую вы имеете, используя 2 экземпляра SaveFileDialog.

Вы видите одно диалоговое окно, а затем попытаетесь прочитать File из другого диалогового окна, которое, очевидно, пустое.

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


Fix 1: Вы можете просто удалить SaveFileDialog saveFileDialog1 = new SaveFileDialog();, потому что кажется, что вы имеете saveFileDialog1 в качестве члена вашей формы.

Fix 2: Вы можете использовать SaveFileDialog таким образом:

var sfd= new SaveFileDialog(); 
//Other initializations ... 
//sfd.Filter= "Text files (*.txt)|*.txt|All files (*.*)|*.*"; 
//sfd.DefaultExt = "txt"; 

if(sfd.ShowDialog() == System.Windows.Forms.DialogResult.OK) 
{ 
    MessageBox.Show(sfd.FileName); 
    //ِDo something for save 
} 
else 
{ 
    //Do something for cancel if you want 
} 

Затем вы можете получить доступ к выбранному файлу, используя свойство FileName, например MessageBox.Show (sfd.FileName);

+0

@MethodMan Обратите внимание, что OP создал новый локальный экземпляр в 'Button_Click' и покажет его, а затем в' FileOk' он использует 'saveFileDialog1.FileName', который явно отличается от экземпляра, который он показывает. –

+0

@MethodMan И, конечно же, вы не слепые, я ношу очки, а очки ставят меня в точку;) –

+0

Я уже посмотрел, что один хороший улов .. + 2 – MethodMan

2

Проверьте этот пример из MSDN (https://msdn.microsoft.com/de-de/library/system.windows.forms.savefiledialog(v=vs.110).aspx):

private void button1_Click(object sender, System.EventArgs e) 
{ 
    Stream myStream ; 
    SaveFileDialog saveFileDialog1 = new SaveFileDialog(); 

    saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*" ; 
    saveFileDialog1.FilterIndex = 2 ; 
    saveFileDialog1.RestoreDirectory = true ; 

    if(saveFileDialog1.ShowDialog() == DialogResult.OK) 
    { 
     if((myStream = saveFileDialog1.OpenFile()) != null) 
     { 
      // Code to write the stream goes here. 
      myStream.Close(); 
     } 
    } 
} 

Вы только должны проверить возвращаемое значение saveFileDialog1.ShowDialog() знать, является ли пользователь нажал ОК или нет.

Затем вы можете использовать свойство FileName, которое содержит выбранный путь к файлу.

EDIT: Для того, чтобы получить путь к папке файла, вы можете использовать это:

string folderPath = new DirectoryInfo(saveFileDialog1.FileName).Name; 
+0

argumentexception на пути к папке. недопустимый формат –

+0

Какое значение имеет свойство 'saveFileDialog1.FileName'? – 321polorex123

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