12

ROBOCOPY コマンドを使用して、サイズが ~50 KB の多数のファイル (~100,000) をコピーするファイル コピー プログラムを作成しています。

ファイルごとに新しいプロセスを作成し、次のように ROBOCOPY コマンドと引数を渡します。

using (Process p = new Process)
{
    p.StartInfo.Arguments = string.Format("/C ROBOCOPY {0} {1} {2}", 
            sourceDir, destinationDir, fileName);
    p.StartInfo.FileName = "CMD.EXE";
    p.StartInfo.CreateNoWindow = true;
    p.StartInfo.UseShellExecute = false;                    
    p.Start();
    p.WaitForExit(); 
} 

ファイルごとにプロセスを作成する代わりに、パフォーマンスとデザインの点で優れたアプローチを探しています。誰かがより良い方法を提案できますか?

4

5 に答える 5

22

この質問は少し古いですが、まだそれに着地している人を助けるために答えると思いました. Robocopy のすべての利点を C# にもたらすRoboSharp ( https://github.com/tjscience/RoboSharp ) というライブラリを作成しました。C# で Robocopy の機能が必要な場合は、こちらをご覧ください。

于 2014-04-22T04:07:55.777 に答える
5
Process p = new Process();
p.StartInfo.Arguments = string.Format("/C Robocopy /S {0} {1}", "C:\\source", "C:\\destination");
p.StartInfo.FileName = "CMD.EXE";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.UseShellExecute = false;
p.Start();
p.WaitForExit(); 

/C Robocopy -> this is a command to run robocopy
/S -> This will help to copy sub folders as well as Files
于 2016-07-28T06:55:32.667 に答える
2

File.Copyループで呼び出す必要があります。

于 2011-10-25T14:24:30.987 に答える
2

System.IO を使用します。十分に高速である必要があり、ファイル名はワイルドカードにすることができます。

using System.IO;
// snip your code... providing fileName, sourceDir, destinationDir
DirectoryInfo dirInfo = new DirectoryInfo(sourceDir);
FileInfo[] fileInfos = dirInfo.GetFiles(fileName);
foreach (FileInfo file in fileInfos)
{
    File.Copy(file.FullName, Path.Combine(destinationDir, file.Name), true);  // overwrites existing
}
于 2011-10-25T14:39:47.377 に答える
-1

.cmd には次の行があります

Start ROBOCOY src dest a* b* c*    /z /w:1 r:1
Start ROBOCOY src dest d* e* f* g* /z /w:1 r:1
Start ROBOCOY src dest h* K* P* Y*  /z /w:1 r:1
Start ROBOCOY src dest xry* srp*  /z /w:1 r:1

> Robocopy sample.cmd を実行すると、上記のコマンドに従ってファイルを同時にコピーする 4 つの複数のウィンドウから開始します。ファイルが別のプロセスで使用されている場合、待機時間があるため、別のファイルを待ちます。同時に仕事をするので、より高速です。


現在、コマンドコンソールに移動して開始する代わりに、C#ウィンドウを使用してプロセスを実行するGUIを開発しています

  main()
  { 
  process.start( "path of sample.cmd" )
  process.waitforexit()
  label.text=" sucessful copy"
  }

ただし、1 つのプロセス、つまり cmd.exe を制御し、タスクマネージャーに 4 つの robocopy プロセスがある場合。cmd.exe プロセスが完了すると、カーソルが label.text "正常に完了しました" に戻ります。まだ実行中の robocopy プロセスがあります。コピー プロセスを実行している robocopy ウィンドウを確認できます。

ここに質問があります: すべてのプロセス (cmd.exe および robocopy.exe) を C# でプログラムによって制御したいので、すべてのコマンドが正常に完了した場合にのみ、label.text が「正常に完了しました」と表示されるようにします。 1 つが失敗すると、GUI には意味がありません。

オプション 2 (上で Biju が書いたものと同様): sample.cmd(バッチ ファイル) ファイルから robocopy コマンド スクリプトを削除し、C# で 4 つの robocopy 行を実行するコードを記述した方がよいのですが、robocooy スクリプト行を実行する方法が書かれています。 cmd ファイルにも引数があるためです。コードは各 robocopy プロセスを実行し、それぞれが次のコード行に戻ります。失敗した場合は、エラーをキャッチしてメッセージ ボックスに表示できます。

これが役立つことを願っています...ただし、誰かが同じことを改善できる場合は、より良い方法を探しています。

于 2013-09-03T06:56:35.430 に答える