Пример #1
0
        public override async Task <DexihFiles> GetFileEnumerator(FlatFile file, EFlatFilePath path, string searchPattern)
        {
            try
            {
                var files = new List <DexihFileProperties>();

                using (var client = await GetFtpClient())
                {
                    var fullDirectory    = GetFullPath(file, path);
                    var directoryListing = await client.GetListingAsync(fullDirectory);

                    foreach (var directoryItem in directoryListing)
                    {
                        if (directoryItem.Type == FtpFileSystemObjectType.File &&
                            (string.IsNullOrEmpty(searchPattern) || FitsMask(directoryItem.Name, searchPattern)))
                        {
                            files.Add(new DexihFileProperties()
                            {
                                FileName     = directoryItem.Name,
                                LastModified = directoryItem.Modified,
                                Length       = directoryItem.Size
                            });
                        }
                    }

                    var newFiles = new DexihFiles(files.ToArray());
                    return(newFiles);
                }
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred getting files from {path} with pattern {searchPattern}.  {ex.Message}", ex);
            }
        }
Пример #2
0
        public override async Task <bool> CreateDirectory(FlatFile file, EFlatFilePath path)
        {
            try
            {
                var directory = await GetDatabaseDirectory();

                var cloudFileDirectory = directory;

                if (file != null && !string.IsNullOrEmpty(file.FileRootPath))
                {
                    cloudFileDirectory = directory.GetDirectoryReference(file.FileRootPath);
                    await cloudFileDirectory.Container.CreateIfNotExistsAsync();
                }

                if (file != null && path != EFlatFilePath.None)
                {
                    cloudFileDirectory = cloudFileDirectory.GetDirectoryReference(file.GetPath(path));
                    await cloudFileDirectory.Container.CreateIfNotExistsAsync();
                }

                return(true);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Failed to create the directory for file  {file.Name} path {path}.  {ex.Message}", ex);
            }
        }
Пример #3
0
        public override async Task <bool> MoveFile(FlatFile file, EFlatFilePath fromDirectory, EFlatFilePath toDirectory, string fileName)
        {
            try
            {
                var    fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
                var    fileNameExtension        = Path.GetExtension(fileName);
                var    version = 0;
                string newFileName;

                var cloudFileDirectory = await GetFileDirectory(file);

                var cloudFromDirectory = cloudFileDirectory.GetDirectoryReference(file.GetPath(fromDirectory));
                var cloudToDirectory   = cloudFileDirectory.GetDirectoryReference(file.GetPath(toDirectory));

                CloudBlob sourceFile = cloudFromDirectory.GetBlockBlobReference(fileName);
                CloudBlob targetFile = cloudToDirectory.GetBlockBlobReference(fileName);

                while (await targetFile.ExistsAsync())
                {
                    version++;
                    newFileName = fileNameWithoutExtension + "_" + version.ToString() + fileNameExtension;
                    targetFile  = cloudToDirectory.GetBlockBlobReference(newFileName);
                }
                await targetFile.StartCopyAsync(sourceFile.Uri);

                await sourceFile.DeleteAsync();

                return(true);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Failed to move file {file.Name} filename {Filename} from {fromDirectory} to {toDirectory}.  {ex.Message}", ex);
            }
        }
Пример #4
0
        public override async Task <bool> SaveFileStream(FlatFile file, EFlatFilePath path, string fileName, Stream fileStream)
        {
            try
            {
                var    fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
                var    fileNameExtension        = Path.GetExtension(fileName);
                var    version = 0;
                string newFileName;

                var cloudFileDirectory = await GetFileDirectory(file);

                var cloudSubDirectory = cloudFileDirectory.GetDirectoryReference(file.GetPath(path));
                var cloudFile         = cloudSubDirectory.GetBlockBlobReference(fileName);

                while (await cloudFile.ExistsAsync())
                {
                    version++;
                    newFileName = fileNameWithoutExtension + "_" + version.ToString() + fileNameExtension;
                    cloudFile   = cloudSubDirectory.GetBlockBlobReference(newFileName);
                }

                await cloudFile.UploadFromStreamAsync(fileStream);

                fileStream.Dispose();
                return(true);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Failed save the file {file.Name} name {Filename} in path {path}.  {ex.Message}", ex);
            }
        }
