3 #if SILICONSTUDIO_PLATFORM_ANDROID
5 using System.Collections.Generic;
7 using System.IO.Compression.Zip;
9 using System.Text.RegularExpressions;
10 using SiliconStudio.Core.Serialization;
12 namespace SiliconStudio.Core.IO
17 public class ZipFileSystemProvider : VirtualFileProviderBase
22 private readonly ZipFile zipFile;
23 private readonly Dictionary<string, ZipFileEntry> zipFileEntries =
new Dictionary<string, ZipFileEntry>();
25 public ZipFile ZipFile
27 get {
return zipFile; }
35 public ZipFileSystemProvider(
string rootPath,
string zipFilePath) : base(rootPath)
37 zipFile =
new ZipFile(zipFilePath);
38 zipFileEntries = zipFile.GetAllEntries()
39 .Where(x => x.FilenameInZip.StartsWith(
"assets/data/"))
40 .ToDictionary(x => x.FilenameInZip
41 .Replace(
"assets/data/",
string.Empty),
47 ZipFileEntry zipFileEntry;
48 if (!zipFileEntries.TryGetValue(url, out zipFileEntry))
49 throw new FileNotFoundException(
"File not found inside ZIP archive.");
52 throw new UnauthorizedAccessException(
"ZIP archive are read-only.");
59 return new VirtualFileStream(
new FileStream(zipFileEntry.ZipFileName,
FileMode.Open, FileAccess.Read), zipFileEntry.FileOffset, zipFileEntry.FileOffset + zipFileEntry.FileSize);
63 var buffer =
new byte[zipFileEntry.FileSize];
64 zipFile.ExtractFile(zipFileEntry, buffer);
65 return new MemoryStream(buffer);
69 public override bool DirectoryExists(
string url)
72 throw new ArgumentNullException(
"url");
75 if (!url.EndsWith(
"/"))
78 return zipFileEntries.Any(x => x.Key.StartsWith(url));
81 public override bool FileExists(
string url)
83 return zipFileEntries.ContainsKey(url);
86 public override long FileSize(
string url)
88 ZipFileEntry zipFileEntry;
89 if (!zipFileEntries.TryGetValue(url, out zipFileEntry))
90 throw new FileNotFoundException(
"File not found inside ZIP archive.");
92 return zipFileEntry.FileSize;
95 public override string[] ListFiles(
string url,
string searchPattern,
VirtualSearchOption searchOption)
97 url = Regex.Escape(url);
98 searchPattern = Regex.Escape(searchPattern).
Replace(
@"\*",
"[^/]*").Replace(
@"\?",
"[^/]");
99 var recursivePattern = searchOption == VirtualSearchOption.AllDirectories ?
"(.*/)*" :
"/?";
100 var regex =
new Regex(
"^" + url + recursivePattern + searchPattern +
"$");
102 return zipFileEntries.Keys.Where(x => regex.IsMatch(x)).ToArray();
System.IO.FileMode FileMode
VirtualFileShare
File share capabilities, equivalent of System.IO.FileShare.
VirtualFileAccess
File access equivalent of System.IO.FileAccess.
VirtualFileMode
File mode equivalent of System.IO.FileMode.
Compression
Compression method enumeration
StreamFlags
Describes the different type of streams.