簡體   English   中英

將文件寫入磁盤后無法執行文件

[英]Can´t execute file after writing it to the disk

我有一些通過 TCP 傳輸的文件。 但是,當我嘗試執行它們時,我會彈出一個 Windows 屏幕,說我應該聯系開發人員以獲取適合我電腦的版本。 文件應該正確傳輸,所以我想知道問題出在哪里。

服務器操作系統: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;
        }
    }

TCP管理器

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;
    }

編輯:忘記檢查文件大小。 所有文件的大小都為零字節,因此在發送時某處一定有錯誤。

除了檢查目標系統上安裝了正確的運行時版本等之外...

可能是當您沒有在單個Read操作中接收到整個文件內容時?

您可以(並且應該)確保使用以下內容讀取所有數據:

(未經測試...)

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

您可以(並且應該)對Write調用執行類似的操作,以確保所有數據都已寫入...它不會經常發生,但確實會發生 - 出於各種不適合該線程的原因:)(墨菲定律等等!)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM