Получено «Процесс не может получить доступ к файлу, потому что он используется другим процессом» при создании файла .zip с использованием ZipFile - PullRequest
0 голосов
/ 01 апреля 2019

Я пытаюсь создать большой файл .zip, используя библиотеку ZipFile в C #.HttpClient загружает несколько музыкальных файлов с URL-адреса и добавляет их в цикл zip.

Для этого я следую циклу for> HttpClient для загрузки музыки> добавляем zip> save zip.

Здесь, 30-35 музыкальных файлов будут работать отлично.Но я столкнулся с проблемой, когда у меня более 35+ файлов.Я хочу создать ZIP с минимум 500+ файлов.

У меня есть исключение, сохраненное в файле logfile.txt.

Исключение:

Action:The process cannot access the file because it is being used by another process.  Controller:   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.File.InternalMove(String sourceFileName, String destFileName, Boolean checkHost)
   at Ionic.Zip.ZipFile.Save()
   at Groove.Libraries.Api.DonwloadMusic.<>c__DisplayClass5_0.<DownloadMusicFilesByScheduler>b__2(StudioEventEntryDetailsResponseModel y)
   at System.Collections.Generic.List`1.ForEach(Action`1 action)
   at Groove.Libraries.Api.DonwloadMusic.<>c__DisplayClass5_0.<DownloadMusicFilesByScheduler>b__0(StudioMusicDetails x)
   at System.Collections.Generic.List`1.ForEach(Action`1 action)
   at Groove.Libraries.Api.DonwloadMusic.DownloadMusicFilesByScheduler()

Исключение выдается zip.Save (string.Format ("{0} / {1} ", tempPath, archiveFileName));line.

Есть ли какие-либо проблемы с WebRequest или библиотекой ZipFile?.

    // Get list of music files url
    EventMusicList eventEntryList = _globLib.GetEventMusicList(dbEvent.Id);

    // zip file name
    string archiveFileName = string.Format("{0}-{1}-Music.zip", eventEntryList.SeasonName,eventEntryList.EventName);

    ZipFile zip;

    // if zip Exists then get zip and add new music in this file OR create new zip
    if (File.Exists(string.Format("{0}/{1}", tempPath, archiveFileName)))
    {
          zip = new ZipFile(string.Format("{0}/{1}", tempPath, archiveFileName));
    }
    else
    {
          zip = new ZipFile();
    }

    // Start : Looping of music files url
    eventEntryList.StudioList.ForEach(
        x => x.EntryList.ToList().Where(y => y.Document.Id != 0 && !y.Document.IsDownloaded).ToList().ForEach(y =>
        {

           // get music file url from dropbox.
           DBB.GenerateAccessToken();
           var _link = DBB.GetFileTemporaryLink(y.Document.RootPath, y.Document.FileName);

           if (!_link.Equals(string.Empty))
           {  
               // Get Stream from music url - function is created at bottom 
               Stream stream = GetStreamFromUrl(_link);

               string fileExtension = Path.GetExtension(y.Document.FileUrl);
               string fileName = y.EntryNumber != null
                   ? string.Format("{0}-{1}{2}", y.EntryNumber, y.Title, fileExtension)
                   : string.Format("{0}{1}", y.Title, fileExtension);
               if (zip.Entries.Where(z => z.FileName == fileName).Count() == 0)
               {
                   // add in zip
                   zip.AddEntry(fileName, stream);
               }
           }
           else
           {
               return;
           }

       // Check temporary path is exist or not, if not then create temporary folder
       if (!Directory.Exists(tempPath))
       {
           Directory.CreateDirectory(tempPath);
       }

       this.LogRequest("Save:-BeforeSave", "DownloadMusicLib");

       //Task t = Task.Run(() => { zip.Save(string.Format("{0}/{1}", tempPath, archiveFileName)); });
       //t.Wait();

       // Save zip file
       zip.Save(string.Format("{0}/{1}", tempPath, archiveFileName));

       this.LogRequest("Save:-AfterSave", "DownloadMusicLib");

    })); // END : Looping of music files url


    // New function to get stream from url
    public static Stream GetStreamFromUrl(string url)
    {
        byte[] imageData = null;
        Stream ms;
        ms = null;
        try
        {
            using (var wc = new System.Net.WebClient())
            {
                imageData = wc.DownloadData(url);
            }
            ms = new MemoryStream(imageData);
        }
        catch (Exception ex)
        {
            //forbidden, proxy issues, file not found (404) etc
        }
        return ms;
    }

Снимок экрана с расположением папки zip, некоторые из которых помечены

Здесь я получаю URL-адрес временного музыкального файла из Dropbox и получаю поток с помощью HttpClient.

При возникновении ошибки zip-файл является courrpt.как '2018 - 2019-Вашингтонский региональный конкурс IL-Music.zip.ugmf5uat.1a4'

...