@@ -140,7 +140,7 @@ private PboFsFolder CreateOrFindDirectoryRecursive(string fullPath)
140140 if ( foundNode == null )
141141 {
142142 folder = new PboFsFolder ( folderName , currentFolder ) ;
143- fileTree . AddNode ( currentPath , folder ) ;
143+ fileTree . AddNode ( folder ) ;
144144 }
145145 else
146146 {
@@ -175,16 +175,17 @@ public NtStatus CreateFile(string filename, FileAccess access, System.IO.FileSha
175175 case FileMode . OpenOrCreate :
176176 if ( filename . Length == 0 )
177177 return NtStatus . Success ;
178- var Directory = filename . Substring ( 0 , filename . LastIndexOf ( '\\ ' ) ) ;
179- if ( Directory . Length == 0 )
180- Directory = "\\ " ;
178+ string Directory = filename ;
179+ if ( ! info . IsDirectory ) //Directory doesn't have a filename that we want to cut off
180+ {
181+ Directory = filename . Substring ( 0 , filename . LastIndexOf ( '\\ ' ) ) ;
182+ if ( Directory . Length == 0 )
183+ Directory = "\\ " ;
184+ }
185+
181186
182187 var nodeDirectory = CreateOrFindDirectoryRecursive ( Directory ) ;
183188
184- //Filename without folder path
185- var FileNameDirect = filename . Substring ( filename . LastIndexOf ( '\\ ' ) ) ;
186- var FileNameDirectNoLeadingSlash = filename . Substring ( filename . LastIndexOf ( '\\ ' ) + 1 ) ;
187-
188189 if ( ! ( nodeDirectory is PboFsRealFolder ) && nodeDirectory is PboFsFolder virtualFolder )
189190 {
190191 nodeDirectory = fileTree . MakeDirectoryWriteable ( virtualFolder ) ;
@@ -195,16 +196,16 @@ public NtStatus CreateFile(string filename, FileAccess access, System.IO.FileSha
195196
196197 if ( info . IsDirectory )
197198 {
198- System . IO . Directory . CreateDirectory ( folder . path + FileNameDirect ) ; //#TODO create directory recursively if needed
199-
200- var rlFolder = new PboFsRealFolder ( FileNameDirectNoLeadingSlash , folder . path + FileNameDirect , folder ) ;
201-
202- folder . Children [ FileNameDirectNoLeadingSlash . ToLower ( ) ] = rlFolder ;
203- fileTree . AddNode ( filename . ToLower ( ) , rlFolder ) ;
204- info . Context = rlFolder ;
199+ info . Context = nodeDirectory ;
200+ //Nothing else to do as full path is already included in DirectoryPath
205201 }
206202 else
207203 {
204+
205+ //Filename without folder path
206+ var FileNameDirect = filename . Substring ( filename . LastIndexOf ( '\\ ' ) ) ;
207+ var FileNameDirectNoLeadingSlash = filename . Substring ( filename . LastIndexOf ( '\\ ' ) + 1 ) ;
208+
208209 FileStream newStream = null ;
209210 try
210211 {
@@ -219,7 +220,7 @@ public NtStatus CreateFile(string filename, FileAccess access, System.IO.FileSha
219220 var rlFile = new PboFsRealFile ( new System . IO . FileInfo ( folder . path + FileNameDirect ) , folder , newStream ) ;
220221
221222 folder . Children [ FileNameDirectNoLeadingSlash . ToLower ( ) ] = rlFile ;
222- fileTree . AddNode ( filename . ToLower ( ) , rlFile ) ;
223+ fileTree . AddNode ( rlFile ) ;
223224 info . Context = rlFile ;
224225 }
225226
@@ -262,16 +263,16 @@ public NtStatus CreateFile(string filename, FileAccess access, System.IO.FileSha
262263 return DokanResult . AccessDenied ;
263264
264265 if ( node is IPboFsFile file && ( wantsRead || wantsWrite ) )
265- return file . Open ( wantsWrite ) ;
266+ return file . Open ( wantsWrite , mode ) ;
266267
267268 return DokanResult . Success ;
268269 }
269270
270271 public NtStatus DeleteDirectory ( string filename , DokanFileInfo info )
271272 {
272273 //This is called after Windows asked the user for confirmation.
273-
274- if ( ! ( GetNodeFast ( filename , info ) is PboFsRealFolder folder ) ) return DokanResult . NotImplemented ;
274+ var gnf = GetNodeFast ( filename , info ) ;
275+ if ( ! ( gnf is PboFsRealFolder folder ) ) return DokanResult . NotImplemented ;
275276
276277 try
277278 {
@@ -415,14 +416,15 @@ public NtStatus MoveFile(string filename, string newname, bool replace, DokanFil
415416 nodeTargetDirectory . Children . Add ( targetFilenameDirect . ToLower ( ) , nodeSourceDirectory . Children [ sourceFilenameDirect . ToLower ( ) ] ) ;
416417 nodeSourceDirectory . Children . Remove ( sourceFilenameDirect . ToLower ( ) ) ;
417418
418-
419- fileTree . AddNode ( PrefixedFilename ( newname ) , file ) ;
420- fileTree . DeleteNode ( PrefixedFilename ( filename ) ) ;
419+ fileTree . DeleteNode ( file ) ;
421420
422421 System . IO . File . Move ( file . GetRealPath ( ) , fileTree . writeableDirectory + newname ) ;
423422
424423 file . file = new FileInfo ( fileTree . writeableDirectory + newname ) ;
425424 file . FileInformation . FileName = targetFilenameDirect ;
425+ file . parent = nodeTargetDirectory ;
426+
427+ fileTree . AddNode ( file ) ;
426428
427429 return DokanResult . Success ;
428430 case PboFsRealFolder folder :
@@ -433,26 +435,48 @@ public NtStatus MoveFile(string filename, string newname, bool replace, DokanFil
433435 nodeTargetDirectory . Children . Add ( targetFilenameDirect . ToLower ( ) , nodeSourceDirectory . Children [ sourceFilenameDirect . ToLower ( ) ] ) ;
434436 nodeSourceDirectory . Children . Remove ( sourceFilenameDirect . ToLower ( ) ) ;
435437
436- fileTree . AddNode ( PrefixedFilename ( newname ) , folder ) ;
437- fileTree . DeleteNode ( PrefixedFilename ( filename ) ) ;
438-
439- System . IO . Directory . Move ( folder . path , fileTree . writeableDirectory + newname ) ;
440- folder . path = fileTree . writeableDirectory + newname ;
441- folder . FileInformation . FileName = targetFilenameDirect ;
442438
443- void moveNodesRecursive ( PboFsFolder folderIn , string basePath )
439+ void doNodesRecursive ( PboFsFolder folderIn , bool remove )
444440 {
445441 foreach ( var entry in folderIn . Children )
446442 {
447- var curFullPath = basePath + "\\ " + entry . Key ;
448- fileTree . AddNode ( newname + curFullPath . Substring ( filename . Length ) , entry . Value ) ;
449- fileTree . DeleteNode ( curFullPath ) ;
443+ if ( remove )
444+ {
445+ fileTree . DeleteNode ( entry . Value ) ;
446+ if ( entry . Value is PboFsRealFile file )
447+ {
448+ file . Close ( ) ;
449+ }
450+ }
451+
452+ else
453+ {
454+ fileTree . AddNode ( entry . Value ) ;
455+ if ( entry . Value is PboFsRealFile file )
456+ {
457+ file . file = new FileInfo ( file . file . FullName . Replace ( filename , newname ) ) ;
458+ }
459+
460+ }
461+
450462 if ( entry . Value is PboFsFolder nextFolder )
451- moveNodesRecursive ( nextFolder , curFullPath ) ;
463+ doNodesRecursive ( nextFolder , remove ) ;
452464 }
453465 }
454466
455- moveNodesRecursive ( folder , filename ) ;
467+
468+
469+ fileTree . DeleteNode ( folder ) ;
470+ doNodesRecursive ( folder , true ) ;
471+
472+ System . IO . Directory . Move ( folder . path , fileTree . writeableDirectory + newname ) ;
473+ folder . path = fileTree . writeableDirectory + newname ;
474+ folder . FileInformation . FileName = targetFilenameDirect ;
475+ folder . parent = nodeTargetDirectory ;
476+
477+ fileTree . AddNode ( folder ) ;
478+
479+ doNodesRecursive ( folder , false ) ;
456480
457481 return DokanResult . Success ;
458482 default :
0 commit comments