Пример #5
0
        private Task <string> FixFileName(FlatFile file, EFlatFilePath path, string fileName)
        {
            var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
            var fileNameExtension        = Path.GetExtension(fileName);

            var version = 0;

            var fullPath = GetFullPath(file, path);


            var newFileName = fileName;

            using (var client = GetSftpClient())
            {
                while (client.Exists(CombinePath(fullPath, newFileName)))
                {
                    version++;
                    newFileName = fileNameWithoutExtension + "_" + version.ToString() + fileNameExtension;
                }

                var filePath = CombinePath(fullPath, newFileName);

                return(Task.FromResult(filePath));
            }
        }
Пример #6
0
        public override Task <DexihFiles> GetFileEnumerator(FlatFile file, EFlatFilePath path, string searchPattern)
        {
            try
            {
                var files = new List <DexihFileProperties>();

                var fullDirectory = GetFullPath(file, path);
                var filenames     = string.IsNullOrEmpty(searchPattern) ? Directory.GetFiles(fullDirectory) : Directory.GetFiles(fullDirectory, searchPattern);
                foreach (var fileName in filenames)
                {
                    var fileInfo = new FileInfo(fileName);
                    files.Add(new DexihFileProperties()
                    {
                        FileName = fileInfo.Name, LastModified = fileInfo.LastWriteTime, Length = fileInfo.Length
                    });
                }

                var newFiles = new DexihFiles(files.ToArray());
                return(Task.FromResult(newFiles));
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred getting files from {path} with pattern {searchPattern}.  {ex.Message}", ex);
            }
        }
Пример #7
0
        public override Task <DexihFiles> GetFileEnumerator(FlatFile file, EFlatFilePath path, string searchPattern)
        {
            try
            {
                var files = new List <DexihFileProperties>();

                using (var client = GetSftpClient())
                {
                    var fullDirectory    = GetFullPath(file, path);
                    var directoryListing = client.ListDirectory(fullDirectory);
                    foreach (var directoryItem in directoryListing)
                    {
                        if (directoryItem.IsRegularFile &&
                            (string.IsNullOrEmpty(searchPattern) || FitsMask(directoryItem.Name, searchPattern)))
                        {
                            files.Add(new DexihFileProperties()
                            {
                                FileName     = directoryItem.Name,
                                LastModified = directoryItem.LastWriteTime,
                                Length       = directoryItem.Length
                            });
                        }
                    }

                    var newFiles = new DexihFiles(files.ToArray());
                    return(Task.FromResult(newFiles));
                }
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred getting files from {path} with pattern {searchPattern}.  {ex.Message}", ex);
            }
        }
Пример #8
0
        private async Task <string> FixFileName(FlatFile file, EFlatFilePath path, string fileName)
        {
            var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
            var fileNameExtension        = Path.GetExtension(fileName);

            var version = 0;

            var fullPath = GetFullPath(file, path);


            var newFileName = fileName;

            using (var client = await GetFtpClient())
            {
                while (await client.FileExistsAsync(CombinePath(fullPath, newFileName)))
                {
                    version++;
                    newFileName = fileNameWithoutExtension + "_" + version.ToString() + fileNameExtension;
                }

                var filePath = CombinePath(fullPath, newFileName);

                return(filePath);
            }
        }
