实际上,我正在通过套接字复制一个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类?
最佳答案
您需要在Write(byte[], index, count)
类中使用StreamWriter
方法来执行此操作,但这并不存在。调用streamWriter(buffer)
与streamWriter(buffer.ToString())
相同,因此不会写入缓冲区的内容,而使用Encoding.ASCII
将缓冲区中的二进制内容转换为文本将对其进行更改。
完全不要使用StreamWriter
。改为写入FileStream
:
while ((x = stm.Read(buffer, 0, 1024)) > 0) {
fs.Write(buffer, 0, x);
}
您应该使用变量
x
作为写入的长度,而不是buffer.Length
,因为缓冲区可能并不总是被完全填充。至少最后一个块几乎永远不会是一个完整的缓冲区。
关于c# - 如何使用C#代码和StreamWriter编写.exe文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13101967/