2011-11-11 39 views
2

我是一名生物信息学人员,我使用C#进行工作。我一直在使用C#中的进程来运行可执行程序几次。这次我有一个新问题。我在Windows下载了一个名为Blast的程序的exe文件(http://blast.ncbi.nlm.nih.gov/Blast.cgi?CMD=Web&PAGE_TYPE=BlastDocs&DOC_TYPE=Download)。如果我输入的命令是:使用C#进程运行可执行程序

blastp -query input.txt -db pdbaa -out output.txt 

它工作正常。但是,当我复制粘贴命令从记事本它会给出错误。我搜索了这个问题,发现它是一个“编码问题UTF-8与ISO-latin”(http://biostar.stackexchange.com/questions/7997/an-error-by-using-ncbi-blast-2-2-25-on-windows),这是由复制和粘贴导致的。

现在我想从c#运行进程来调用exe文件,我得到了同样的问题,我想这是因为该进程做了类似于复制和粘贴的操作。这里是我的代码:

public void Calculate() 
    { 
     Process proc = new Process(); 
     proc.StartInfo.WorkingDirectory = Program.NCBIBlastDirectory; 
     proc.StartInfo.FileName = @"C:\Program Files\NCBI\blast-2.2.25+\bin\blastp.exe"; 
     proc.StartInfo.Arguments = "blastp -query input.txt -db pdbaa -out output.txt"; 
     proc.StartInfo.UseShellExecute = false; 
     proc.StartInfo.RedirectStandardError = true; 
     proc.StartInfo.RedirectStandardError = true; 
     proc.Start(); 
     proc.WaitForExit(); 
     proc.Close(); 
    } 

你有什么想法我可以解决这个问题吗?

在此先感谢。

+0

如果您已经从记事本中复制并粘贴了您的参数,那么他们可能已经保留了编码。使用notepade保存带有ansi编码的文本文件,然后复制这些参数。 – Kell

+1

你确定你应该把“blastp”作为参数中的第一个单词吗?那不是exe名字?该过程现在将调用此命令:C:\ Program Files \ NCBI \ blast-2.2.25 + \ bin \ blastp.exe blastp -query input.txt -db pdbaa -out output.txt –

回答

4

的一个问题,我可以看到的是在该行你设置参数:

proc.StartInfo.Arguments = "blastp -query input.txt -db pdbaa -out output.txt"; 

我想你的意思是:

proc.StartInfo.Arguments = "-query input.txt -db pdbaa -out output.txt"; 

所以你不需要再指定可执行文件名在参数中 - 这就是FileName的用途。

另一件事是,如果你不使用shell-execute来启动它们,那么有很多应用程序的行为不太好。首先用shell-execute(显然没有重定向任何std *)尝试它,如果它以这种方式工作,那么你就会知道这个问题是什么 - 尽管我担心你可以做的不多。

另外,为什么是线

proc.StartInfo.RedirectStandardError = true; 

重复两次?

+0

谢谢。是的问题出现在参数陈述中。我删除了这个blastp,现在正在工作。 – Reyhaneh