使用saveFileDialog-C#保存文件后返回路径名



我正在使用saveFileDialog创建并保存一个csv文件。我需要找到一种方法来记住保存文件的人保存文件的路径名称,以便稍后在代码中使用文件的路径名。

下面的代码是我一直在尝试的,只是为了返回pathName,但实际上它只返回sfd.FileName。有办法走完全程吗?

private void saveCSVbutton_Click(object sender, EventArgs e)
{
saveShipping();
saveATT();
saveVerizon();
String shippingPath = saveShipping();
MessageBox.Show(shippingPath);    
}  
private String saveShipping()
{
if (dataGridView1.Rows.Count > 0)
{
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "CSV (*.csv)|*.csv";
sfd.FileName = "shippingOutput.csv";
bool fileError = false;
if (sfd.ShowDialog() == DialogResult.OK)
{
if (File.Exists(sfd.FileName)) 
{
try
{//overwrite file
File.Delete(sfd.FileName);
}
catch (IOException ex)
{
fileError = true;
MessageBox.Show("It wasn't possible to write the data to the disk." + ex.Message);
}
}
if (!fileError)
{
try
{
int columnCount = dataGridView1.Columns.Count;
string columnNames = "";
string[] outputCsv = new string[dataGridView1.Rows.Count + 1];
for (int i = 0; i < columnCount; i++)
{
columnNames += dataGridView1.Columns[i].HeaderText.ToString() + ",";
}
outputCsv[0] += columnNames;
for (int i = 1; i < dataGridView1.Rows.Count; i++)
{
for (int j = 0; j < columnCount; j++)
{
outputCsv[i] += dataGridView1.Rows[i - 1].Cells[j].Value.ToString() + ",";
}
}
File.WriteAllLines(sfd.FileName, outputCsv, Encoding.UTF8);
MessageBox.Show("Data Exported Successfully", "Info");
String attachPathName = sfd.FileName;
}
catch (Exception ex)
{
MessageBox.Show("Error :" + ex.Message);
}
}
}
}
else
{
MessageBox.Show("No Record To Export", "Info");
}
return attachPathName;
}

我可以想出两种方法让它对你来说很简单,但它们的工作方式是一样的,这取决于你的需求。我将称之为方法1和方法2。

方法1.

Preslave Tsenov有一个很好的答案来保持它的直接性,但是我注意到你的SaveFileDialogue sfd变量是从方法中声明和实例化的。简而言之,您将无法从方法块之外访问它。

如果将变量移到构造函数的正上方,并将其声明为Public(您希望从类内外访问变量(或Private(您只希望从类内访问变量(。一旦完成了这些操作,您就可以随时调用该变量。

然后你的代码看起来像这个

public SaveFileDialog sfd = new SaveFileDialog();
private void saveCSVbutton_Click(object sender, EventArgs e)
{
saveShipping();
saveATT();
saveVerizon();
String shippingPath = saveShipping();
MessageBox.Show(shippingPath);    
}  
private String saveShipping()
{
if (dataGridView1.Rows.Count > 0)
{
sfd.Filter = "CSV (*.csv)|*.csv";
sfd.FileName = "shippingOutput.csv";
bool fileError = false;
if (sfd.ShowDialog() == DialogResult.OK)
{
if (File.Exists(sfd.FileName)) 
{
try
{//overwrite file
File.Delete(sfd.FileName);
}
catch (IOException ex)
{
fileError = true;
MessageBox.Show("It wasn't possible to write the data to the disk." + ex.Message);
}
}
if (!fileError)
{
try
{
int columnCount = dataGridView1.Columns.Count;
string columnNames = "";
string[] outputCsv = new string[dataGridView1.Rows.Count + 1];
for (int i = 0; i < columnCount; i++)
{
columnNames += dataGridView1.Columns[i].HeaderText.ToString() + ",";
}
outputCsv[0] += columnNames;
for (int i = 1; i < dataGridView1.Rows.Count; i++)
{
for (int j = 0; j < columnCount; j++)
{
outputCsv[i] += dataGridView1.Rows[i - 1].Cells[j].Value.ToString() + ",";
}
}
File.WriteAllLines(sfd.FileName, outputCsv, Encoding.UTF8);
MessageBox.Show("Data Exported Successfully", "Info");
String attachPathName = sfd.FileName;
}
catch (Exception ex)
{
MessageBox.Show("Error :" + ex.Message);
}
}
}
}
else
{
MessageBox.Show("No Record To Export", "Info");
}
return attachPathName;
}

方法2您可以创建一个名为";SessionVariables.cs";和一个";SaveFileDialog sfd=新建SaveFileDialog(("变量,并将其声明为public。然后,您可以随时获取并设置该值。

我见过一些开发人员使用这种方法,特别是VB开发人员,但它仍然适用于C#。只需记住,每次使用时不要实例化新的SaveFileDialog,否则每次都会清除值。

我希望这对你有效,或者至少让你更接近解决方案。

您可以使用Path.GetDirectoryName(sfd.FileName)获取文件的完整路径

最新更新