Skip to content

Commit 962b7f2

Browse files
improve logging and directory creation in SmbLibProvider
1 parent dd5220a commit 962b7f2

2 files changed

Lines changed: 44 additions & 13 deletions

File tree

FileSyncLibNet/FileSyncJob/FileSyncJob.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@ private void RunJobInterlocked()
110110
}
111111
catch (Exception exc)
112112
{
113+
options.Logger.LogError(exc, "JobError {0}", JobName);
113114
JobError?.Invoke(this, new FileSyncJobEventArgs(JobName, FileSyncJobStatus.Error, exc));
114115
}
115116
finally

FileSyncLibNet/SyncProviders/SmbLibProvider.cs

Lines changed: 43 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public override void SyncSourceToDest()
8484
if (jobOptions.RememberLastSync)
8585
{
8686
_fi = _fi.Where(x => x.LastWriteTime > (LastRun - jobOptions.Interval));
87-
LastRun = DateTimeOffset.Now;
87+
8888
}
8989
if (jobOptions.SyncDeleted)
9090
{
@@ -100,12 +100,12 @@ public override void SyncSourceToDest()
100100
{
101101
bool copy = false;
102102
var relativeFilename = f.FullName.Substring(Path.GetFullPath(jobOptions.SourcePath).Length);
103-
var remotefile = Path.Combine(DestinationPath, relativeFilename.TrimStart('\\', '/')).Replace('/', '\\');
103+
var remotefile = Path.Combine(DestinationPath, relativeFilename.TrimStart('\\', '/')).Replace('/', '\\').TrimStart('/');
104104
var exists = FileExists(remotefile, out long size);
105105
copy = !exists || size != f.Length;
106106
if (copy)
107107
{
108-
logger.LogDebug("Copy {A}", relativeFilename);
108+
logger.LogDebug("Copy {A} to {B}", f.FullName, remotefile);
109109
try
110110
{
111111
WriteFile(f.FullName, remotefile);
@@ -148,7 +148,7 @@ public override void SyncSourceToDest()
148148
}
149149

150150
Directory.CreateDirectory(jobOptions.DestinationPath);
151-
foreach(var subfolder in jobOptions.Subfolders)
151+
foreach (var subfolder in jobOptions.Subfolders)
152152
Directory.CreateDirectory(Path.Combine(jobOptions.DestinationPath, subfolder));
153153
DirectoryInfo _di = new DirectoryInfo(jobOptions.DestinationPath);
154154
foreach (var dir in JobOptions.Subfolders.Count > 0 ? _di.GetDirectories() : new[] { _di })
@@ -212,6 +212,7 @@ public override void SyncSourceToDest()
212212

213213
}
214214
sw.Stop();
215+
LastRun = DateTimeOffset.Now;
215216
logger.LogInformation("{A} files copied, {B} files skipped in {C}s", copied, skipped, sw.ElapsedMilliseconds / 1000.0);
216217
}
217218

@@ -247,7 +248,7 @@ public void ConnectToShare(string server, string shareName, string domain, strin
247248
}
248249

249250

250-
251+
251252
}
252253

