Я пытаюсь создать большой файл .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'