@@ -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