2

提供されたコンピューターのリストにコピーして作成したインストーラーを作成するアプリケーションを作成しようとしています。入力にコンピューター名が 1 つしかない場合でも完全に機能しますが、2 つ以上を追加すると、使用中のためソース ファイルから読み取れないことがわかります。

更新: これが単に失われた原因である場合、これを実行する他の方法を受け入れます。私の最終目標は、同じファイルをデータセンター内の 500 台のコンピューターにできるだけ速くコピーすることです。次に、これらの各コンピューターでファイルを実行します。現在、実行のために psexec -s を使用しているため、UAC をバイパスできます。

/*Button Click Code Below*/
/*Install for specific OS*/
foreach (string line in txtServers.Lines)
{
    machine = line;
    lbOutput.Items.Add("Preparing to copy files....");

    /*Copy Files*/
    if(!tWorker.IsAlive)
         tWorker.Start();

    lbOutput.Items.Add("File Copy Complete! Executing installer....");
}

/*File Copy Code Below*/
try
{
   File.Copy("Ionic.Zip.Reduced.dll",@"\\"+machine+@"\C$\Temp\Ionic.Zip.Reduced.dll",true);
   File.Copy("v5.32bit.Install.exe", @"\\" + machine + @"\C$\Temp\v5.32bit.Install.exe", true);
}
catch (Exception ee)
{
   MessageBox.Show(ee.Message);
}
4

4 に答える 4

3

これにアプローチする別の方法は、ファイルをメモリにキャッシュすることです....

何かのようなもの

  var filesToLoad = new[] {"a.txt", "b.txt"}.ToList();
  var files = new Dictionary<string, byte[]>();
  filesToLoad.ForEach(f => files.Add(f, File.ReadAllBytes(f)))

それからあなたがそれらを書きたいとき

files.Keys.ToList()
   .ForEach(f => File.WriteAllBytes(Path.Combine(machinePath, f), files[f]));
于 2013-06-20T21:26:04.220 に答える
0

わかりましたので、激しい欲求不満の夜の後、これを理解するために少し睡眠が必要だったようです.

私はもともとボタンクリックイベントで foreach を実行していましたが、その foreach でスレッドを開始していたので、他のすべてのステータスに関係なく続行しました。それ以来、その foreach をスレッドに移動し、問題は解決しました。一度に複数の場所にコピーできるようになりました。かなり高速であると言わざるを得ません。

いつものように助けてくれてありがとう!

于 2013-06-21T12:40:09.200 に答える
0

フラグを指定しない場合は、CopyFileExを呼び出すことでこれを実行できる場合があります。COPY_FILE_OPEN_SOURCE_FOR_WRITE

CopyFileEx数年前にC# ラッパーを公開しました。より良い File.Copy の置き換えを参照してください。それがあなたが望むことをするかどうかはわかりませんが(ファイルを複数のスレッドで開くことを許可します)、おそらく試してみる価値があります。

于 2013-06-20T21:43:58.980 に答える