如何实现“重试/中止”机制来写入可能被另一个进程使用的文件
本文关键字:另一个 进程 文件 机制 实现 何实现 中止 重试 | 更新日期: 2023-09-27 18:30:39
这真的是一个简短的问题。我完全不理解尝试捕获机制。
这是我当前的代码:
public static void WriteText(string filename, string text)
{
try
{
System.IO.StreamWriter file = new System.IO.StreamWriter(filename);
file.Write(text);
file.Close();
}
catch(Exception exc)
{
MessageBox.Show("File is probably locked by another process.");
}
}
背景:
我正在编写与另一个应用程序共享配置文件的应用程序。
当该文件被其他应用程序使用时,我需要一些带有"重试"和"中止"按钮的对话框消息框。当该消息出现时 - 我将关闭另一个应用程序,我将尝试通过按"重试"按钮再次重写该文件。
我们所拥有的是使用计数器进行重试,并可能使用线程睡眠。
所以像
int tries = 0;
bool completed = false;
while (!completed)
{
try
{
System.IO.StreamWriter file = new System.IO.StreamWriter(filename);
file.Write(text);
file.Close();
completed = true;
}
catch(Exception exc)
{
tries++;
//You could possibly put a thread sleep here
if (tries == 5)
throw;
}
}
即使已经有一个很好的答案,我也会提交一个更针对 OP 问题的答案(让用户决定而不是使用计数器)。
public static void WriteText(string filename, string text)
{
bool retry = true;
while (retry)
{
try
{
System.IO.StreamWriter file = new System.IO.StreamWriter(filename);
file.Write(text);
file.Close();
retry=false;
}
catch(Exception exc)
{
MessageBox.Show("File is probably locked by another process.");
// change your message box to have a yes or no choice
// yes doesn't nothing, no sets retry to false
}
}
}
如果您需要有关如何实现消息框的更多信息,请查看以下链接;
http://msdn.microsoft.com/en-us/library/0x49kd7z.aspx
消息框按钮?
我会这样做:
public static void WriteText(string filename, string text, int numberOfTry = 3, Exception ex = null)
{
if (numberOfTry <= 0)
throw new Exception("File Canot be copied", ex);
try
{
var file = new System.IO.StreamWriter(filename);
file.Write(text);
file.Close();
}
catch (Exception exc)
{
WriteText(filename,text,--numberOfTry,ex);
}
}
我更喜欢这样(示例尝试在关闭时保存 RichTextBox,并允许重试保存或中止关闭):
protected override void OnClosing(CancelEventArgs e)
{
if (richTextBox_Query.Modified)
{
DialogResult result;
do
try
{
richTextBox_Query.SaveFile(
Path.ChangeExtension(Application.ExecutablePath, "sql"),
RichTextBoxStreamType.UnicodePlainText);
result = DialogResult.OK;
richTextBox_Query.Modified = false;
}
catch (Exception ex)
{
result = MessageBox.Show(ex.ToString(), "Exception while saving sql query",
MessageBoxButtons.AbortRetryIgnore);
e.Cancel = result == DialogResult.Abort;
}
while (result == DialogResult.Retry);
}
base.OnClosing(e);
}