Я создаю и сохраняю файл csv, используя saveFileDialog. Мне нужно найти способ запомнить pathName, под которым человек сохраняет файл, чтобы я мог использовать pathName для файла позже в коде.

Приведенный ниже код - это то, что я пытался вернуть, просто чтобы вернуть 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;
    }
0
Elaine 26 Янв 2022 в 12:48

2 ответа

Лучший ответ

Вы можете использовать Path.GetDirectoryName(sfd.FileName), чтобы получить полный путь к файлу

0
Preslav Tsenov 26 Янв 2022 в 13:05
Спасибо, что работает
 – 
Elaine
26 Янв 2022 в 13:23

Есть два способа, которые, как я могу придумать, упростят вам задачу, но они оба работают одинаково, это зависит от ваших требований. Я просто назову это Методом 1 и 2.

Метод 1.

У 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 каждый раз, когда вы его используете, иначе значения будут очищаться каждый раз.

Я надеюсь, что это сработает для вас или, по крайней мере, приблизит вас к решению.

0
Zane Alberts 26 Янв 2022 в 15:06