Return 使用 saveFileDialog 保存文件后的路径名 - C#

Return the pathname after saving file using saveFileDialog - C#

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

下面的代码是我一直在尝试的,只是 return 路径名,但它实际上只会 returning 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;
    }

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

我能想到有 2 种方法可以让您的操作变得简单,但它们的工作方式相同,这取决于您的要求。我将把它称为方法 1 和 2。

方法一.

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

如果您将变量移动到构造函数的正上方并将其声明为 Public(您希望从 class 内部和外部访问变量)或声明为 Private(您只希望访问到 class 中的变量)。完成后,您应该可以随时调用变量。

您的代码将如下所示

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;
}

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

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

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