Пример #9
0
        public override Task <bool> CreateDirectory(FlatFile file, EFlatFilePath path)
        {
            try
            {
                var directory = FilePath();
                if (!Directory.Exists(directory))
                {
                    Directory.CreateDirectory(directory);
                }

                if (file != null && !string.IsNullOrEmpty(file.FileRootPath))
                {
                    directory = Path.Combine(FilePath(), file.FileRootPath);
                    if (!Directory.Exists(directory))
                    {
                        Directory.CreateDirectory(directory);
                    }
                }

                if (file != null && path != EFlatFilePath.None)
                {
                    directory = Path.Combine(directory, file.GetPath(path));
                    if (!Directory.Exists(directory))
                    {
                        Directory.CreateDirectory(directory);
                    }
                }

                return(Task.FromResult(true));
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred creating directory {path}.  {ex.Message}", ex);
            }
        }
Пример #10
0
        public override async Task <bool> MoveFile(FlatFile file, EFlatFilePath fromDirectory, EFlatFilePath toDirectory, string fileName)
        {
            try
            {
                var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
                var fileNameExtension        = Path.GetExtension(fileName);
                var version = 0;

                var newFileName       = fileName;
                var fullToDirectory   = GetFullPath(file, toDirectory);
                var fullFromDirectory = GetFullPath(file, fromDirectory);

                var createDirectoryResult = await CreateDirectory(file, toDirectory);

                if (!createDirectoryResult)
                {
                    return(false);
                }

                // if there is already a file with the same name on the target directory, add a version number until a unique name is found.
                while (File.Exists(Path.Combine(fullToDirectory, newFileName)))
                {
                    version++;
                    newFileName = fileNameWithoutExtension + "_" + version.ToString() + fileNameExtension;
                }

                File.Move(Path.Combine(fullFromDirectory, fileName), Path.Combine(fullToDirectory, newFileName));
                return(true);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred moving file {file.Name} from {fromDirectory} to {toDirectory}.  {ex.Message}", ex);
            }
        }
Пример #11
0
        public override string GetFullPath(FlatFile file, EFlatFilePath path)
        {
            var fullPath = Path.Combine(FilePath(), file.FileRootPath ?? "", file.GetPath(path));

            ValidatePath(fullPath);
            return(fullPath);
        }
Пример #12
0
 public override Task <bool> DeleteFile(FlatFile file, EFlatFilePath path, string fileName)
 {
     try
     {
         var fullDirectory = GetFullPath(file, path);
         File.Delete(Path.Combine(fullDirectory, fileName));
         return(Task.FromResult(true));
     }
     catch (Exception ex)
     {
         throw new ConnectionException($"Error occurred deleting file {file} at {path}.  {ex.Message}", ex);
     }
 }
Пример #13
0
 public override Task <Stream> GetReadFileStream(FlatFile file, EFlatFilePath path, string fileName)
 {
     try
     {
         var    fullDirectory = GetFullPath(file, path);
         Stream reader        = File.OpenRead(Path.Combine(fullDirectory, fileName));
         return(Task.FromResult(reader));
     }
     catch (Exception ex)
     {
         throw new ConnectionException($"Error occurred reading file {fileName} at {path}.  {ex.Message}", ex);
     }
 }
Пример #14
0
 public DownloadFilesTask(ISharedSettings sharedSettings, string messageId, long hubKey, ConnectionFlatFile connectionFlatFile,
                          FlatFile flatFile, EFlatFilePath path, string[] files, DownloadUrl downloadUrl, string connectionId, string reference)
 {
     _sharedSettings     = sharedSettings;
     _messageId          = messageId;
     _hubKey             = hubKey;
     _connectionFlatFile = connectionFlatFile;
     _flatFile           = flatFile;
     _path         = path;
     _files        = files;
     _downloadUrl  = downloadUrl;
     _connectionId = connectionId;
     _reference    = reference;
 }
Пример #15
0
 public override Task <Stream> GetReadFileStream(FlatFile file, EFlatFilePath path, string fileName)
 {
     try
     {
         var fullDirectory = GetFullPath(file, path);
         var client        = GetSftpClient();
         var reader        = client.OpenRead(CombinePath(fullDirectory, fileName));
         // var ftpStream = new SftpStream(reader, client);
         return(Task.FromResult <Stream>(reader));
     }
     catch (Exception ex)
     {
         throw new ConnectionException($"Error occurred reading file {fileName} at {path}.  {ex.Message}", ex);
     }
 }
