C# 的问题:StartIndex 不能小于零。参数名称:startIndex [关闭]

Posted

技术标签:

【中文标题】C# 的问题:StartIndex 不能小于零。参数名称:startIndex [关闭]【英文标题】:Problem with C#: StartIndex cannot be less than zero. Parameter name: startIndex [closed] 【发布时间】:2021-02-13 16:51:47 【问题描述】:

这是我的代码:

public static async void Download()

    InstagramDownloadMachine instagramDownloadMachine = new InstagramDownloadMachine();
    await instagramDownloadMachine.DownloadToPath(@"https://www.insta.com/p/CLL_c2egcL9/", "img.jpg");

当我执行它时,我得到这个错误:

System.ArgumentOutOfRangeException: 'StartIndex 不能小于零。 参数名称:startIndex'

(顺便说一句,我使用此代码下载 insta 视频)

所以这是 dll 的完整代码:

    private String fileExtension, fileKey;
    private const String imgExtension = ".jpg";
    private const String videoExtension = ".mp4";
    private const String videoKey = "video_url\": \"";
    private const String imgKey = "display_url\": \"";
    public async Task<Stream> Download(String url)
    
        WebRequest request = WebRequest.Create(url);
        var response = await request.GetResponseAsync();
        Stream dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        string fileUrl = GetFileUrl(responseFromServer);
        var fileStream = GetFileStream(fileUrl);
        return fileStream;
    
    public async Task DownloadToPath(String url, String path)
    
        var stream = await Download(url);
        MemoryStream memoryStream = new MemoryStream();
        stream.CopyTo(memoryStream);
        File.WriteAllBytes(path, memoryStream.ToArray());
    
    private Stream GetFileStream(String url)
    
        HttpWebRequest fileRequest = (HttpWebRequest)WebRequest.Create(url);
        var response = fileRequest.GetResponse();
        return response.GetResponseStream();
    

    private String GetFileUrl(String html)
    
        String fileUrl = null;

        if (html.Contains("video_url"))
        
            fileExtension = videoExtension;
            fileKey = videoKey;
        
        else
        
            fileExtension = imgExtension;
            fileKey = imgKey;
        

        var auxIndex = html.IndexOf(fileKey);
        var partial = html.Substring(auxIndex);
        var endOfUrl = partial.IndexOf(fileExtension) + fileExtension.Length;
        fileUrl = html.Substring(auxIndex, endOfUrl);
        fileUrl = fileUrl.Substring(fileKey.Length);
        return fileUrl;
    

和 idk 错误的 startindex /:

【问题讨论】:

还有 1 件事,可以将它用于 xamarin.forms 吗?(有外部 .dll 组件;D 我认为这个错误是在 DownloadToPath() 方法中抛出的。如果这是在 DLL 中,那么将很难解决。如果它不在 DLL 中,那么您需要发布它的代码以便我们能够提供帮助。 异常的完整堆栈跟踪是什么? 添加完整代码 顺便说一句,如果可能的话,请使用 HttpClient 而不是手动构造 WebRequests。稍后您会感谢自己的。也无需复制到内存流,然后将所有字节写入文件。打开文件流并复制到该文件流,而不是重复工作 【参考方案1】:

似乎异常来自 GetFileUrl 方法中的 html.Substring(auxIndex) 行。您正在使用的 Substring 方法重载将 startIndex 作为唯一参数,因此您的异常表示它不能为负数。 auxIndex 变量的值为 -1,因为在您的 html 中找不到 fileKey。您应该在那里设置一个条件来处理这种情况。

更多解释:

IndexOf reference

Substring reference

var auxIndex = html.IndexOf(fileKey);/* This method will return -1 if fileKey is not found in html. So auxIndex variable will have -1.*/
    var partial = html.Substring(auxIndex); /* This Substring method expects the parameter (auxIndex) to be non-negative, So if the above IndexOf method returned -1, auxIndex will be -1 and that would cause the Substring method to throw error. */

您可以在方法内部检查 auxIndex 是否为非负数,例如

if(auxIndex >= 0)

 /* means your fileKey was found in the html, so you can put the rest of the code here*/
var partial = html.Substring(auxIndex);
//....other lines

else

/* you need to put logic to handle this case where fileKey was not found in html*/

【讨论】:

我不明白,你能解释一下吗? 我用更多解释编辑了我的答案。希望对你有帮助

以上是关于C# 的问题:StartIndex 不能小于零。参数名称:startIndex [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

算法C#

C# 非泛型“***”不能与类型实参一起使用的错误

C# - 基于零的字符串错误 [重复]

C# Protobuf-net:小数字典:零不能正确往返

字符串

C# 结构体