尝试不重写文件并将其保存在 C# 的新位置时出现意外的系统异常

Posted

技术标签:

【中文标题】尝试不重写文件并将其保存在 C# 的新位置时出现意外的系统异常【英文标题】:unexpected system exception while trying not to rewrite a file and saving it in new location in C# 【发布时间】:2013-09-06 07:00:11 【问题描述】:

我在应用程序中使用 savefiledialog 来保存文件。如果相同的文件名已经存在,我会弹出一个询问我是否要替换的窗口。如果我给 no 我会收到意外的系统异常。以下是部分代码

string fname1 = "";

saveFileDialog.Title = "Save the Proofer Report";
saveFileDialog.Filter = "Excel Files (*.xls)|*.xls";
saveFileDialog.FilterIndex = 0;
saveFileDialog.InitialDirectory = "MyDocuments";
saveFileDialog.FileName = "Proofer Report";
aveFileDialog.AddExtension = true;
saveFileDialog.ShowHelp = true;

// saveFileDialog.ShowDialog();

Invoke((Action)(() =>  saveFileDialog.ShowDialog(); ));
fname1 = saveFileDialog.FileName;


                xlWorkBook.SaveAs(fname1, Excel.XlFileFormat.xlWorkbookNormal,       misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue);
 //system exception during save as
                xlWorkBook.Close(true, misValue, misValue);
                xlApp.Quit();

堆栈跟踪

在 Microsoft.Office.Interop.Excel._Workbook.SaveAs(对象文件名, 对象 FileFormat、对象密码、对象 WriteResPassword、对象 ReadOnlyRecommended、对象 CreateBackup、XlSaveAsAccessMode AccessMode, 对象 ConflictResolution, 对象 AddToMru, 对象 TextCodepage,对象 TextVisualLayout,对象本地)在 ProoferXML.MainForm.ProcessDocument(BackgroundWorker 工作者, DoWorkEventArgs e) 在 D:\ProoferXML\WindowsFormsApplication1\WindowsFormsApplication1\MainForm.cs:line 665 在 ProoferXML.MainForm.prooferWorker_DoWork(对象发件人, DoWorkEventArgs e) 在 D:\ProoferXML\WindowsFormsApplication1\WindowsFormsApplication1\MainForm.cs:line 第1457章

使用 workbook.saveAs 保存 excel 时从 HRESULT 获取异常:

【问题讨论】:

我们能看到完整的代码(有保存)吗?什么类型的异常? 请发表您的例外情况 向我们展示您遇到的异常以及您遇到异常的行 我们无法分辨哪一行是第 1,457 行。 xlWorkBook.SaveAs(fname1, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue, misValue); //另存为时系统异常 【参考方案1】:

您很可能必须注意您正在使用的线程模型。建议在调用 Invoke 之前检查 InvokeRequired。 所以你的代码应该是这样的:

 if (InvokeRequired)
 
   Invoke((Action)(() =>  saveFileDialog.ShowDialog(); ));
 
 else
 
   saveFileDialog.ShowDialog();
 

一些更有用的阅读 Invoke Invoke(Delegate)

【讨论】:

在另存为时出现错误 --- xlWorkBook.SaveAs(fname1, Excel.XlFileFormat.xlWorkbookNormal, misValue, misValue, misValue, misValue, Excel.XlSaveAsAccessMode.xlExclusive, misValue, misValue, misValue, misValue , 错误值) 使用 workbook.saveAs 保存 excel 时从 HRESULT 获取异常: 你可以尝试使用 Application.DisplayAlerts = false;在调用 SaveAs 以防止 Excel 生成覆盖警告之前。

以上是关于尝试不重写文件并将其保存在 C# 的新位置时出现意外的系统异常的主要内容,如果未能解决你的问题,请参考以下文章

C# 保存文件 - (删除并重写?)

在 C# 中播放 byte[] [关闭]

扫描图像并将其像 pdf 一样保存到数据库 c#

C# 如何从 Outlook 的共享邮箱发送邮件并将其保存在已发送文件夹中

C#通过WebAPI控制器将Excel xls发送到js并将其保存为文件

QNetworkAccessManager 读取传出数据并将其保存在 QIODevice