【问题标题】:Can´t execute file after writing it to the disk将文件写入磁盘后无法执行
【发布时间】:2019-07-03 00:46:09
【问题描述】:

我有一些通过 TCP 传输的文件。但是,当我尝试执行它们时,我会弹出一个窗口屏幕,说我应该联系开发人员为我的电脑获取合适的版本。文件应该正确传输,所以我想知道问题出在哪里。

服务器操作系统:Windows Server 2016

我的电脑操作系统:Windows 10

服务器代码

private void SendLauncherFiles(NetworkStream stream)
    {
        TCPManager manager = new TCPManager();
        Console.WriteLine("Sending Launcher files");

        string path = System.AppDomain.CurrentDomain.BaseDirectory;
        path += "LauncherFiles\\";

        string[] extensions = { "LegitAimLauncher.exe", "Bleak.dll", "Jupiter.dll", "PeNet.Asn1.dll", "PeNet.dll" };

        for(int i = 0; i < extensions.Length; i++)
        {
            path += extensions[i];
            byte[] bFileData = File.ReadAllBytes(path);
            string newPath = path.Replace(extensions[i], "");
            path = newPath;

            manager.SendInt(bFileData.Length, stream);
            stream.Write(bFileData, 0, bFileData.Length);
        }

    }

客户端代码

private void ReceiveFiles(NetworkStream stream)
    {
        TCPManager manager = new TCPManager();

        string path = System.AppDomain.CurrentDomain.BaseDirectory;
        path += "LauncherFiles\\";

        string[] extensions = { "LegitAimLauncher.exe", "Bleak.dll", "Jupiter.dll", "PeNet.Asn1.dll", "PeNet.dll" };

        for(int i = 0; i < extensions.Length; i++)
        {
            path += extensions[i];
            int length = manager.GetInt(stream);

            byte[] bFileData = new byte[length];
            stream.Read(bFileData, 0, bFileData.Length);

            File.WriteAllBytes(path, bFileData);

            string newPath = path.Replace(extensions[i], "");
            path = newPath;
        }
    }

TCPManager

public void SendInt(int data, NetworkStream stream)
    {
        byte[] bData = BitConverter.GetBytes(data);

        stream.Write(bData, 0, bData.Length);
    }
public int GetInt(NetworkStream stream)
    {
        byte[] bData = new byte[sizeof(int)];
        stream.Read(bData, 0, bData.Length);
        int Data = BitConverter.ToInt32(bData, 0);

        return Data;
    }

编辑:忘记检查文件大小。所有文件的大小都是零字节,因此发送时一定有错误。

【问题讨论】:

  • 这可能是两个问题之一:文件未正确发送或客户端计算机上缺少程序的先决条件。要查看文件是否正确到达那里,您可以在服务器和客户端上的文件上使用 PowerShell 的 Get-FileHash 并查看它们是否匹配(您至少需要 PowerShell v4)。
  • 要查看是否缺少先决条件,然后通过其他方法复制文件并尝试运行它,看看是否出现相同的错误。

标签: c# wpf networking tcp stream


【解决方案1】:

除了检查目标系统上是否安装了正确的运行时版本等...

可能是因为您没有在单个Read 操作中接收到整个文件内容?

您可以(并且应该)确保您使用以下方式读取所有数据:

(未测试...)

var offset = 0;
while (offset < length)
{
    var read = stream.Read(buffer, offset, length - offset);
    if (read == 0) {
        //Socket disconnected
        break;
    }
    offset += read;
}

您可以(并且应该)也可以使用Write 调用来执行类似的操作,以确保所有数据都已写入...这种情况不会经常发生,但确实会发生 -由于各种原因不适用于此线程:)(墨菲定律等等!)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 1970-01-01
    • 2015-03-13
    • 2012-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多