c#中从一个系统到另一个系统的文件传输

本文关键字:系统 另一个 传输 文件 一个 | 更新日期: 2023-09-27 18:05:31

我有这个c#程序,它是一个客户端从服务器接收文件。有时它可以无缝地工作。有时会在fileName = Encoding.ASCII.GetString(dataByte, 4, fileNameLen);中出现例外。

ArgumentOutOfRange Exception
Index and count must refer to a location within the buffer.
Parameter name: bytes

如果"fileNameLen"为"8"或"12",则正常工作。否则它将是1330795077。为什么呢?有人能解释一下这是为什么吗?请。这是我的代码。

        string fileName = string.Empty;
        int thisRead = 0;
        int blockSize = 1024;
        Byte[] dataByte = new Byte[blockSize];
        lock (this)
        {
            string folderPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)+"''";
            ns.Read(dataByte, thisRead, blockSize);
            int fileNameLen = BitConverter.ToInt32(dataByte, 0);
            fileName = Encoding.ASCII.GetString(dataByte, 4, fileNameLen);
            Stream fileStream = File.OpenWrite(folderPath + fileName);
            fileStream.Write(dataByte, 4 + fileNameLen, (1024 - (4 + fileNameLen)));
            while (true)
            {
                thisRead = ns.Read(dataByte, 0, blockSize);
                fileStream.Write(dataByte, 0, thisRead);
                if (thisRead == 0)
                    break;
            }
            fileStream.Close();
        }

c#中从一个系统到另一个系统的文件传输

index和count没有表示有效的字节范围。

Encoding.ASCII.GetString ()

ArgumentOutOfRangeException被抛出,原因如下:

  • 索引或计数小于零。

  • index和count不能表示有效的字节范围

Count在你的例子中:fileNameLen

文档说明:

要转换的数据,例如从流中读取的数据,可以是仅在顺序块中可用。在这种情况下,如果数据是如此之大,以至于它需要被分成更小的块应用程序应使用提供的解码器或编码器GetDecoder方法或GetEncoder方法。

看到文档

您需要在转移dataByte时检查其内容。如果你试图在dataByte中创建一个整数然后在fileNameLen中将其转换为Int32你可能会收到像1330795077这样愚蠢的值这不是Encoding.ASCII.GetString(dataByte, 4, fileNameLen);的有效索引

在您的代码ns.Read(dataByte, thisRead, blockSize);应该返回一个int值表示实际读取的长度。使用该返回值来控制要转换为字符串的字节数,以避免创建愚蠢的值。

相关文章: