Catching IOException

本文关键字:IOException Catching | 更新日期: 2023-09-27 18:32:49

我正在编写一个 C# 应用程序,如果某个进程已经在使用文件,并且如果该文件不存在,则应用程序需要显示另一条消息,则必须在其中显示一条消息。

像这样:

try 
{
    //Code to open a file
}
catch (Exception e)
{
    if (e IS IOException)
    {
        //if File is being used by another process
        MessageBox.Show("Another user is already using this file.");
        //if File doesnot exist
        MessageBox.Show("Documents older than 90 days are not allowed.");
    }
}

由于IOException涵盖了这两种情况,因此如何区分是否由于另一个进程正在使用 File 或 File 不存在而捕获此异常?

任何帮助将不胜感激。

Catching IOException

始终从最具体到最通用的异常类型捕获。每个异常都继承Exception -class,因此您将在 catch (Exception) 语句中捕获任何异常

这将分别过滤 IOExceptions 和其他所有内容:

catch (IOException ioEx)
{
     HandleIOException(ioEx);
}
catch (Exception ex)
{
     HandleGenericException(ex);
}

所以抓住Exception永远持久。检查是否可能,但不常见。

关于您的问题:

if (File.Exists(filePath)) // File still exists, so obviously blocked by another process

这将是分离您的条件的最简单解决方案。

正如你在这里看到的 File.OpenRead 可以抛出这些异常类型

  1. 参数异常
  2. ArgumentNullException
  3. PathTooLongException
  4. DirectoryNotFoundException
  5. UnauthorizedAccessException
  6. FileNotFoundException
  7. 不支持异常

对于每种异常类型,您都可以通过这种方式处理它

try{
}
catch(ArgumentException e){
  MessageBox.Show("ArgumentException ");
}
catch(ArgumentNullExceptione e){
 MessageBox.Show("ArgumentNullExceptione");
}
.
.
.
.        
catch(Exceptione e){
     MessageBox.Show("Generic");
}

在您的情况下,您可以只处理一种或两种类型,而其他类型总是被泛型Exception捕获(它必须始终是最后一个,因为所有异常都包含)

尝试以下操作:

try
{
  //open file
}
catch (FileNotFoundException)
{
  MessageBox.Show("Documents older than 90 days are not allowed.");
}
catch (IOException)
{
  MessageBox.Show("Another user is already using this file.");
}

更多信息: http://www.dotnetperls.com/ioexception

我知道

这很旧,但唯一一致的解决方案是按 HResult 属性过滤捕获块。我不知道是哪一个,但这里有一个复制文件并捕获文件是否已存在的示例:

        try
        {
            File.Copy(source, dest, false); // Try to copy the file normally
        }
        catch (IOException e) when (e.HResult == -2147024816) // 0x80070050 : The file already exists
        {
             // Prompt user for overwrite...
        }

查阅 .NET 引用源并跟踪 Win32 调用以查找返回的 HResult。

当文件不存在时,它将抛出继承 IOException 的 FileNotFoundException,所以你可以这样写:

try 
{
    //file operate
}
catch (FileNotFoundException ex)
{
    MessageBox.Show("Documents older than 90 days are not allowed.");
}
catch (IOException ex)
{
    MessageBox.Show("Another user is already using this file.");
}