4

所以标题可能有点误导,但我想要完成的是读取一组文件,然后将它们组合成一个,这就是我现在所处的位置。

问题是我有一个查找异常“FileNotFoundException”的捕获,当它被调用时,我想继续我的 try 语句(使用“继续”)但让用户知道文件丢失。

我的设置是一个从表单调用的类(它是应该显示错误的表单)

我想过创建一个可以从我的表单注册的事件,但这是正确的方法吗?

    public void MergeClientFiles(string directory)
    {
        // Find all clients
        Array clients = Enum.GetValues(typeof(Clients));

        // Create a new array of files
        string[] files = new string[clients.Length];

        // Combine the clients with the .txt extension
        for (int i = 0; i < clients.Length; i++)
            files[i] = clients.GetValue(i) + ".txt";

        // Merge the files into directory
        using (var output = File.Create(directory))
        {
            foreach (var file in files)
            {
                try
                {
                    using (var input = File.OpenRead(file))
                    {
                        input.CopyTo(output);
                    }
                }
                catch (FileNotFoundException)
                {
                    // Its here I want to send the error to the form
                    continue;
                }
            }
        }
    }
4

5 回答 5

3

您希望该方法能够完成工作并向用户报告问题,对吗?然后 Oded 提出了正确的建议。稍加修改,代码可能如下所示:

    public List<string> MergeClientFiles( string path )
    {
        // Find all clients
        Array clients = Enum.GetValues( typeof( Clients ) );

        // Create a new array of files
        string[] files = new string[clients.Length];

        // Combine the clients with the .txt extension
        for( int i = 0; i < clients.Length; i++ )
            files[i] = clients.GetValue( i ) + ".txt";
        List<string> errors = new List<string>();

        // Merge the files into AllClientData
        using( var output = File.Create( path ) ) {
            foreach( var file in files ) {
                try {
                    using( var input = File.OpenRead( file ) ) {
                        input.CopyTo( output );
                    }
                }
                catch( FileNotFoundException ) {
                    errors.Add( file );
                }
            }
        }
        return errors;
    }

然后,在调用者中,您只需检查 MergeClientFiles 是否返回非空集合。

于 2012-09-23T18:28:19.550 回答
2

您可以将异常收集到 aList<FileNotFoundException>中,并且在迭代结束时,如果列表为空,则抛出自定义异常,将此列表分配给相应的成员。

这将允许任何调用上述代码的代码捕获您的自定义异常,遍历FileNotFoundExceptions 并通知用户。

于 2012-09-23T18:21:25.830 回答
1

您可以定义一个委托作为方法的参数传递。

public delegate void FileNotFoundCallback(string file);

public void MergeClientFiles(string directory, FileNotFoundCallback callback)
{
    // Find all clients
    Array clients = Enum.GetValues(typeof(Clients));

    // Create a new array of files
    string[] files = new string[clients.Length];

    // Combine the clients with the .txt extension
    for (int i = 0; i < clients.Length; i++)
        files[i] = clients.GetValue(i) + ".txt";

    // Merge the files into directory
    using (var output = File.Create(directory))
    {
        foreach (var file in files)
        {
            try
            {
                using (var input = File.OpenRead(file))
                {
                    input.CopyTo(output);
                }
            }
            catch (FileNotFoundException)
            {
                // Its here I want to send the error to the form
                callback( file );
                continue;
            }
        }
    }
}
于 2012-09-23T18:24:27.040 回答
0

如需一些灵感,请查看 c# 中新的并行结构的文档,例如 Parallel.For 和Reactive Framework (rx)。

首先,异常在AggregateException中收集,在 Rx 中,异常通过回调接口进行通信。

我认为我更喜欢 Parallel.For 中使用的方法,但请选择最适合您的场景的方法。

于 2012-09-23T18:33:44.047 回答
0

而不是捕获FileNotFoundExceptions 您应该主动检查文件是否存在,如果不存在则不要尝试打开它。

您可以更改方法以返回合并文件列表、丢失文件列表或所有文件列表以及是否合并或丢失的指示符。返回单个列表使调用者可以选择一次处理所有丢失的文件并知道丢失了多少文件,而不是像事件或回调那样逐个处理。

于 2012-09-23T18:39:28.813 回答