1

实际上我正在通过套接字复制一个 exe 文件。我可以使用StreamWriterClass 复制文本,但我使用相同的代码复制 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 类?

4

2 回答 2

2

您需要类中的Write(byte[], index, count)方法StreamWriter来执行此操作,但这不存在。调用streamWriter(buffer)和 一样streamWriter(buffer.ToString()),不会写入缓冲区的内容,使用Encoding.ASCII将缓冲区中的二进制内容转换为文本会改变它。

根本不要使用 a StreamWriter。改为FileStream

while ((x = stm.Read(buffer, 0, 1024)) > 0) {
  fs.Write(buffer, 0, x);
}

您应该使用变量x作为要写入的长度,而不是buffer.Length,因为缓冲区可能并不总是被完全填满。至少最后一个块几乎永远不会是一个完整的缓冲区。

于 2012-10-27T16:37:47.343 回答
0

StreamWriter 是 TextWriter。你不能这样做:

fs.Write(buffer, 0, buffer.Length);
于 2012-10-27T16:38:01.957 回答