如何实现“重试/中止”机制来写入可能被另一个进程使用的文件

本文关键字:另一个 进程 文件 机制 实现 何实现 中止 重试 | 更新日期: 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);
}