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

4

神奇的词是FileShare.Read

  using(var inputFile = new FileStream(
         "oldFileName.txt", 
         FileMode.Open, 
         FileAccess.Read, 
         FileShare.Read))
     {
        using (var outputFile = new FileStream("newFileName.txt", FileMode.Create))
        { 
            var buffer = new byte[0x10000];
            int bytes;

            while ((bytes = inputFile.Read(buffer, 0, buffer.Length)) > 0) 
            {
                outputFile.Write(buffer, 0, bytes);
            }
        }
    }

然后,即使使用多个线程,您也应该能够复制它。

于 2013-06-20T19:57:23.187 回答
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

如果您不指定标志,您可以通过调用CopyFileEx来执行此操作。COPY_FILE_OPEN_SOURCE_FOR_WRITE

CopyFileEx几年前,我发布了一个 C# 包装器。请参阅更好的 File.Copy 替换。我不知道它是否会做你想做的事(允许文件被多个线程打开),但它可能值得一试。

于 2013-06-20T21:43:58.980 回答
0

好吧,经过一个晚上的极度沮丧之后,我似乎只需要一些睡眠来解决这个问题。

我最初在按钮单击事件中完成了我的 foreach,并且由于我在该 foreach 中启动了一个线程,因此它只是继续,而不管其他所有内容的状态。此后,我将该 foreach 移至线程,问题已解决。我现在可以一次复制到多个位置,我必须说它非常快。

感谢大家一如既往的帮助!

于 2013-06-21T12:40:09.200 回答