Skip to content

Commit c70f9e0

Browse files
Merge pull request #16 from andreaskueffel/development
add try catch for nonexistent folders/paths
2 parents dccbe44 + 4638847 commit c70f9e0

3 files changed

Lines changed: 42 additions & 24 deletions

File tree

FileSyncLibNet/AccessProviders/FileIoAccessProvider.cs

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using FileSyncLibNet.Commons;
2+
using Microsoft.Extensions.Logging;
23
using System;
34
using System.Collections.Generic;
45
using System.IO;
@@ -9,8 +10,10 @@ namespace FileSyncLibNet.AccessProviders
910
internal class FileIoAccessProvider : IAccessProvider
1011
{
1112
public string AccessPath { get; private set; }
12-
public FileIoAccessProvider()
13+
private readonly ILogger logger;
14+
public FileIoAccessProvider(ILogger logger)
1315
{
16+
this.logger = logger;
1417
}
1518
public void UpdateAccessPath(string accessPath)
1619
{
@@ -39,14 +42,20 @@ public List<FileInfo2> GetFiles(DateTime minimumLastWriteTime, string pattern, s
3942
List<FileInfo2> ret_val = new List<FileInfo2>();
4043
foreach (var dir in (subfolders != null && subfolders.Count > 0) ? _di.GetDirectories() : new[] { _di })
4144
{
42-
if (subfolders != null && subfolders.Count > 0 && !subfolders.Select(x => x.ToLower()).Contains(dir.Name.ToLower()))
43-
continue;
44-
var _fi = dir.EnumerateFiles(
45-
searchPattern: pattern,
46-
searchOption: recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
45+
try
46+
{
47+
if (subfolders != null && subfolders.Count > 0 && !subfolders.Select(x => x.ToLower()).Contains(dir.Name.ToLower()))
48+
continue;
49+
var _fi = dir.EnumerateFiles(
50+
searchPattern: pattern,
51+
searchOption: recursive ? SearchOption.AllDirectories : SearchOption.TopDirectoryOnly);
4752

4853

49-
ret_val.AddRange(_fi.Select(x => new FileInfo2(x.FullName.Substring(AccessPath.Length + 1), x.Exists) { Length = x.Length, LastWriteTime = x.LastWriteTime }).ToList());
54+
ret_val.AddRange(_fi.Select(x => new FileInfo2(x.FullName.Substring(AccessPath.Length + 1), x.Exists) { Length = x.Length, LastWriteTime = x.LastWriteTime }).ToList());
55+
}
56+
catch (Exception exc) {
57+
logger?.LogError(exc, "exception in GetFiles for path {A}, dir {B}", path, dir);
58+
}
5059
}
5160
return ret_val;
5261
}

FileSyncLibNet/AccessProviders/ScpAccessProvider.cs

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using FileSyncLibNet.Commons;
2+
using Microsoft.Extensions.Logging;
23
using Renci.SshNet;
34
using System;
45
using System.Collections.Generic;
@@ -15,13 +16,14 @@ internal class ScpAccessProvider : IAccessProvider
1516
NetworkCredential Credentials { get; }
1617
SftpClient ftpClient;
1718
public string AccessPath { get; private set; }
18-
19-
public ScpAccessProvider(NetworkCredential credentials)
19+
private readonly ILogger logger;
20+
public ScpAccessProvider(NetworkCredential credentials, ILogger logger)
2021
{
22+
this.logger = logger;
2123
Credentials = credentials;
2224
}
23-
public void UpdateAccessPath(string accessPath)
24-
{
25+
public void UpdateAccessPath(string accessPath)
26+
{
2527
AccessPathUri = accessPath;
2628
var pattern = @"scp://(?:(?<user>[^@]+)@)?(?<host>[^:/]+)(?::(?<port>\d+))?(?<path>/.*)?";
2729
var match = Regex.Match(AccessPathUri, pattern);
@@ -62,7 +64,7 @@ void CreateClient()
6264
ftpClient = new SftpClient(host, port, Credentials.UserName, Credentials.Password);
6365
}
6466
}
65-
67+
6668
void EnsureConnected()
6769
{
6870
if (ftpClient == null)
@@ -130,6 +132,7 @@ public bool MatchesPattern(string fileName, string pattern)
130132

131133
public List<FileInfo2> GetFiles(DateTime minimumLastWriteTime, string pattern, string path = null, bool recursive = false, List<string> subfolders = null)
132134
{
135+
//add try catch for non existent folders
133136
EnsureConnected();
134137
string basePath = string.IsNullOrEmpty(path) ? AccessPath : path;
135138
List<FileInfo2> ret_val = new List<FileInfo2>();
@@ -143,17 +146,24 @@ public List<FileInfo2> GetFiles(DateTime minimumLastWriteTime, string pattern, s
143146
}
144147
else
145148
{
146-
var files = ftpClient.ListDirectory(basePath);
147-
if (recursive)
149+
try
148150
{
149-
foreach (var folder in files.Where(x => x.IsDirectory && !(x.Name == ".") && !(x.Name == "..")))
151+
var files = ftpClient.ListDirectory(basePath);
152+
if (recursive)
150153
{
151-
var subPath = System.IO.Path.Combine(folder.Name).Replace("\\", "/");
152-
ret_val.AddRange(GetFiles(minimumLastWriteTime, pattern, subPath, recursive));
154+
foreach (var folder in files.Where(x => x.IsDirectory && !(x.Name == ".") && !(x.Name == "..")))
155+
{
156+
var subPath = System.IO.Path.Combine(folder.Name).Replace("\\", "/");
157+
ret_val.AddRange(GetFiles(minimumLastWriteTime, pattern, subPath, recursive));
158+
}
153159
}
160+
ret_val.AddRange(files.Where(x => MatchesPattern(x.Name, pattern)).Where(x => x.LastWriteTime >= minimumLastWriteTime && !x.IsDirectory).Select(x =>
161+
new FileInfo2($"{basePath.Substring(AccessPath.Length + 1)}/{x.Name}", exists: true) { LastWriteTime = x.LastWriteTime, Length = x.Length }).ToList());
162+
}
163+
catch (Exception exc)
164+
{
165+
logger?.LogError(exc, "exception in GetFiles for path {A}, basePath {B}", path, basePath);
154166
}
155-
ret_val.AddRange(files.Where(x => MatchesPattern(x.Name, pattern)).Where(x => x.LastWriteTime >= minimumLastWriteTime && !x.IsDirectory).Select(x =>
156-
new FileInfo2($"{basePath.Substring(AccessPath.Length + 1)}/{x.Name}", exists: true) { LastWriteTime = x.LastWriteTime, Length = x.Length }).ToList());
157167
}
158168
return ret_val;
159169
}

FileSyncLibNet/SyncProviders/AbstractProvider.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,21 +18,20 @@ public AbstractProvider(IFileJobOptions jobOptions) : base(jobOptions)
1818
throw new ArgumentException("this instance has no information about syncing files, it has type " + JobOptions.GetType().ToString());
1919
if (syncJobOptions.SourcePath.StartsWith("scp:"))
2020
{
21-
SourceAccess = new ScpAccessProvider(syncJobOptions.Credentials);
22-
21+
SourceAccess = new ScpAccessProvider(syncJobOptions.Credentials, jobOptions.Logger);
2322
}
2423
else
2524
{
26-
SourceAccess = new FileIoAccessProvider();
25+
SourceAccess = new FileIoAccessProvider(jobOptions.Logger);
2726
}
2827
SourceAccess.UpdateAccessPath(syncJobOptions.SourcePath);
2928
if (syncJobOptions.DestinationPath.StartsWith("scp:"))
3029
{
31-
DestinationAccess = new ScpAccessProvider(syncJobOptions.Credentials);
30+
DestinationAccess = new ScpAccessProvider(syncJobOptions.Credentials, jobOptions.Logger);
3231
}
3332
else
3433
{
35-
DestinationAccess = new FileIoAccessProvider();
34+
DestinationAccess = new FileIoAccessProvider(jobOptions.Logger);
3635
}
3736

3837
}

0 commit comments

Comments
 (0)