【问题标题】:Using Try/Catch to test four File.Move tasks to see if file exists使用 Try/Catch 测试四个 File.Move 任务,看文件是否存在
【发布时间】:2019-01-11 17:56:43
【问题描述】:

首先我应该说我是 C# 新手。我在脚本中有四行代码,每行代码都重命名特定目录中的文件。为了让我的程序成功运行,它需要这四个文件,并且这些文件需要命名为一个特定的名称。这些代码行是单独处理的,因此如果找到文件,第一行可以重命名文件,但如果找不到文件,第二行可能会出错。另一种情况可能是,如果找不到要查找的特定文件,则第一行代码会出错,并且由于脚本暂停,其余代码行将无法处理。我将这些脚本行添加到一次尝试中,并将尝试单独捕获每个异常,但由于代码没有超过产生错误的第一行代码,因此这种方法似乎不起作用。

如果缺少一个文件,我想将丢失文件的名称(或特定消息)存储在一个变量中。如果缺少多个文件,我想将多条消息存储在要通过 SSIS 包发送的变量中。

File.Move(fileDirectory_Dest + "EOYReportPRF.xls", fileDirectory_Dest + "EOY_PRF.xls");
File.Move(fileDirectory_Dest + "PayrollEOY.xls", fileDirectory_Dest + "EOY_SU.xls");
File.Move(fileDirectory_Dest + "PRFFundingStatement.xls", fileDirectory_Dest + "FS_PRF.xls");
File.Move(fileDirectory_Dest + "SUFundingStatement.xls", fileDirectory_Dest + "FS_SU.xls");

我想循环浏览所有四行代码并将错误文本存储在我的 SSIS 包中名为 User::MessageText 的变量中。然后我将使用此变量向用户发送电子邮件,但我可以处理这部分。

更新: 添加整个sn-p代码有助于了解当前情况。

try
            {
                foreach (FileInfo fi in dirInfo_Source.EnumerateFiles())
                {

                    string newFileName = Regex.Replace(Path.GetFileNameWithoutExtension(fi.Name), "[0-9]|[.,/ -]", "").TrimEnd()+ fi.Extension;
                    fi.MoveTo(fileDirectory_Dest + newFileName);
                    //i++;.Replace(" ", "_") + i 

                }
                ///Rename Files
                File.Move(fileDirectory_Dest + "EOYReportPalladia.xls", fileDirectory_Dest + "EOY_Palladia.xls");
                File.Move(fileDirectory_Dest + "PayrollEOY.xls", fileDirectory_Dest + "EOY_SUS.xls");
                File.Move(fileDirectory_Dest + "PRFFundingStatement.xls", fileDirectory_Dest + "FS_Palladia.xls");
                File.Move(fileDirectory_Dest + "SUSFundingStatement.xls", fileDirectory_Dest + "FS_SUS.xls");
            }
            catch (Exception ex)
            {
                MessageBox.Show(fileDirectory_Dest);
                MessageBox.Show(ex.Message.ToString());
            }

【问题讨论】:

  • 永远不要使用异常来驱动你的逻辑。顺便说一句,你为什么不使用 File.Exists?
  • 感谢您的提示。我编辑了我的请求以表明我是新来的。我仍然需要测试文件是否丢失,但并不真正知道实现目标的最佳、最有效的方法。如果我使用 File.Exists,而该文件不存在,那也不例外吗?
  • @Steve 文件访问无论如何都需要异常处理 - 也许目的地是不可写的?在 IO 的情况下,它通常是规则的“例外”。
  • @user2864740 所以一个异常的异常...
  • 如何使用循环移动文件,存储所有异常消息/详细信息以报告?确保将可恢复和不可恢复的案例分开。文件名可能是被循环的序列,例如。

标签: c# ssis


【解决方案1】:

当您可以使用成本较低的方式进行检查时,请避免使用异常。当然,在处理文件时,您总是会遇到“异常”情况,这是异常处理的正确工作

您可以在运行 File.Move 代码块之前检查文件是否存在

try
{
    string fileDirectory_Dest = @"E:\temp\";
    List<string> files = new List<string>
    {
        fileDirectory_Dest + "EOYReportPRF.xls",
        fileDirectory_Dest + "PayrollEOY.xls",
        fileDirectory_Dest + "PRFFundingStatement.xls",
        fileDirectory_Dest + "SUFundingStatement.xls"
    };
    var errors = files.Where(x => !File.Exists(x)).Select(x => x);
    if(errors.Any())
        Console.WriteLine("Files missing\r\n" + string.Join(Environment.NewLine, errors));
}
catch
{
    Logger.Error("Error processing files");
    throw; 
}

【讨论】:

  • 我将尝试将此应用到代码中,看看它会将我带到哪里,谢谢!
  • 史蒂夫,看起来我应该能够在移动和标准化文件名的循环中应用这个。这样更有效率吗?当循环找到文件并尝试移动它时,我不能测试是否存在匹配并将其存储在日志中吗?我用执行任务的代码的 sn-p 更新了我的原始帖子。
  • 嗯,这个想法是在尝试对它做任何事情之前检查 File.Exists 是否存在。所以我想你可以将逻辑添加到你的循环中。检查文件是否存在比重复出现异常要有效得多。即使使用单个文件,您也可以注意到差异
  • Logger.Error() 行说明当前上下文中不存在 Logger。这是内置功能吗?
  • 谢谢,史蒂夫。我从论坛上发帖学到了很多东西,感谢您的耐心等待。
【解决方案2】:

我发现这个解决方案对我来说是最好的。易于理解和错误处理可以轻松更改。您可以单独处理错误消息

using System.IO;
using System;

...

try
{
    File.Move(fileDirectory_Dest + "EOYReportPRF.xls", fileDirectory_Dest + "EOY_PRF.xls");
    File.Move(fileDirectory_Dest + "PayrollEOY.xls", fileDirectory_Dest + "EOY_SU.xls");
    File.Move(fileDirectory_Dest + "PRFFundingStatement.xls", fileDirectory_Dest + "FS_PRF.xls");
    File.Move(fileDirectory_Dest + "SUFundingStatement.xls", fileDirectory_Dest + "FS_SU.xls");
}
catch (UnauthorizedAccessException e)
{
    // UnauthorizedAccessException code here 
    Console.WriteLine(e.Message);
}
catch (DirectoryNotFoundException e)
{
    // DirectoryNotFoundException code here 
    Console.WriteLine(e.Message);
}
catch
{
    // ... other Errors
    Console.WriteLine("Other Errors");
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 2019-04-06
    • 2020-09-14
    • 1970-01-01
    相关资源
    最近更新 更多