我想使用SaveFileDialog,当点击Save按钮时,我想将文件名和路径保存到单独的变量中。这是代码:
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 :(得分: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
属性。
编辑:要获取文件的文件夹路径,您可以使用:
string folderPath = new DirectoryInfo(saveFileDialog1.FileName).Name;
答案 1 :(得分:2)
您遇到的主要问题是使用SaveFileDialog
的2个实例。
您显示一个对话框,然后尝试从另一个显然为空的对话框中读取File
。
请注意,在按钮单击中,您正在创建一个新的本地实例并显示它,然后在FileOk
中您正在使用另一个似乎是表单级别成员的实例。
修复1:
您只需删除SaveFileDialog saveFileDialog1 = new SaveFileDialog();
,因为您似乎已将saveFileDialog1作为表单的成员。
修复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);