0

我正在使用 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;
    }
4

2 回答 2

0

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

于 2022-01-26T10:05:51.617 回答
0

我能想到两种方法可以让你保持简单,但它们的工作方式相同,这取决于你的要求。我将称之为方法 1 和 2。

方法一。

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

如果将变量移动到构造函数的正上方并将其声明为公共(您希望从类内部和外部访问变量)或私有(您只想从类内部访问变量)。完成此操作后,您应该可以随时调用该变量。

您的代码将看起来像这样

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 = new SaveFileDialog();” 变量并将其声明为公共。然后,您可以随时获取和设置该值。

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

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

于 2022-01-26T12:06:41.343 回答