2

ダウンロードフォルダからディレクトリ内の特定のサブフォルダにファイルを移動するソフトウェアを作成しています。サブフォルダは、コンボボックスによってユーザーが選択します。私はこのエラーを繰り返し発生します:System.IO.IOException: Cannot create a file when that file already exists.また、これらのエラーは私のプログラムをインストールする人々のコンピュータで発生します...例外など。どうすればオフにできますか。また、なぜこのエラーが発生するのですか?これが私のコードです:

        string pathUser4 = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
        string pathDownload4 = (pathUser4 + @"\Downloads\");
        string sourceFile = pathDownload4 + listBox1.Text;

        string pathdoc5 = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        string pathDownload5 = (pathdoc5 + @"\iracing\setups\");
        string destinationFile = pathDownload5 + comboBox1.Text;

        File.Move(sourceFile, destinationFile);
        if (comboBox1.Text == "Select File Destination")
        {
            MessageBox.Show("Please Select A Destination Folder", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        }
4

3 に答える 3

4

IO操作がエラーなしで実行されることは決して期待できないため、各File.Moveはtry/catchブロックでラップする必要があります。これは、ユーザーがファイルハンドルを開いている、または宛先フォルダーに存在するファイルのような単純なものである可能性があります。いずれにしても、操作全体を停止する例外を1つのファイルでスローしたくない場合です。例外をキャッチして、エラーログファイルまたはイベントログのいずれかに記録する必要があります。これにより、発生したエラーを確認できますが、何も中断されません。

次に、デスクトップアプリケーションの場合、キャッチされなかったエラーをログに記録するためにグローバルエラー処理を追加します。これを行うには、プログラムの先頭にこのコードを配置します。

AppDomain.CurrentDomain.UnhandledException += (a, exception) => File.AppendAllText("errorlog.txt", exception.ToString() + "\n"

これにより、ユーザーは醜い例外がスローされるのを見ることができなくなります。また、ユーザーに.pdbファイルを提供しないようにしてください。例外により、コンパイルされたコンピューターのパスが例外に含まれ、クライアントに表示したくないユーザー名やその他の機密情報が含まれる可能性があります。


メインウィンドウが初期化されるときにグローバル例外処理を登録できます。例外がいつスローされるかわからないため、防御的に考える必要があるため、他のどの処理よりも先に実行する必要があります。

public partial class MainWindow : Window
{
    public MainWindow()
    {
        AppDomain.CurrentDomain.UnhandledException += (a, exception) => File.AppendAllText("errorlog.txt", exception.ToString() + "\n");
        InitializeComponent();
    }
}

C#は例外を広範囲に使用するため、このタイプのエラー処理に精通していない場合は、検討することをお勧めします。すべての例外はExceptionクラスから派生するため、catch(Exception e)を記述すると、すべての例外がキャッチされます(ベース参照は派生型のオブジェクトを保持できるため)。ただし、メソッドがスローする特定の例外がわかっている場合は、キャッチできます。より具体的な例外(常により一般的なキャッチの前)と特定の方法でそれを処理します。この例では、別の方法でキャッチして処理したいFile.Move()からのIOExceptionがある場合があります。

try 
{
    string pathUser4 = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
    string pathDownload4 = (pathUser4 + @"\Downloads\");
    string sourceFile = pathDownload4 + listBox1.Text;

    string pathdoc5 = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    string pathDownload5 = (pathdoc5 + @"\iracing\setups\");
    string destinationFile = pathDownload5 + comboBox1.Text;

    File.Move(sourceFile, destinationFile);
    if (comboBox1.Text == "Select File Destination")
    {
        MessageBox.Show("Please Select A Destination Folder", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    }
}
catch (Exception e)
{
    File.AppendAllText("ErrorLog.txt", e.ToString() + "\n");
}
于 2012-05-22T02:23:59.263 に答える
0

エラーは、コードまたは無効な入力が原因である可能性があります。

@Despertarが述べたように、すべてのプログラムにエラー処理とログ機能をコードに含めることをお勧めします。デバッグに非常に役立ちます。
ただし、自分で行うのではなく、オープンソースのログライブラリを使用することをお勧めします。たとえば、log4net、NLogなどです。

于 2012-05-22T02:44:19.533 に答える
0

MSDN for File.Moveのサンプルコードを使用すると、既存のファイルや基本的なエラー処理など、処理する必要のあるさまざまなことを指摘できます。

using System;
using System.IO;

class Test 
{
    public static void Main() 
    {
        string path = @"c:\temp\MyTest.txt";
        string path2 = @"c:\temp2\MyTest.txt";
        try 
        {
            if (!File.Exists(path)) 
            {
                // This statement ensures that the file is created,
                // but the handle is not kept.
                using (FileStream fs = File.Create(path)) {}
            }

            // Ensure that the target does not exist.
            if (File.Exists(path2)) 
            File.Delete(path2);

            // Move the file.
            File.Move(path, path2);
            Console.WriteLine("{0} was moved to {1}.", path, path2);

            // See if the original exists now.
            if (File.Exists(path)) 
            {
                Console.WriteLine("The original file still exists, which is unexpected.");
            } 
            else 
            {
                Console.WriteLine("The original file no longer exists, which is expected.");
            }           

        } 
        catch (Exception e) 
        {
            Console.WriteLine("The process failed: {0}", e.ToString());
        }
    }
}
于 2012-05-22T02:37:20.087 に答える