已添加具有相同密钥的项目 C# -Ionic.Zip

Posted

技术标签:

【中文标题】已添加具有相同密钥的项目 C# -Ionic.Zip【英文标题】:An item with the same key has already been added C# -Ionic.Zip 【发布时间】:2021-08-31 08:55:48 【问题描述】:

我正在尝试基于多选下载 zip 文件,这意味着用户选择文档并按下下载文件按钮,然后生成 zip 文件。

一切正常。我的 zip 文件也正在下载中。但有时当我一次又一次地按下下载按钮时,它会给我以下错误。我注意到当我下载任何新文件时不会产生这个错误。但是当我下载那些我已经下载过多次的文件时,就会产生这个错误

 An item with the same key has already been added.

请注意,此错误非常罕见。而且我似乎无法弄清楚为什么经过多次谷歌搜索。我在下面发布我的代码。谁能帮帮我?

using (ZipFile zip = new ZipFile())
          
            foreach (DataRow row in dt.Rows)
            
             //some code  
                zip.AddFile(filePath, "files");   //here the error is 
     generated
            
            Response.Clear();
            //Response.AddHeader("Content-Disposition", "attachment; filename=DownloadedFile.zip"); 
            Response.ContentType = "application/zip";
            zip.Save(Response.OutputStream);
            Response.End();

【问题讨论】:

“已添加具有相同键的项目”是Dictionary 对象会抛出的错误。查找已包含您尝试下载的文件的密钥的字典。 @RobertHarvey 我不理解字典,您是指上传我的文件的文件夹? Aso 这里的 key 是什么意思?我没有使用任何密钥。 在您的情况下,很明显您正在将文件路径添加到已经具有您要添加的名称的 ZipFile 对象。 您不能将相同的文件名放入一个 zip 文件中两次,除非您使用文件夹来分隔重复的名称。这与 Google 搜索无关,也不是 ZipFile 类中的错误;你只需要找出你在哪里复制你的名字。 除非您打算在文件之间等待一秒钟,否则这绝对可能是原因。 【参考方案1】:

如果您在相同的一秒间隔内处理其中两个文件,则将当前时间添加到文件名并不能确保唯一性。

尝试用以下代码替换zip.AddFile(filePath, "files");

while(true)

    int i = 1;
    string originalPath = filePath;
    try
    
        zip.AddFile(filePath, "files"); 
        break;
    
    catch (ArgumentException e)
    
        filePath = string.Format(originalPath + " (0)", i);
        i++;
        continue;
    

这改变文件名的方式与 Windows 在您尝试将文件复制到文件名已存在的文件夹中时所做的相同。

那么您就不需要在文件名中包含时间来确保唯一性。

【讨论】:

以上是关于已添加具有相同密钥的项目 C# -Ionic.Zip的主要内容,如果未能解决你的问题,请参考以下文章

GET 调用:已添加具有相同密钥的项目。键:标识

Windows Azure:“已添加具有相同密钥的项目。”选择时抛出异常

Ionic.Zip ArgumentException(已添加具有相同密钥的项目)

IStatefulServiceReplica.Open 上的错误 - 已添加具有相同密钥的项目

protobuf-net 出现“已添加具有相同密钥的项目”错误

当我转到共享服务管理中的“搜索设置”页面时,出现此错误:“已添加具有相同密钥的项目。”