在C#中处理失败的文件和目录操作

时间:2013-02-15 15:02:03

标签: c# file-io error-handling installer

问题:在安装过程中,会创建,移动和重命名文件和文件夹。服务也在安装期间启动和停止,这可能导致一个或多个文件或文件夹上的锁定问题。我有一个避免大多数锁定方案的解决方案,但希望有一种更好的方法,不会浪费时间或CPU,并且会阻止用户尽可能地处理中止/重试/忽略对话框。

后台:在最佳方案中,处理服务启动和停止的逻辑以及将锁定在文件和文件夹上的其他操作将阻止锁定在创建时仍然存在发生安装程序的/ move / rename部分。在这种情况下,我无法控制安装过程的那些部分,但我确实需要尽量避免在无法更改文件或文件夹时尽可能显示用户错误对话框。

我无法简单地循环很长一段时间,因为存在第三方应用程序锁定必要资源的合法错误情况,我们需要能够及时向用户显示此信息,并向他们显示有关的信息违规的过程。但是,我的用例中有很多误报,我想尽量减少用户干预。

我目前的解决方案看起来像这样:

private const int MaxRetry = 3;
private const int RetryDelayMs = 250;

private static bool DoAction(FileSystemAction action, String src, String dest = "")
{
    bool retval = false;
    bool inprogress = true;

    // (Re)Attempt to perform the desired action until the user aborts.
    while (inprogress)
    {
        try
        {
            // Automatically retry N times with a delay of M milliseconds.
            // This is meant to reduce the number of times a user sees an error dialog.
            var autoretry = true;
            var retryCounter = 0;
            while (autoretry)
            {
                try
                {
                    // CODE: Attempt to perform the file system action.

                    // Only get here if we succeeded.
                    autoretry = false;
                }
                catch (Exception)
                {
                    // If this operation failed, try a few times.
                    if (retryCounter >= MaxRetry)
                        throw;
                    retryCounter++;
                    Thread.Sleep(RetryDelayMs);
                }
            }

            // If we get here without exception, success!
            inprogress = false;
            retval = true;
        }
        catch (Exception ex)
        {
            // Since there was an error, we now do the following:
            //   - Determine if locked files are the cause.
            //   - If locked files are the cause:
            //       - Show a custom Locked File dialog, providing information.
            //   - Otherwise:
            //       - Select message string based on action to inform the user.
            //       - Allow the user to Retry/Abort/Ignore the failed operation.

            // CODE: Logic goes here.
        }
    }

    return retval;
}

当我第一次写这个逻辑时,我浏览了几个处理锁定文件和失败的文件系统操作的例子;但是,我不满足于这个解决方案,因为它不会阻止用户在所有误报情况下(在有竞争条件的情况下)看到对话框。有没有能够改写违规服务逻辑的任何想法?

0 个答案:

没有答案