44
55namespace SharpIDE . Application . Features . FileWatching ;
66
7- public class IdeFileOperationsService ( SharpIdeRootFolderModificationService rootFolderModificationService )
7+ public class IdeFileOperationsService ( SharpIdeRootFolderModificationService rootFolderModificationService , IdeFileExternalChangeHandler ideFileExternalChangeHandler )
88{
99 private readonly SharpIdeRootFolderModificationService _rootFolderModificationService = rootFolderModificationService ;
10+ private readonly IdeFileExternalChangeHandler _ideFileExternalChangeHandler = ideFileExternalChangeHandler ;
1011
1112 public async Task RenameDirectory ( SharpIdeFolder folder , string newDirectoryName )
1213 {
1314 var parentPath = Path . GetDirectoryName ( folder . Path ) ! ;
1415 var newDirectoryPath = Path . Combine ( parentPath , newDirectoryName ) ;
16+ using var _ = await _ideFileExternalChangeHandler . IdeChangeLock . LockAsync ( ) ;
1517 Directory . Move ( folder . Path , newDirectoryPath ) ;
1618 await _rootFolderModificationService . RenameDirectory ( folder , newDirectoryName ) ;
1719 }
1820
1921 public async Task CreateDirectory ( SharpIdeFolder parentFolder , string newDirectoryName )
2022 {
2123 var newDirectoryPath = Path . Combine ( parentFolder . ChildNodeBasePath , newDirectoryName ) ;
24+ using var _ = await _ideFileExternalChangeHandler . IdeChangeLock . LockAsync ( ) ;
2225 Directory . CreateDirectory ( newDirectoryPath ) ;
2326 await _rootFolderModificationService . AddDirectory ( parentFolder , newDirectoryName ) ;
2427 }
2528
2629 public async Task DeleteDirectory ( SharpIdeFolder folder )
2730 {
31+ using var _ = await _ideFileExternalChangeHandler . IdeChangeLock . LockAsync ( ) ;
2832 Directory . Delete ( folder . Path , true ) ;
2933 await _rootFolderModificationService . RemoveDirectory ( folder ) ;
3034 }
3135
3236 public async Task CopyDirectory ( SharpIdeFolder destinationParentFolder , string sourceDirectoryPath , string newDirectoryName )
3337 {
3438 var newDirectoryPath = Path . Combine ( destinationParentFolder . ChildNodeBasePath , newDirectoryName ) ;
39+ using var _ = await _ideFileExternalChangeHandler . IdeChangeLock . LockAsync ( ) ;
3540 CopyAll ( new DirectoryInfo ( sourceDirectoryPath ) , new DirectoryInfo ( newDirectoryPath ) ) ;
3641 await _rootFolderModificationService . AddDirectory ( destinationParentFolder , newDirectoryName ) ;
3742 return ;
@@ -55,12 +60,14 @@ static void CopyAll(DirectoryInfo source, DirectoryInfo target)
5560 public async Task MoveDirectory ( SharpIdeFolder destinationParentFolder , SharpIdeFolder folderToMove )
5661 {
5762 var newDirectoryPath = Path . Combine ( destinationParentFolder . ChildNodeBasePath , folderToMove . Name . Value ) ;
63+ using var _ = await _ideFileExternalChangeHandler . IdeChangeLock . LockAsync ( ) ;
5864 Directory . Move ( folderToMove . Path , newDirectoryPath ) ;
5965 await _rootFolderModificationService . MoveDirectory ( destinationParentFolder , folderToMove ) ;
6066 }
6167
6268 public async Task DeleteFile ( SharpIdeFile file )
6369 {
70+ using var _ = await _ideFileExternalChangeHandler . IdeChangeLock . LockAsync ( ) ;
6471 File . Delete ( file . Path ) ;
6572 await _rootFolderModificationService . RemoveFile ( file ) ;
6673 }
@@ -72,6 +79,7 @@ public async Task<SharpIdeFile> CreateCsFile(SharpIdeFolder parentFolder, string
7279 var className = Path . GetFileNameWithoutExtension ( newFileName ) ;
7380 var @namespace = NewFileTemplates . ComputeNamespace ( parentFolder ) ;
7481 var fileText = NewFileTemplates . CsharpFile ( className , @namespace , typeKeyword ) ;
82+ using var _ = await _ideFileExternalChangeHandler . IdeChangeLock . LockAsync ( ) ;
7583 await File . WriteAllTextAsync ( newFilePath , fileText ) ;
7684 var sharpIdeFile = await _rootFolderModificationService . CreateFile ( parentFolder , newFilePath , newFileName , fileText ) ;
7785 return sharpIdeFile ;
@@ -82,6 +90,7 @@ public async Task<SharpIdeFile> CopyFile(SharpIdeFolder destinationParentFolder,
8290 var newFilePath = Path . Combine ( destinationParentFolder . Path , newFileName ) ;
8391 if ( File . Exists ( newFilePath ) ) throw new InvalidOperationException ( $ "File { newFilePath } already exists.") ;
8492 var fileContents = await File . ReadAllTextAsync ( sourceFilePath ) ;
93+ using var _ = await _ideFileExternalChangeHandler . IdeChangeLock . LockAsync ( ) ;
8594 File . Copy ( sourceFilePath , newFilePath ) ;
8695 var sharpIdeFile = await _rootFolderModificationService . CreateFile ( destinationParentFolder , newFilePath , newFileName , fileContents ) ;
8796 return sharpIdeFile ;
@@ -92,6 +101,7 @@ public async Task<SharpIdeFile> RenameFile(SharpIdeFile file, string newFileName
92101 var parentPath = Path . GetDirectoryName ( file . Path ) ! ;
93102 var newFilePath = Path . Combine ( parentPath , newFileName ) ;
94103 if ( File . Exists ( newFilePath ) ) throw new InvalidOperationException ( $ "File { newFilePath } already exists.") ;
104+ using var _ = await _ideFileExternalChangeHandler . IdeChangeLock . LockAsync ( ) ;
95105 File . Move ( file . Path , newFilePath ) ;
96106 var sharpIdeFile = await _rootFolderModificationService . RenameFile ( file , newFileName ) ;
97107 return sharpIdeFile ;
@@ -101,6 +111,7 @@ public async Task<SharpIdeFile> MoveFile(SharpIdeFolder destinationParentFolder,
101111 {
102112 var newFilePath = Path . Combine ( destinationParentFolder . ChildNodeBasePath , fileToMove . Name . Value ) ;
103113 if ( File . Exists ( newFilePath ) ) throw new InvalidOperationException ( $ "File { newFilePath } already exists.") ;
114+ using var _ = await _ideFileExternalChangeHandler . IdeChangeLock . LockAsync ( ) ;
104115 File . Move ( fileToMove . Path , newFilePath ) ;
105116 var sharpIdeFile = await _rootFolderModificationService . MoveFile ( destinationParentFolder , fileToMove ) ;
106117 return sharpIdeFile ;
0 commit comments