253254
public void Dispose()
@@ -308,7 +309,15 @@ public void WriteFile(string localFilePath, string remoteFilePath)
308309
string createpath = "";
309310
for (int i = 0; i < paths.Length - 1; i++)
310311
{
312+
311313
createpath = Path.Combine(createpath, paths[i]);
314+
315+
createpath = createpath.Replace('/', '\\');
316+
var exists = DirExists(createpath);
317+
318+
if (exists)
319+
continue;
320+
logger.LogDebug("Create path {A}", createpath);
312321
status = fileStore.CreateFile(out fileHandle, out fileStatus, createpath, AccessMask.GENERIC_WRITE | AccessMask.SYNCHRONIZE, FileAttributes.Normal, ShareAccess.None, CreateDisposition.FILE_OPEN_IF, CreateOptions.FILE_DIRECTORY_FILE, null);
313322
if (status == NTStatus.STATUS_SUCCESS)
314323
{
@@ -385,7 +394,7 @@ List<string> ListFiles(string sourcePath, string sourcesubPath, bool recurse, Da
385394
{
386395
try
387396
{
388-
retval.AddRange(ListFiles(sourcePath,Path.Combine(sourcesubPath, file.FileName).Trim('\\'), recurse, maxAge, out int moreSkipped));
397+
retval.AddRange(ListFiles(sourcePath, Path.Combine(sourcesubPath, file.FileName).Trim('\\'), recurse, maxAge, out int moreSkipped));
389398
skipped += moreSkipped;
390399
}
391400
catch { }
@@ -410,6 +419,23 @@ List<string> ListFiles(string sourcePath, string sourcesubPath, bool recurse, Da
410419
return retval;
411420
}
412421

422+
bool DirExists(string filepathFromShare)
423+
{
424+
object directoryHandle;
425+
FileStatus fileStatus;
426+
var status = fileStore.CreateFile(out directoryHandle, out fileStatus, filepathFromShare.Trim('\\'), AccessMask.GENERIC_READ, FileAttributes.Normal, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, CreateOptions.FILE_DIRECTORY_FILE, null);
427+
if (status == NTStatus.STATUS_SUCCESS)
428+
{
429+
status = fileStore.GetFileInformation(out FileInformation result, directoryHandle, FileInformationClass.FileStandardInformation);
430+
431+
status = fileStore.CloseFile(directoryHandle);
432+
return true;
433+
}
434+
435+
return false;
436+
437+
}
438+
413439
bool FileExists(string filepathFromShare, out long size)
414440
{
415441
object directoryHandle;
@@ -430,19 +456,23 @@ void SetFileAttributes(string filepathFromShare, DateTime lastWriteTime, DateTim
430456
{
431457
object directoryHandle;
432458
FileStatus fileStatus;
433-
var status = fileStore.CreateFile(out directoryHandle, out fileStatus, filepathFromShare.Trim('\\'), AccessMask.GENERIC_READ, FileAttributes.Normal, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, CreateOptions.FILE_NON_DIRECTORY_FILE, null);
459+
//var status = fileStore.CreateFile(out directoryHandle, out fileStatus, filepathFromShare.Trim('\\'), AccessMask.GENERIC_READ, FileAttributes.Normal, ShareAccess.Read | ShareAccess.Write, CreateDisposition.FILE_OPEN, CreateOptions.FILE_NON_DIRECTORY_FILE, null);
460+
var status = fileStore.CreateFile(out directoryHandle, out fileStatus, filepathFromShare.Trim('\\'), AccessMask.GENERIC_READ | AccessMask.GENERIC_WRITE | AccessMask.SYNCHRONIZE, FileAttributes.Normal, ShareAccess.None, CreateDisposition.FILE_OPEN, CreateOptions.FILE_NON_DIRECTORY_FILE | CreateOptions.FILE_SYNCHRONOUS_IO_ALERT, null);
434461
if (status == NTStatus.STATUS_SUCCESS)
435462
{
436-
463+
437464
status = fileStore.GetFileInformation(out FileInformation result, directoryHandle, FileInformationClass.FileBasicInformation);
438-
(result as FileBasicInformation).LastWriteTime=lastWriteTime;
439-
(result as FileBasicInformation).CreationTime=createTime;
440-
(result as FileBasicInformation).ChangeTime=modifiedTime;
441-
(result as FileBasicInformation).LastAccessTime=accessTime;
465+
(result as FileBasicInformation).LastWriteTime = lastWriteTime;
466+
(result as FileBasicInformation).CreationTime = createTime;
467+
(result as FileBasicInformation).ChangeTime = modifiedTime;
468+
(result as FileBasicInformation).LastAccessTime = accessTime;
442469
status = fileStore.SetFileInformation(directoryHandle, result);
470+
if (status != NTStatus.STATUS_SUCCESS)
471+
throw new Exception("unable to set attributes - status " + status);
443472
status = fileStore.CloseFile(directoryHandle);
444473
}
445-
throw new Exception("unable to set attributes - status " + status);
474+
if (status != NTStatus.STATUS_SUCCESS)
475+
throw new Exception("unable to set attributes - status " + status);
446476

447477
}
448478
void GetFileAttributes(string filepathFromShare, out DateTime lastWriteTime, out DateTime createTime, out DateTime modifiedTime, out DateTime accessTime)

0 commit comments

Comments
 (0)