【问题标题】:How to remove guid from file name when creating zip file?创建 zip 文件时如何从文件名中删除 guid?
【发布时间】:2015-10-29 06:19:28
【问题描述】:

当用户上传多个文档时,我将他们的文件存储在我的项目中,如下所示:

 Guid id;
 id = Guid.NewGuid();
 string filePath = Path.Combine(HttpContext.Server.MapPath("../Uploads"),
 Path.GetFileName(id + item.FileName));
 item.SaveAs(filePath);

所以文件在我的项目中是这样保存的:

  1. 1250a2d5-cd40-4bcc-a979-9d6f2cd62b9fLog.txt
  2. bdb31966-e3c4-4344-b02c-305c0eb0fa0aLogging.txt

现在,在创建 zip 文件时,我在提取 zip 文件时得到了与此文件相同的名称,但在用户下载文件后,我不想在我的文件名中使用 guid。

但是,我尝试从文件名中删除 guid,但收到错误 System.IO.FileNotFoundException

这是我的代码:

using (var zip = new ZipFile())
{
    var str = new string[] { "1250a2d5-cd40-4bcc-a979-9d6f2cd62b9fLog.txt", "bdb31966-e3c4-4344-b02c-305c0eb0fa0aLogging.txt" }; //file name are Log.txt and Logging.txt
    string[] str1 = str .Split(',');
    foreach (var item in str1)
    {
        string filePath = Server.MapPath("~/Uploads/" + item.Substring(36));//as guid are of 36 digits
        zip.AddFile(filePath, "files");
    }
    zip.Save(memoryStream);//Getting error here
}

【问题讨论】:

  • filePath 定义的文件是否存在于服务器映射文件夹中?
  • @user1672994:见 Kevin 答案。他说得有道理

标签: c# asp.net-mvc zip dotnetzip


【解决方案1】:

ZipFile 抛出异常,因为它在磁盘上找不到文件,因为您给它一个不存在的文件名(通过执行 .Substring())。要使其正常工作,您必须使用 File.Copy 使用新文件名重命名文件,然后将相同的文件名提供给 Zip.AddFile()。

  var orgFileName = "1250a2d5-cd40-4bcc-a979-9d6f2cd62b9fLog.txt";
  var newFileName = orgFileName.Substring (36);
  File.Copy (orgFileName, newFileName, true);
  zip.AddFile (newFileName);

【讨论】:

  • 是的,我认为你是对的,但如果你能发布你所说的代码会更好
  • 你不需要。这取决于你。
  • 是的,我需要这样做,因为我在 zip.save 上的代码遇到了同样的错误,但我已经解决了,因为现在我要在 zip.save 之后删除文件
  • 这可能是因为您第二次尝试创建 zip 并且复制操作失败。我已更改 File.Copy 以覆盖现有文件,使其不再引发异常。
  • 好的,现在我已经按照您所说的做了同样的事情并添加了 true 选项,现在我没有收到该错误。您能解释一下如何吗?
【解决方案2】:

您应该使用存档和存档条目。粗略的代码片段是如何做到的(我不测试它):

    using(var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true)) {
        {
            //using(var zip = new ZipFile()) {
            var str = new string[] { "1250a2d5-cd40-4bcc-a979-9d6f2cd62b9fLog.txt", "bdb31966-e3c4-4344-b02c-305c0eb0fa0aLogging.txt" }; //file name are Log.txt and Logging.txt
                                                                                                                                         //string[] str = str.Split(',');
            foreach(var item in str) {
                using(var entryStream = archive.CreateEntry("files/" + item.Substring(36)).Open()) {
                    string filePath = Server.MapPath("~/Uploads/" + item);
                    var content = File.ReadAllBytes(filePath);
                    entryStream.Write(content, 0, content.Length);
                }
            }
        }
    }

DotNetZip 使用示例:

using (ZipFile zip = new ZipFile())
{
var str = new string[] { "1250a2d5-cd40-4bcc-a979-9d6f2cd62b9fLog.txt", "bdb31966-e3c4-4344-b02c-305c0eb0fa0aLogging.txt" };
            foreach(var item in str) {
                    string filePath = Server.MapPath("~/Uploads/" + item);
                    var content = File.ReadAllLines(filePath);
                    ZipEntry e = zip.AddEntry("files/" + item.Substring(36), content);
                }
            }  
zip.Save(memoryStream);
}

【讨论】:

  • 很抱歉,但我只想使用 Dotnetzip,所以如果你能建议我的答案有所改进,我将非常感激
【解决方案3】:

从@kevin 的答案中获取资源,我已经设法解决了这个问题:

    List<string> newfilename1 = new List<string>();
        using (var zip = new ZipFile())
        {
            var str = new string[] { "1250a2d5-cd40-4bcc-a979-9d6f2cd62b9fLog.txt", "bdb31966-e3c4-4344-b02c-305c0eb0fa0aLogging.txt" }; //file name are Log.txt and Logging.txt
            string[] str1 = str .Split(',');
            foreach (var item in str1)
            {
                  string filePath = Server.MapPath("~/Uploads/" + item);
                            string newFileName = Server.MapPath("~/Uploads/" + item.Substring(36));
                            newfilename1.Add(newFileName);
                            System.IO.File.Copy(filePath,newFileName);
                            zip.AddFile(newFileName,"");
            }
            zip.Save(memoryStream);
 foreach (var item in newfilename1)
                    {
                        System.IO.File.Delete(item);
                    }
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多