如何使用StreamWriter使用C#代码编写.exe文件?

时间:2012-10-27 16:27:53

标签: c# sockets streamwriter

实际上我正在通过套接字复制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类?

2 个答案:

答案 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);