1

これを行うC#アプリケーションを実行したい:

  1. フォルダを選択します
  2. そのフォルダからそのフォルダにすべてのファイルをコピーします+/results /

非常に単純ですが、機能させることができません。

これが私のコードです:

string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);
        foreach (string file in files)
        {
            MessageBox.Show(Path.GetFullPath(file));
            //string path=Path.Combine(Path.GetFullPath(file), "results");
            //MessageBox.Show(path);
            string path2 = Path.GetDirectoryName(file);
            path2 = Path.Combine(Path.GetDirectoryName(file), @"results\");
            path2 = Path.Combine(path2, file);
            MessageBox.Show(path2);
        }
4

3 に答える 3

6

最初に、宛先ディレクトリが存在しない場合は作成します

string[] files = Directory.GetFiles(folderBrowserDialog1.SelectedPath);  
string destPath = Path.Combine(folderBrowserDialog1.SelectedPath, "results");
if(Directory.Exists(destPath) == false)
    Directory.CreateDirectory(destPath);

次に、ループ内

    foreach (string file in files)  
    {  
        string path2 = Path.Combine(destPath, Path.GetFileName(file));  
        File.Move(file, path2);
    }  

File.Moveを使用して既存のファイルを上書きすることはできないことに注意してください。
ファイルが宛先ディレクトリに存在する場合、IOException が発生します。

コピーするだけの場合は、Move ではなく、File.Moveステートメントを で変更しFile.Copy(file, path2, true);ます。このオーバーロードにより、問題なく宛先ディレクトリ内のファイルが上書きされます。

于 2012-06-23T16:13:11.653 に答える
1

ファイルを (コピーではなく) 新しいサブフォルダーに移動しようとしている場合は...

DirectoryInfo d = new DirectoryInfo(folderBrowserDialog1.SelectedPath);
foreach (FileInfo f in d.GetFiles())
{
    string fold = Path.Combine(f.DirectoryName, @"results\");

    if (!Directory.Exists(fold))
        Directory.CreateDirectory(fold);

    File.Move(f.FullName, Path.Combine(fold, f.Name));
}

これは質問に直接答える例にすぎませんが、例外なども処理する必要があります。たとえば、この例では、ユーザーがディレクトリを作成する権限を持っていると想定しています。さらに、同じ名前のファイルが宛先ディレクトリにまだ存在しないと想定しています。このようなシナリオをどのように処理するかは、要件によって異なります。

于 2012-06-23T17:07:07.930 に答える
0

ディレクトリ全体を再配置する場合は、 を使用Directory.Moveしてこれを実現できます。

string path1 = Path.GetDirectoryName(file);
string path2 = Path.Combine(Path.GetDirectoryName(file), @"results\");
Directory.Move(path1, path2);

または、(最初のディレクトリを削除せずに) フォルダーをコピーするだけの場合は、手動で行う必要があります。

string path1 = Path.GetDirectoryName(file);
string path2 = Path.Combine(Path.GetDirectoryName(file), @"results\");

foreach(var file in Directory.GetFiles(path1))
{
    File.Copy(file, Path.Combine(path2, file));
    // File.Move(file, Path.Combine(path2, file)); // use this to move instead of copy
}

私はこれをテストしていないので、いくつかの変更が必要かもしれません

于 2012-06-23T16:12:51.577 に答える