Пример #16
0
        public override async Task <Stream> GetWriteFileStream(FlatFile file, EFlatFilePath path, string fileName)
        {
            try
            {
                var createDirectoryResult = await CreateDirectory(file, path);

                var    fullDirectory = GetFullPath(file, path);
                Stream reader        = File.OpenWrite(Path.Combine(fullDirectory, fileName));
                return(reader);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred writing file {fileName} at {path}.  {ex.Message}", ex);
            }
        }
Пример #17
0
        public override async Task <Stream> GetWriteFileStream(FlatFile file, EFlatFilePath path, string fileName)
        {
            try
            {
                var cloudFileDirectory = await GetFileDirectory(file);

                var    cloudSubDirectory = cloudFileDirectory.GetDirectoryReference(file.GetPath(path));
                Stream stream            = await cloudSubDirectory.GetBlockBlobReference(fileName).OpenWriteAsync();

                return(stream);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Failed write the file {file.Name} name {Filename} in path {path}.  {ex.Message}", ex);
            }
        }
Пример #18
0
        public override async Task <Stream> GetWriteFileStream(FlatFile file, EFlatFilePath path, string fileName)
        {
            try
            {
                await CreateDirectory(file, path);

                var client        = GetSftpClient();
                var fullDirectory = GetFullPath(file, path);
                var stream        = client.OpenWrite(fullDirectory + "/" + fileName);
                // var ftpStream = new SftpStream(stream, client);
                return(stream);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred writing file {fileName} at {path}.  {ex.Message}", ex);
            }
        }
Пример #19
0
        public override async Task <Stream> GetReadFileStream(FlatFile file, EFlatFilePath path, string fileName)
        {
            try
            {
                var fullDirectory = GetFullPath(file, path);
                var client        = await GetFtpClient();

                var reader = await client.OpenReadAsync(CombinePath(fullDirectory, fileName), FtpDataType.ASCII);

                var ftpStream = new FtpStream(reader, client);
                return(ftpStream);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred reading file {fileName} at {path}.  {ex.Message}", ex);
            }
        }
Пример #20
0
        public override async Task <bool> DeleteFile(FlatFile file, EFlatFilePath path, string fileName)
        {
            try
            {
                var cloudFileDirectory = await GetFileDirectory(file);

                var       cloudSubDirectory = cloudFileDirectory.GetDirectoryReference(file.GetPath(path));
                CloudBlob cloudFile         = cloudSubDirectory.GetBlockBlobReference(fileName);
                await cloudFile.DeleteAsync();

                return(true);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Failed to delete file {file.Name} filename {Filename} from {path}.  {ex.Message}", ex);
            }
        }
Пример #21
0
        public override async Task <bool> DeleteFile(FlatFile file, EFlatFilePath path, string fileName)
        {
            try
            {
                using (var client = await GetFtpClient())
                {
                    var fullDirectory = GetFullPath(file, path);
                    await client.DeleteFileAsync(CombinePath(fullDirectory, fileName));

                    return(true);
                }
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred deleting file {file} at {path}.  {ex.Message}", ex);
            }
        }
Пример #22
0
        public override string GetFullPath(FlatFile file, EFlatFilePath path)
        {
            var fullPath = _workingDirectory + "/" + DefaultDatabase;

            if (!string.IsNullOrEmpty(file.FileRootPath))
            {
                fullPath += "/" + file.FileRootPath;
            }

            var subPath = file.GetPath(path);

            if (!string.IsNullOrEmpty(subPath))
            {
                fullPath += "/" + subPath;
            }

            return(fullPath);
        }
