Не могу выполнить файл после записи на диск - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть несколько файлов, которые я передаю по 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;
    }

РЕДАКТИРОВАТЬ: Забыли проверитьдля размера файла.Все файлы имеют размер нулевого байта, поэтому при отправке должна быть ошибка.

1 Ответ

0 голосов
/ 08 февраля 2019

Помимо таких вещей, как проверка правильности установленных версий во время выполнения, установлены в целевой системе и т. П. *

Может быть так, что вы не получаете весь файл в одной операции Read?

Вы можете (и должны) убедиться, что прочитали все данные, используя что-то вроде:

(не проверено ...)

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

Вы можете (и должны) также выполните аналогичные действия с вызовом Write, чтобы убедиться, что все данные записаны ... это случается не часто, но происходит - по разным причинам, которые не относятся к этой теме:) (Закон Мерфи и все такое!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...