保存到.csv

时间:2018-07-10 20:40:50

标签: c# savefiledialog

我目前有下面的代码将一些数据保存到.csv文件中。一切正常,但是我遇到的一个问题是.csv文件是否打开,并且您尝试保存新的数据集导致应用程序崩溃。我认为将其设置为只读将防止此问题,但是我不确定如何做到这一点。例如。如果最后一个文件保存在C:\ Users \ Documents \ data.csv,并且用户打开了该data.csv文件。然后,用户使用相同的路径保存另一组数据,然后应用程序崩溃。

SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.FileName = tbSave.Text;
saveFileDialog.Filter = ".csv|*.csv";
if(saveFileDialog.ShowDialog() == DialogResult.OK)
{
    File.WriteAllText(saveFileDialog.FileName, sb.ToString());
    MessageBox.Show("Save Complete!" + "\n" + "Number of skips recorded: " + skips.ToString() + "\n" + "Elasped time recorded (ms): " + time.ToString());
}

2 个答案:

答案 0 :(得分:1)

我将保存的文件设为只读。这样可以确保它不能被覆盖,并且如果打开excel文件,应用程序也不会崩溃。在我的目的范围内,此解决方案很好用。

SaveFileDialog saveFileDialog = new SaveFileDialog();
saveFileDialog.FileName = tbSave.Text;
saveFileDialog.Filter = ".csv|*.csv";
if(saveFileDialog.ShowDialog() == DialogResult.OK)
{    
    File.WriteAllText(saveFileDialog.FileName, sb.ToString());
    File.SetAttributes(saveFileDialog.FileName, FileAttributes.ReadOnly);
    MessageBox.Show("Save Complete!" + "\n" + "Number of skips recorded: " + skips.ToString() + "\n" + "Elasped time recorded (ms): " + time.ToString());
}

答案 1 :(得分:0)

您无法将数据写入Excel打开的文件中。这是问题的核心问题。

解决方案:必须先关闭文件,然后再写入文件。

为此,您必须处理用户正在打开文件的情况。

if(saveFileDialog.ShowDialog() == DialogResult.OK)
{
    try{
        File.WriteAllText(saveFileDialog.FileName, sb.ToString());
    }
    catch(Exception ex)
    {
        //file is being opened.
    }
}

catch部分中,您可以执行3个选择: 1.您要求用户关闭文件,然后返回到您的应用程序。

catch(Exception ex)
{
     //file is being opened.
     MessageBox.Show("close file xxx please, then redo your work");
}

2。一个更优雅的解决方案是提醒用户我们将关闭Excel。我们喜欢吗?是的,我们将杀死所有进程Excel,并继续执行您的代码。

    catch(Exception ex)
    {
         //file is being opened.
         MessageBox.ShowDialog("Kill all Excel?") == No
         return;

         Process myProcess = new Process();
         myProcess.EnableRaisingEvents = true;
         myProcess.Exited += new EventHandler(myProcess_Exited);
         myProcess.Start("CMD.exe","taskkill /f /im excel.exe");         
    }

private void myProcess_Exited(object sender, System.EventArgs e)
    {

        eventHandled = true;
        File.WriteAllText(saveFileDialog.FileName, sb.ToString());
    }
  1. 更困难的解决方案是仅删除文件的一个实例Excel。但这会创建异常,因为我们无法正确处理Excel的行为

类似于第二种解决方案,但

myProcess.Start("CMD.exe","taskkill /FI "WindowTitle eq Microsoft Excel - filename.xls");