Пример #23
0
        public override async Task <DexihFiles> GetFileEnumerator(FlatFile file, EFlatFilePath path, string searchPattern)
        {
            try
            {
                var files = new List <DexihFileProperties>();

                var cloudFileDirectory = await GetFileDirectory(file);

                var pathstring        = file.GetPath(path);
                var pathlength        = pathstring.Length + 1;
                var cloudSubDirectory = cloudFileDirectory.GetDirectoryReference(pathstring);

                BlobContinuationToken continuationToken = null;
                var list = new List <IListBlobItem>();
                do
                {
                    var filesList = await cloudSubDirectory.ListBlobsSegmentedAsync(false, BlobListingDetails.None, 500, continuationToken, null, null);

                    continuationToken = filesList.ContinuationToken;
                    list.AddRange(filesList.Results);
                } while (continuationToken != null);

                foreach (CloudBlob cloudFile in list)
                {
                    await cloudFile.FetchAttributesAsync();

                    var fileName = cloudFile.Name.Substring(pathlength);
                    if (string.IsNullOrEmpty(searchPattern) || FitsMask(file.Name, searchPattern))
                    {
                        files.Add(new DexihFileProperties()
                        {
                            FileName = fileName, LastModified = cloudFile.Properties.LastModified.Value.DateTime, Length = cloudFile.Properties.Length
                        });
                    }
                }
                var newFiles = new DexihFiles(files.ToArray());
                return(newFiles);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Failed get file {file.Name} files in path {path} with pattern {searchPattern}.  {ex.Message}", ex);
            }
        }
Пример #24
0
        public override async Task <bool> SaveFileStream(FlatFile file, EFlatFilePath path, string fileName, Stream stream)
        {
            try
            {
                var createDirectoryResult = await CreateDirectory(file, path);

                var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
                var fileNameExtension        = Path.GetExtension(fileName);

                if (fileNameExtension == ".zip")
                {
                    using (var archive = new ZipArchive(stream, ZipArchiveMode.Read))
                    {
                        foreach (var entry in archive.Entries)
                        {
                            var filePath = FixFileName(file, path, entry.Name);
                            entry.ExtractToFile(filePath);
                        }
                    }
                    return(true);
                }
                else
                {
                    var filePath = FixFileName(file, path, fileName);
                    var newFile  = new FileStream(filePath, FileMode.Create, System.IO.FileAccess.Write);
                    //stream.Seek(0, SeekOrigin.Begin);
                    await stream.CopyToAsync(newFile);

                    await stream.FlushAsync();

                    newFile.Dispose();

                    return(true);
                }
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred saving file stream of file {fileName} at {path}.  {ex.Message}", ex);
            }
        }
Пример #25
0
        private string FixFileName(FlatFile file, EFlatFilePath path, string fileName)
        {
            var fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName);
            var fileNameExtension        = Path.GetExtension(fileName);

            var version = 0;

            var fullPath = GetFullPath(file, path);


            var newFileName = fileName;

            while (File.Exists(Path.Combine(fullPath, newFileName)))
            {
                version++;
                newFileName = fileNameWithoutExtension + "_" + version.ToString() + fileNameExtension;
            }

            var filePath = Path.Combine(fullPath, newFileName);

            return(filePath);
        }
Пример #26
0
        public override Task <bool> CreateDirectory(FlatFile file, EFlatFilePath path)
        {
            try
            {
                using (var client = GetSftpClient())
                {
                    var directory = DefaultDatabase;

                    if (!client.Exists(directory))
                    {
                        client.CreateDirectory(directory);
                    }

                    if (file != null && !string.IsNullOrEmpty(file.FileRootPath))
                    {
                        directory = CombinePath(DefaultDatabase, file.FileRootPath);
                        if (!client.Exists(directory))
                        {
                            client.CreateDirectory(directory);
                        }
                    }

                    if (file != null && path != EFlatFilePath.None)
                    {
                        directory = CombinePath(directory, file.GetPath(path));
                        if (!client.Exists(directory))
                        {
                            client.CreateDirectory(directory);
                        }
                    }

                    return(Task.FromResult(true));
                }
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred creating directory {path}.  {ex.Message}", ex);
            }
        }
