我目前有下面的代码将一些数据保存到.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());
}
答案 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());
}
类似于第二种解决方案,但
myProcess.Start("CMD.exe","taskkill /FI "WindowTitle eq Microsoft Excel - filename.xls");