【发布时间】:2019-12-30 08:35:19
【问题描述】:
我必须从一组 url 创建一个 zip 文件。它应该具有适当的文件夹结构。 所以我尝试了
public async Task<byte[]> CreateZip(Guid ownerId)
{
try
{
string startPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "zipFolder");//base folder
if (Directory.Exists(startPath))
{
DeleteAllFiles(startPath);
Directory.Delete(startPath);
}
Directory.CreateDirectory(startPath);
string zipPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, $"{ownerId.ToString()}"); //folder based on ownerid
if (Directory.Exists(zipPath))
{
DeleteAllFiles(zipPath);
Directory.Delete(zipPath);
}
Directory.CreateDirectory(zipPath);
var attachemnts = await ReadByOwnerId(ownerId);
attachemnts.Data.ForEach(i =>
{
var fileLocalPath = $"{startPath}\\{i.Category}";
if (!Directory.Exists(fileLocalPath))
{
Directory.CreateDirectory(fileLocalPath);
}
using (var client = new WebClient())
{
client.DownloadFile(i.Url, $"{fileLocalPath}//{i.Flags ?? ""}_{i.FileName}");
}
});
var zipFilename = $"{zipPath}//result.zip";
if (File.Exists(zipFilename))
{
File.Delete(zipFilename);
}
ZipFile.CreateFromDirectory(startPath, zipFilename, CompressionLevel.Fastest, true);
var result = System.IO.File.ReadAllBytes(zipFilename);
return result;
}
catch (Exception ex)
{
var a = ex;
return null;
}
}
目前我正在我的基本目录中写入所有文件(可能不是一个好主意)。最近我必须手动删除所有文件夹和文件以避免异常/不需要的文件。一切都可以写在内存中吗?
将所有文件和文件夹结构写入内存需要哪些更改?
【问题讨论】:
-
你想要在内存中的是源文件还是最终的 ZIP 文件?要创建 ZIP 文件,您可以使用
MemoryStream;参考here -
我想从 urls 创建一个源文件/文件夹结构,我也想在内存中。你可以看到我的 foreach 创建文件夹。
-
我不知道如何在内存中创建文件夹结构。根据您的部署环境,您可以在服务器上创建一个不在应用程序文件夹中的临时工作文件夹。我们经常使用这样的东西。
-
正如@PeterSmith 所说,我将创建一个临时工作文件夹。例如一个新的 Guid,比如:“/xxxx-xxxx-xxxx-xxxx/Folder-To-Zip/....”
-
你可以使用this question的答案。但是您必须在文件名前使用目录名称调用
zipArchive.CreateEntry,例如zipArchive.CreateEntry($"{startPath}\\{attachment.FileName}"
标签: c# asp.net-core