Пример #27
0
        public override async Task <bool> SaveFileStream(FlatFile file, EFlatFilePath path, string fileName, Stream stream)
        {
            try
            {
                await CreateDirectory(file, path);

                var filePath = await FixFileName(file, path, fileName);

                using (var client = GetSftpClient())
                {
                    var newFile = client.OpenWrite(filePath);
                    await stream.CopyToAsync(newFile);

                    await stream.FlushAsync();

                    return(true);
                }
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred saving file stream of file {fileName} at {path}.  {ex.Message}", ex);
            }
        }
Пример #28
0
        public async Task <Stream> DownloadFiles(FlatFile flatFile, EFlatFilePath path, string[] fileNames, bool zipFiles = false)
        {
            if (zipFiles)
            {
                var memoryStream = new MemoryStream();

                using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Update, true))
                {
                    foreach (var fileName in fileNames)
                    {
                        var fileStreamResult = await GetReadFileStream(flatFile, path, fileName);

                        var fileEntry = archive.CreateEntry(fileName);

                        using (var fileEntryStream = fileEntry.Open())
                        {
                            fileStreamResult.CopyTo(fileEntryStream);
                        }
                    }
                }

                memoryStream.Seek(0, SeekOrigin.Begin);
                return(memoryStream);
            }
            else
            {
                if (fileNames.Length == 1)
                {
                    return(await GetReadFileStream(flatFile, path, fileNames[0]));
                }
                else
                {
                    throw new ConnectionException("When downloading more than one file, the zip option must be set.");
                }
            }
        }
Пример #29
0
        public override Task <List <DexihFileProperties> > GetFileList(FlatFile file, EFlatFilePath path)
        {
            try
            {
                var files = new List <DexihFileProperties>();

                var fullDirectory = GetFullPath(file, path);
                foreach (var fileName in Directory.GetFiles(fullDirectory))
                {
                    var fileInfo    = new FileInfo(fileName);
                    var contentType = ""; //MimeMapping.GetMimeMapping(FilePath + Path.DirectorySeparatorChar+ MainDirectory + Path.DirectorySeparatorChar+ SubDirectory + Path.DirectorySeparatorChar+ File); //TODO add MimeMapping
                    files.Add(new DexihFileProperties()
                    {
                        FileName = fileInfo.Name, LastModified = fileInfo.LastWriteTime, Length = fileInfo.Length, ContentType = contentType
                    });
                }

                return(Task.FromResult(files));
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Error occurred getting filelist {path}.  {ex.Message}", ex);
            }
        }
Пример #30
0
        public override async Task <List <DexihFileProperties> > GetFileList(FlatFile file, EFlatFilePath path)
        {
            try
            {
                var files = new List <DexihFileProperties>();

                var cloudFileDirectory = await GetFileDirectory(file);

                var pathstring        = file.GetPath(path);
                var pathlength        = pathstring.Length + 1;
                var cloudSubDirectory = cloudFileDirectory.GetDirectoryReference(pathstring);

                BlobContinuationToken continuationToken = null;
                var list = new List <IListBlobItem>();
                do
                {
                    var filesList = await cloudSubDirectory.ListBlobsSegmentedAsync(true, BlobListingDetails.None, 500, continuationToken, null, null);

                    continuationToken = filesList.ContinuationToken;
                    list.AddRange(filesList.Results);
                } while (continuationToken != null);

                foreach (CloudBlob cloudFile in list)
                {
                    await cloudFile.FetchAttributesAsync();

                    var fileName = cloudFile.Name.Substring(pathlength);
                    files.Add(new DexihFileProperties()
                    {
                        FileName = fileName, LastModified = cloudFile.Properties.LastModified.Value.DateTime, Length = cloudFile.Properties.Length, ContentType = cloudFile.Properties.ContentType
                    });
                }
                return(files);
            }
            catch (Exception ex)
            {
                throw new ConnectionException($"Failed get filelist {file.Name} files in path {path}.  {ex.Message}", ex);
            }
        }