2015-10-29 2 views
0

Когда пользователь загружает несколько документов я храню свои файлы в моем проекте, как это:Как удалить guid из имени файла при создании zip-файла?

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

Теперь при создании архивных файлов я получаю такое же имя этого файла WHe n извлечение 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 
} 

Может кто-нибудь помочь мне с этим?

+0

ли файл определяется Filepath существует в папке сервера отображается? – user1672994

+0

@ user1672994: см. Kevin Answer.He имеет значение –

ответ

2

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); 
+0

Да, вы правы, я думаю, но было бы лучше, если вы можете опубликовать код того, что вы говорите –

+0

Мне нужно удалить файл после zip.save right ?? –

+0

Вам не нужно. Это зависит от вас. – Kevin

0

Принимая источник из @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); 
        } 
     } 
1

Вы должны использовать архив и ArchiveEntry. Грубый код snipets, как это сделать (я не проверить это):

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); 
} 
+0

извините, но я хочу использовать Dotnetzip только так, чтобы я был действительно благодарен, если вы можете предложить некоторое улучшение в моем ответе только –

Смежные вопросы