@@ -40,6 +40,8 @@ internal static class Global
4040 public static bool UseIdlePriority = false ;
4141 public static bool ShowErrorAlerts = true ;
4242
43+ public static int RetryCountOnSrcFileOpenError = 10 ;
44+
4345 public static long MaxFileSizeMB = 2048 ;
4446
4547
@@ -152,6 +154,7 @@ private static void Main()
152154
153155
154156 Global . MaxFileSizeMB = fileConfig . GetLong ( "MaxFileSizeMB" ) ?? Global . MaxFileSizeMB ;
157+ Global . RetryCountOnSrcFileOpenError = ( int ? ) fileConfig . GetLong ( "RetryCountOnSrcFileOpenError" ) ?? Global . RetryCountOnSrcFileOpenError ;
155158
156159
157160 Global . Bidirectional = fileConfig . GetTextUpper ( "Bidirectional" ) != "FALSE" ; //default is true
@@ -257,7 +260,7 @@ private static async Task MainTask()
257260 watch . Start ( ) ;
258261
259262
260- var messageContext = new Context (
263+ var initialSyncMessageContext = new Context (
261264 eventObj : null ,
262265 token : Global . CancellationToken . Token ,
263266 isSyncPath : false , //unused here
@@ -267,16 +270,16 @@ private static async Task MainTask()
267270
268271 BackgroundTaskManager . Run ( async ( ) =>
269272 {
270- await ConsoleWatch . AddMessage ( ConsoleColor . White , "Doing initial synchronisation..." , messageContext ) ;
273+ await ConsoleWatch . AddMessage ( ConsoleColor . White , "Doing initial synchronisation..." , initialSyncMessageContext ) ;
271274
272- await ScanFolders ( isInitialScan : true ) ;
275+ await ScanFolders ( initialSyncMessageContext : initialSyncMessageContext ) ;
273276
274277 BackgroundTaskManager . Run ( async ( ) =>
275278 {
276279 await InitialSyncCountdownEvent . WaitAsync ( Global . CancellationToken . Token ) ;
277280
278281 //if (!Global.CancellationToken.IsCancellationRequested)
279- await ConsoleWatch . AddMessage ( ConsoleColor . White , "Done initial synchronisation..." , messageContext ) ;
282+ await ConsoleWatch . AddMessage ( ConsoleColor . White , "Done initial synchronisation..." , initialSyncMessageContext ) ;
280283 } ) ;
281284
282285 } ) ; //BackgroundTaskManager.Run(async () =>
@@ -306,27 +309,27 @@ private static async Task MainTask()
306309
307310 private static readonly AsyncCountdownEvent InitialSyncCountdownEvent = new AsyncCountdownEvent ( 1 ) ;
308311
309- private static async Task ScanFolders ( bool isInitialScan )
312+ private static async Task ScanFolders ( Context initialSyncMessageContext )
310313 {
311314 //1. Do initial synchronisation from sync to async folder //TODO: config for enabling and ordering of this operation
312- await ScanFolder ( Global . SyncPath , "*.*" , isInitialScan : isInitialScan ) ; //NB! use *.* in order to sync resx files also
315+ await ScanFolder ( Global . SyncPath , "*.*" , initialSyncMessageContext : initialSyncMessageContext ) ; //NB! use *.* in order to sync resx files also
313316
314317 if ( Global . Bidirectional )
315318 {
316319 //2. Do initial synchronisation from async to sync folder //TODO: config for enabling and ordering of this operation
317- await ScanFolder ( Global . AsyncPath , "*.*" , isInitialScan : isInitialScan ) ; //NB! use *.* in order to sync resx files also
320+ await ScanFolder ( Global . AsyncPath , "*.*" , initialSyncMessageContext : initialSyncMessageContext ) ; //NB! use *.* in order to sync resx files also
318321 }
319322
320- if ( isInitialScan )
323+ if ( initialSyncMessageContext ? . IsInitialScan == true )
321324 InitialSyncCountdownEvent . Signal ( ) ;
322325 }
323326
324- private static async Task ScanFolder ( string path , string extension , bool isInitialScan )
327+ private static async Task ScanFolder ( string path , string extension , Context initialSyncMessageContext )
325328 {
326- var fileInfos = ProcessSubDirs ( new DirectoryInfo ( Extensions . GetLongPath ( path ) ) , extension ) ;
329+ var fileInfos = ProcessSubDirs ( new DirectoryInfo ( Extensions . GetLongPath ( path ) ) , extension , initialSyncMessageContext : initialSyncMessageContext ) ;
327330 await fileInfos . ForEachAsync ( fileInfo =>
328331 {
329- if ( isInitialScan )
332+ if ( initialSyncMessageContext ? . IsInitialScan == true )
330333 InitialSyncCountdownEvent . AddCount ( ) ;
331334
332335 BackgroundTaskManager . Run ( async ( ) =>
@@ -335,19 +338,25 @@ await ConsoleWatch.OnAddedAsync
335338 (
336339 new DummyFileSystemEvent ( fileInfo ) ,
337340 Global . CancellationToken . Token ,
338- isInitialScan
341+ initialSyncMessageContext ? . IsInitialScan == true
339342 ) ;
340343
341- if ( isInitialScan )
344+ if ( initialSyncMessageContext ? . IsInitialScan == true )
342345 InitialSyncCountdownEvent . Signal ( ) ;
343346 } ) ;
344347 } ) ;
345348 }
346349
347- private static IAsyncEnumerable < FileInfo > ProcessSubDirs ( DirectoryInfo srcDirInfo , string searchPattern , int recursionLevel = 0 )
350+ private static IAsyncEnumerable < FileInfo > ProcessSubDirs ( DirectoryInfo srcDirInfo , string searchPattern , int recursionLevel = 0 , Context initialSyncMessageContext = null )
348351 {
349352 return new AsyncEnumerable < FileInfo > ( async yield => {
350353
354+ #if DEBUG && false
355+ if ( initialSyncMessageContext ? . IsInitialScan == true )
356+ await ConsoleWatch . AddMessage ( ConsoleColor . Blue , "Scanning folder " + Extensions . GetLongPath ( srcDirInfo . FullName ) , initialSyncMessageContext ) ;
357+ #endif
358+
359+
351360#if false //this built-in functio will throw IOException in case some subfolder is an invalid reparse point
352361 return new DirectoryInfo ( sourceDir )
353362 . GetFiles ( searchPattern , SearchOption . AllDirectories ) ;
@@ -417,7 +426,7 @@ private static IAsyncEnumerable<FileInfo> ProcessSubDirs(DirectoryInfo srcDirInf
417426 }
418427
419428
420- var subDirFileInfos = ProcessSubDirs ( dirInfo , searchPattern , recursionLevel + 1 ) ;
429+ var subDirFileInfos = ProcessSubDirs ( dirInfo , searchPattern , recursionLevel + 1 , initialSyncMessageContext : initialSyncMessageContext ) ;
421430 await subDirFileInfos . ForEachAsync ( async subDirFileInfo =>
422431 {
423432 await yield . ReturnAsync ( subDirFileInfo ) ;
@@ -926,10 +935,13 @@ public static async Task FileUpdated(Context context)
926935 Tuple < byte [ ] , long > fileDataTuple = null ;
927936 try
928937 {
929- fileDataTuple = await FileExtensions . ReadAllBytesAsync ( Extensions . GetLongPath ( context . Event . FullName ) , context . Token ) ;
938+ fileDataTuple = await FileExtensions . ReadAllBytesAsync ( Extensions . GetLongPath ( context . Event . FullName ) , context . Token , retryCount : Global . RetryCountOnSrcFileOpenError ) ;
930939 if ( fileDataTuple . Item1 == null ) //maximum length exceeded
931940 {
932- await AddMessage ( ConsoleColor . Red , $ "Error synchronising updates from file { context . Event . FullName } : fileLength > maxFileSize : { fileDataTuple . Item2 } > { maxFileSize } ", context ) ;
941+ if ( fileDataTuple . Item2 >= 0 )
942+ await AddMessage ( ConsoleColor . Red , $ "Error synchronising updates from file { context . Event . FullName } : fileLength > maxFileSize : { fileDataTuple . Item2 } > { maxFileSize } ", context ) ;
943+ else
944+ await AddMessage ( ConsoleColor . Red , $ "Error synchronising updates from file { context . Event . FullName } ", context ) ;
933945
934946 return ; //TODO: log error?
935947 }
0 commit comments