实际上我正在通过套接字复制exe文件。我能够使用StreamWriter
类复制文本,但我使用相同的代码复制exe文件,它创建了一个具有所需名称的exe文件,但我无法运行它。
“这个应用程序无法在您的PC上运行”。我有Windows 8 x64,这是无关紧要的。
static void Main(string[] args)
{
TcpClient tcpclient = new TcpClient();
tcpclient.Connect("localhost", 20209);
NetworkStream stm = tcpclient.GetStream();
byte[] buffer = new byte[1024];
var fs = File.Open("F:/aki/RMI/akshay.exe", FileMode.OpenOrCreate, FileAccess.ReadWrite);
var streamWriter = new StreamWriter(fs);
int x;
while ((x=stm.Read(buffer, 0, 1024))>0)
{
**A** streamWriter.Write(buffer);
**B** //streamWriter.Write(Encoding.ASCII.GetString(buffer, 0, buffer.Length));
}
streamWriter.Close();
fs.Close();
Thread.Sleep(2000);
Console.WriteLine("Waiting");
//Console.ReadLine();
tcpclient.Close();
}
我尝试了A和B两种方法,B适用于文本文件但不适用于exe文件。任何解决方案?
或者我必须为exe文件使用任何其他Writer类?
答案 0 :(得分:2)
您需要在Write(byte[], index, count)
类中使用StreamWriter
方法来执行此操作,但这不存在。调用streamWriter(buffer)
与streamWriter(buffer.ToString())
相同,因此不会写入缓冲区的内容,并使用Encoding.ASCII
将缓冲区中的二进制内容转换为文本将更改它。 / p>
根本不要使用StreamWriter
。改为写FileStream
:
while ((x = stm.Read(buffer, 0, 1024)) > 0) {
fs.Write(buffer, 0, x);
}
您应该使用变量x
作为写入的长度而不是buffer.Length
,因为缓冲区可能并不总是被完全填充。至少最后一个块几乎永远不会是一个完整的缓冲区。
答案 1 :(得分:0)
StreamWriter是一个TextWriter。你不能这样做:
fs.Write(buffer, 0, buffer.Length);