我正在尝试使用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();
用他的话说:
确实很恐怖,但是它具有
工作的优势!
坦率地说,我花了很长时间来烦恼我,所以批处理文件解决方案很好用,所以我会坚持下去。