Из ваших комментариев я понял, что проблема заключается в том, чтобы идентифицировать файлы (получить список принадлежащих друг другу частей). Вы можете получить список файлов типа
List<string> files = System.IO.Directory.EnumerateFiles(@"D:\Zip\ForExtract\multipart\",
"500mbInputData.*", SearchOption.TopDirectoryOnly).OrderBy(x => x).ToList();
или для вашего второго случая
List<string> files = System.IO.Directory.EnumerateFiles(@"D:\Zip\ForExtract\multipart\",
"500mbInputData.zip.*", SearchOption.TopDirectoryOnly).OrderBy(x => x).ToList();
, а затем использовать список файлов в вашем CombinationStream
. Остальная часть кода будет выглядеть так: Manoj Choudhari пишет. Вы также можете указать путь и имя файла с символом подстановки в параметре, поэтому я бы предложил добавить следующие параметры в функцию:
public static bool IsZipValid(string basePath, string fileNameWithWildcard)
{
try
{
List<string> files = System.IO.Directory.EnumerateFiles(
basePath, fileNameWithWildcard,
SearchOption.TopDirectoryOnly).OrderBy(x => x).ToList();
using (var zipFile = // ... rest is as Manoj wrote
и использовать его следующим образом:
if (IsZipValid(@"D:\Zip\ForExtract\multipart\", "500mbInputData.*")) { // ... }
или
if (IsZipValid(@"D:\Zip\ForExtract\multipart\", "500mbInputData.zip.*")) { // ... }
Чтобы выяснить, какие файлы у вас есть в базовом пути, вы можете написать вспомогательную функцию, такую как
List<string> getZipFormat(string path)
{
bool filesFound(string basePath, string pattern) => System.IO.Directory.EnumerateFiles(
basePath, pattern, SearchOption.TopDirectoryOnly).Any();
var isTar = filesFound(path, "*.tar.???");
var isZip = filesFound(path, "*.z??");
var is7Zip = filesFound(path, "*.7z.???");
var result = new List<string>();
if (isTar) result.Add("TAR");
if (isZip) result.Add("ZIP");
if (is7Zip) result.Add("7ZIP");
return result;
}
Изменить ее для своих нужд - это вернет список строк, содержащих «TAR», «ZIP» или «7ZIP» (или более одной из них), в зависимости от сопоставления шаблонов с файлами в базовом каталоге.
Использование (пример для проверки нескольких zipformat):
var isValid = true;
var basePath = @"D:\Zip\ForExtract\multipart\";
foreach(var fmt in getZipFormat(basePath))
switch (fmt)
{
case "TAR":
isValid = isValid & IsZipValid(basePath, "500mbInputData.tar.*");
break;
case "ZIP":
isValid = isValid & IsZipValid(basePath, "500mbInputData.zip.*");
break;
case "7ZIP":
isValid = isValid & IsZipValid(basePath, "500mbInputData.7z.*");
break;
default:
break;
}
Примечание: В соответствии с моими экспериментами с этим, возможно, что файлы остаются открытыми, хотя ваша программа закончилась - это означает, что ваши файлы будут по-прежнему заблокированы при следующем запуске кода. Поэтому я настоятельно рекомендую явно закрыть их, например
var fStreams = files.Select(x =>
new FileStream(x, FileMode.Open) as System.IO.Stream).ToList();
using (var cStream = new CombinationStream(fStreams))
using (var zipFile = new ZipArchive(cStream, ZipArchiveMode.Read))
{
// Do whatever you want...
// ... but ensure you close the files
fStreams.Select(s => { s.Close(); return s; });
};