4

So the title might be bit misleading, but what I wanted to accomplish is reading an array of files and then combine them into one, which is where I am now.

The problem is that I have a catch that looks for the exception "FileNotFoundException", when this is called I want to continue my try statement (Using "continue") but let the user know that the file is missing.

My setup is a class that is called from a form (It's in the form where the error should show up)

I thought about creating an event that can be registered from my form, but is that the right way?

    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

メソッドがその役割を果たし、問題についてユーザーに報告する必要がありますよね? それからオデッドは正しいことを提案しました。少し変更すると、コードは次のようになります。

    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

例外を に収集し、List<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

をキャッチするFileNotFoundExceptionのではなく、ファイルが存在するかどうかを積極的にチェックし、存在しない場合はファイルを開こうとしないでください。

メソッドを変更して、マージされたファイルのリスト、欠落しているファイルのリスト、またはすべてのファイルのリストを、それらがマージされたか欠落しているかを示すインジケーターとともに返すことができます。単一のリストを返すと、呼び出し元は、イベントやコールバックの場合のように1つずつではなく、欠落しているファイルを一度に処理して、欠落しているファイルの数を知ることができます。

于 2012-09-23T18:39:28.813 に答える
0

Parallel.For やReactive Framework (rx) など、c# の新しい並列構造のドキュメントを参照してください。

最初に、例外はAggregateExceptionで収集され、Rx 例外はコールバック インターフェイスを介して通信されます。

私は Parallel.For で使用されているアプローチを好むと思いますが、シナリオに最も適したものを選択してください。

于 2012-09-23T18:33:44.047 に答える