我正在尝试使用C#ProcessStartInfo自动执行svnadmin转储。

我在命令行上完成的方式是这样的,

svnadmin dump c:\Repositories\hackyhacky > c:\backup\hackyhacky.svn_dump

工作对待并成功转储,我可以通过将其还原到另一个存储库中来验证这一点,如下所示

svnadmin load c:\Repositories\restore_test < c:\backup\hackyhacky.svn_dump

还原成功-是的!

现在...我需要使用C#将命令行管道复制到另一个文件中,但是由于某些原因

var startInfo = new ProcessStartInfo(Path.Combine(SvnPath, "svnadmin"),"dump c:\Repositories\hackyhacky")
 {CreateNoWindow = true, RedirectStandardOutput = true,RedirectStandardError = true,UseShellExecute = false};
process.StartInfo = startInfo;
process.Start();
StreamReader reader = process.StandardOutput;
char[] standardOutputCharBuffer = new char[4096];
byte[] standardOutputByteBuffer;
int readChars = 0;
long totalReadBytes = 0;

// read from the StandardOutput, and write directly into another file

using (StreamWriter writer = new StreamWriter(@"C:\backup\hackyhacky.svn_dump", false)) {
    while (!reader.EndOfStream) {
       // read some chars from the standard out
       readChars = reader.Read(standardOutputCharBuffer, 0, standardOutputCharBuffer.Length);

       // convert the chars into bytes
       standardOutputByteBuffer = reader.CurrentEncoding.GetBytes(standardOutputCharBuffer);

       // write the bytes out into the file
       writer.Write(standardOutputCharBuffer.Take(readChars).ToArray());

       // increment the total read
       totalReadBytes += standardOutputByteBuffer.Length;
    }
}


将相同的存储库转储到hackyhacky.svn_dump中。

但是当我现在运行加载命令行时

svnadmin load c:\Repositories\restore_test < c:\backup\hackyhacky.svn_dump

我收到校验和错误怪异错误!

svnadmin load c:\Repositories\restore_test < c:\backup\hackyhacky.svn_dump
< Started new transaction, based on original revision 1
     * adding path : Dependencies ... done.
     * adding path : Dependencies/BlogML.dll ...svnadmin: Checksum mismatch, fil
e '/Dependencies/BlogML.dll':
   expected:  d39863a4c14cf053d01f636002842bf9
     actual:  d19831be151d33650b3312a288aecadd


我猜想这与我重定向和读取StandardOutput的方式有关。

有谁知道在C#中模仿命令行文件管道行为的正确方法?

任何帮助是极大的赞赏。

-简历

更新

我尝试使用BinaryWriter并使用standardOutputByteBuffer写入文件,但这也不起作用。我收到有关错误标题格式或其他内容的另一个错误。

最佳答案

好的!如果您无法击败他们,请加入他们。

我发现了一个帖子,作者在其中直接将其通过管道传递到Process StartInfo中的文件,并声称它可以工作。

http://weblogs.asp.net/israelio/archive/2004/08/31/223447.aspx

正如另一位先生的帖子所述,这对我不起作用

http://webcache.googleusercontent.com/search?q=cache:http://www.deadbeef.com/index.php/redirecting_the_output_of_a_program_to_a

他首先使用管道系统编写了一个批处理文件,然后执行该文件。

amWriter bat = File.CreateText("foo.bat");
bat.WriteLine("@echo off");
bat.WriteLine("foo.exe -arg >" + dumpDir + "\\foo_arg.txt");
bat.Close();
Process task = new Process();
task.StartInfo.UseShellExecute = false;
task.StartInfo.FileName = "foo.bat";
task.StartInfo.Arguments = "";
task.Start();
task.WaitForExit();


用他的话说:


  确实很恐怖,但是它具有
  工作的优势!


坦率地说,我花了很长时间来烦恼我,所以批处理文件解决方案很好用,所以我会坚持下去。

08-27 08:46