public void LoadImages() { Images.Clear(); var bigImageFolder = new StorageDirectory(_root.RelativePathParts.Merge(ImageSource.BigImageFolderName)); if (!bigImageFolder.ExistsLocal()) return; foreach (var file in bigImageFolder.GetLocalFiles().Where(file => file.Extension == ImageSource.ImageFileExtension)) { var imageSource = ImageSource.FromFolder(_root, Path.GetFileNameWithoutExtension(file.LocalPath)); if (imageSource != null) Images.Add(imageSource); } }
public IEnumerable <StorageFile> GetLocalFiles(Func <string, bool> filter = null, bool recursive = false) { if (filter == null) { filter = item => true; } var items = new List <StorageFile>(); if (recursive) { foreach (var directoryPath in Directory.GetDirectories(LocalPath)) { var subDirectory = new StorageDirectory(RelativePathParts.Merge(Path.GetFileName(directoryPath))); items.AddRange(subDirectory.GetLocalFiles(filter, true)); } } items.AddRange(Directory.GetFiles(LocalPath) .Where(filePath => filter(Path.GetFileName(filePath))) .Select(filePath => new StorageFile(RelativePathParts.Merge(Path.GetFileName(filePath))))); return(items); }
private async Task Download(string targetPath) { if (FileStorageManager.Instance.DataState == DataActualityState.Updated || FileStorageManager.Instance.UseLocalMode) { return; } var filter = new Func <string, bool>( itemName => itemName.StartsWith(String.Format("{0}.", Name), StringComparison.OrdinalIgnoreCase)); var existedFiles = (_parentFoder.ExistsLocal() ? _parentFoder.GetLocalFiles(filter).ToArray() : new StorageFile[] { }).ToList(); var archivePartFiles = (await _parentFoder.GetRemoteFiles(filter)).ToList(); var successfullyExtracted = true; do { if (existedFiles.Count != archivePartFiles.Count || !existedFiles.All(exsited => archivePartFiles.Any(actual => actual.Name == exsited.Name)) || !successfullyExtracted) { existedFiles.ForEach(file => { try { if (File.Exists(file.LocalPath)) { File.Delete(file.LocalPath); } } catch { } }); } var isOutdated = false; foreach (var archivePartFile in archivePartFiles) { var fileOutDated = await archivePartFile.IsOutOfDate(true); isOutdated |= fileOutDated; if (fileOutDated) { await archivePartFile.Download(true); } } if (isOutdated || !TargetExists(targetPath)) { var fileStreams = new List <FileStream>(); try { Cleanup(targetPath); Int64 alreadyRead = 0; var contentLenght = archivePartFiles.Sum(s => new FileInfo(s.LocalPath).Length); fileStreams.AddRange(archivePartFiles.Select(s => s.LocalPath).Select(File.OpenRead).ToList()); using (var reader = RarReader.Open(fileStreams)) { while (reader.MoveToNextEntry()) { alreadyRead += reader.Entry.CompressedSize; reader.WriteEntryToDirectory(targetPath, new ExtractionOptions { ExtractFullPath = true, Overwrite = true }); FileStorageManager.Instance.ShowExtractionProgress(new FileProcessingProgressEventArgs(NameOnly, contentLenght, alreadyRead)); } FileStorageManager.Instance.ShowExtractionProgress(new FileProcessingProgressEventArgs(NameOnly, 100, 100)); } successfullyExtracted = TargetExists(targetPath); } catch { successfullyExtracted = false; } finally { try { foreach (var fileStream in fileStreams) { fileStream.Close(); fileStream.Dispose(); } } catch { } fileStreams.Clear(); } } } while (!successfullyExtracted); }
public IEnumerable<StorageFile> GetLocalFiles(Func<string, bool> filter = null, bool recursive = false) { if (filter == null) filter = item => true; var items = new List<StorageFile>(); if (recursive) { foreach (var directoryPath in Directory.GetDirectories(LocalPath)) { var subDirectory = new StorageDirectory(RelativePathParts.Merge(Path.GetFileName(directoryPath))); items.AddRange(subDirectory.GetLocalFiles(filter, true)); } } items.AddRange(Directory.GetFiles(LocalPath) .Where(filePath => filter(Path.GetFileName(filePath))) .Select(filePath => new StorageFile(RelativePathParts.Merge(Path.GetFileName(filePath))))); return items; }