/// <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);
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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);
        }
Example #4
0
    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();
    }