/// <summary> /// thông tin file từ cloud /// </summary> /// <returns></returns> private async Task <List <FileSyncInfo> > GetListFileFromCloud() { NLogManager.LogInfo("GetListFileFromCloud"); var cloudFiles = new List <FileSyncInfo>(); try { await foreach (var blobItem in _blobContainer.GetBlobsAsync()) { var fsi = new FileSyncInfo { Hash = GetHash(blobItem.Name + blobItem.Properties.ContentLength), FileName = blobItem.Name, Length = blobItem.Properties.ContentLength, LastModified = blobItem.Properties.LastModified != null ? blobItem.Properties.LastModified.Value.DateTime : new DateTime(1970, 1, 1), CreatedTime = blobItem.Properties.CreatedOn != null ? blobItem.Properties.CreatedOn.Value.DateTime : new DateTime(1970, 1, 1), }; cloudFiles.Add(fsi); } NLogManager.LogInfo(JsonConvert.SerializeObject(cloudFiles)); return(cloudFiles); } catch (Exception ex) { NLogManager.LogInfo(ex); return(cloudFiles); } }
public async Task <List <FileSyncInfo> > GetListFileFromCloud() { NLogManager.LogInfo("GetListFileFromCloud"); var cloudFiles = new List <FileSyncInfo>(); _settings = LoadConfig(); _blobContainer = GetBlobContainerV2(); await foreach (var blobItem in _blobContainer.GetBlobsAsync()) { var fsi = new FileSyncInfo { Hash = blobItem.GetHashCode(), FileName = blobItem.Name, Length = blobItem.Properties.ContentLength, LastModified = blobItem.Properties.LastModified != null ? blobItem.Properties.LastModified.Value.DateTime : new DateTime(1970, 1, 1), CreatedTime = blobItem.Properties.CreatedOn != null ? blobItem.Properties.CreatedOn.Value.DateTime : new DateTime(1970, 1, 1) }; cloudFiles.Add(fsi); } NLogManager.LogInfo(JsonConvert.SerializeObject(cloudFiles)); return(cloudFiles); }
public async Task <List <FileSyncInfo> > GetListFileFromCloud(string nameContainer, int idAppsetting, string connection_string) { NLogManager.LogInfo("GetListFileFromCloud"); var cloudFiles = new List <FileSyncInfo>(); //_settings = LoadConfig(); //var storageConnect = _settings.AppSettings.FirstOrDefault(x => x.IdAppSetting == idAppsetting); //if (storageConnect == null) // return null; var containers = await ListContainersAsync(connection_string); if (containers.Count() == 0) { return(null); } _blobContainer = GetBlobContainerV2(nameContainer, connection_string); var blobContainer = _blobContainer.GetBlobsAsync(); await foreach (var blobItem in blobContainer) { var fsi = new FileSyncInfo { Hash = blobItem.GetHashCode(), FileName = blobItem.Name, Length = blobItem.Properties.ContentLength, LastModified = blobItem.Properties.LastModified != null?blobItem.Properties.LastModified.Value.DateTime.AddHours(7) : new DateTime(1970, 1, 1), CreatedTime = blobItem.Properties.CreatedOn != null?blobItem.Properties.CreatedOn.Value.DateTime.AddHours(7) : new DateTime(1970, 1, 1) }; cloudFiles.Add(fsi); } NLogManager.LogInfo(JsonConvert.SerializeObject(cloudFiles)); return(cloudFiles); }
public static async Task Main(string[] args) { var parserResult = Parser.Default.ParseArguments <Options>(args); if (parserResult.Tag == ParserResultType.Parsed) { Options = ((Parsed <Options>)parserResult).Value; var appVersion = Assembly.GetEntryAssembly().GetCustomAttribute <AssemblyInformationalVersionAttribute>().InformationalVersion; WriteMessage("-------------------------------------------------"); WriteMessage($" Edi.AzureBlobSync {appVersion}"); WriteMessage($" OS Version: {Microsoft.DotNet.PlatformAbstractions.RuntimeEnvironment.OperatingSystemVersion}"); WriteMessage("-------------------------------------------------"); Console.WriteLine(); WriteMessage($"Container Name: {Options.ContainerName}", ConsoleColor.DarkCyan); WriteMessage($"Download Threads: {Options.MaxConcurrency}", ConsoleColor.DarkCyan); WriteMessage($"Local Path: {Options.LocalFolderPath}", ConsoleColor.DarkCyan); Console.WriteLine(); // 1. Get Azure Blob Files WriteMessage($"[{DateTime.Now}] Finding Files on Azure Blob Storage..."); BlobContainer = GetBlobContainer(); if (null == BlobContainer) { WriteMessage("ERROR: Can not get BlobContainer.", ConsoleColor.Red); Console.ReadKey(); return; } try { var cloudFiles = new List <FileSyncInfo>(); await foreach (var blobItem in BlobContainer.GetBlobsAsync()) { var fsi = new FileSyncInfo { FileName = blobItem.Name, Length = blobItem.Properties.ContentLength }; cloudFiles.Add(fsi); } WriteMessage($"{cloudFiles.Count} cloud file(s) found.", ConsoleColor.DarkGreen); // 2. Get Local Files if (!Directory.Exists(Options.LocalFolderPath)) { Directory.CreateDirectory(Options.LocalFolderPath); } var localFilePaths = Directory.GetFiles(Options.LocalFolderPath); var localFiles = localFilePaths.Select(filePath => new FileInfo(filePath)) .Select(fi => new FileSyncInfo { FileName = fi.Name, Length = fi.Length, }) .ToList(); WriteMessage($"{localFiles.Count} local file(s) found.", ConsoleColor.DarkGreen); // 3. Compare Files WriteMessage("Comparing file meta data..."); // Files in cloud but not in local var excepts = cloudFiles.Except(localFiles).ToList(); if (excepts.Any()) { WriteMessage($"{excepts.Count} new file(s) to download. [ENTER] to continue, other key to cancel.", ConsoleColor.DarkYellow); var k = Console.ReadKey(); Console.WriteLine(); if (k.Key == ConsoleKey.Enter) { // Download New Files using var concurrencySemaphore = new SemaphoreSlim(Options.MaxConcurrency); var downloadTask = new List <Task>(); foreach (var fileSyncInfo in excepts) { await concurrencySemaphore.WaitAsync(); //WriteMessage($"DEBUG: Concurrency Semaphore {concurrencySemaphore.CurrentCount} / {Options.MaxConcurrency}"); var t = Task.Run(async() => { try { await DownloadAsync(fileSyncInfo.FileName); } catch (Exception e) { WriteMessage(e.Message, ConsoleColor.Red); } finally { //WriteMessage($"DEBUG: Release concurrencySemaphore", ConsoleColor.DarkYellow); concurrencySemaphore.Release(); } }); // WriteMessage($"DEBUG: Added {fileSyncInfo.FileName} ({fileSyncInfo.Length} bytes) to download tasks.", ConsoleColor.DarkYellow); downloadTask.Add(t); } await Task.WhenAll(downloadTask); } } else { WriteMessage("No new files need to be downloaded."); } // 5. Ask Delete Old Files var localExcepts = localFiles.Except(cloudFiles).ToList(); var deleteCount = 0; if (localExcepts.Any()) { WriteMessage($"{localExcepts.Count} redundancy file(s) exists in local but not on cloud, [V] to view file list, [ENTER] to continue.", ConsoleColor.DarkYellow); var k = Console.ReadKey(); Console.WriteLine(); if (k.Key == ConsoleKey.V) { foreach (var f in localExcepts) { Console.WriteLine($"{f.FileName}\t{f.Length} bytes"); } } var k1 = Console.ReadKey(); Console.WriteLine(); if (k1.Key == ConsoleKey.Enter) { WriteMessage($"Do you want to delete these files? [Y/N]", ConsoleColor.DarkYellow); var k2 = Console.ReadKey(); Console.WriteLine(); if (k2.Key == ConsoleKey.Y) { WriteMessage("Deleting local redundancy files..."); foreach (var fi in localExcepts) { File.Delete(Path.Combine(Options.LocalFolderPath, fi.FileName)); deleteCount++; } } } } WriteMessage("----------------------------------------------------"); WriteMessage($"Local Files Up to Date. {excepts.Count} new file(s) downloaded, {deleteCount} file(s) deleted.", ConsoleColor.Green); } catch (Exception e) { WriteMessage(e.Message, ConsoleColor.Red); } } else { WriteMessage("ERROR: Failed to parse console parameters.", ConsoleColor.Red); } Console.ReadKey(); }