1

実際には、ソケットを介して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ファイルに他のライタークラスを使用する必要がありますか?

4

2 に答える 2

2

Write(byte[], index, count)そのためにはクラスにメソッドが必要ですがStreamWriter、それは存在しません。呼び出しstreamWriter(buffer)はと同じstreamWriter(buffer.ToString())であるため、バッファの内容は書き込まれませんEncoding.ASCII。バッファ内のバイナリコンテンツをテキストに変換するために使用すると、バッファの内容が変更されます。

を使用しないでくださいStreamWriterFileStream代わりに書いてください:

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 に答える